正文
1. TCP与UDP:
在网络体系结构中我们提过TCP/IP的四层网络层级:
而TCP(Transmisson Control Protocol,即传输控制协议)和UDP(User Datagram Protocol 即用户数据报协议)是在传输层的,所以我们知道UDP和TCP是用来传输数据的一种协议,为主机中不同进程提供通信,那既然是传输数据,我们举例以快递盒寄信的逻辑来说明。
TCP像快递,寄快递现在都有物流信息,最后是否签收了我的快递。如果丢件也会通知给你反馈。而UDP更像寄信,收不收得到我也不管。
对比与UDP,TCP的传输是可靠的、无差错的。
1.1 TCP通道的连接及断开
既然数据是从一个地方到另一个地方,我们要先建立一个通道,这样数据才能传输流动。
TCP三次握手,四次挥手,这个就是用来建立这个通道及断开通道。
三次握手:
- A发信息给B:你在不在啊?急事!!
- B发信息给A:我在啊,急事?那你快告诉我,我这边时刻听着你说。
不幸的是A这时候拉肚子,只能马上跑去厕所了,然后一拉就是半个小时,然后B就一直等了半个小时。
这时候你是不是发现了二次握手的问题了,如果第二次B发送给A的话后,A没有马上回相应的信息给B,B就可以认为A已经不在了,从而不再等它,也不建立通道。
所以应该是这样:
- A发信息给B:你在不在啊?急事!!
- B发信息给A:我在啊,急事?那你快告诉我,我这边时刻听着你说。
- A发信息给B:事情是这样的。你听我慢慢道来。
balabala.......
balabala.......
balabala.......
然后A和B之间的通道就通了,然后A这时候可以给B不停的发信息了。
然后有人会问,TCP 又不会拉肚子,那TCP为啥要三次,因为如果规定二次的话: A 发给B信息,申请建立通道,因为网络延迟,B一直没收到,这时候A等的不耐烦了,直接就退出了,但是过了一会儿B收到了这个信息,B以为A是刚发的请求,所以建立了通道,但是A其实早就已经不在了。这样防止B形成死锁、浪费资源等。
当然上面是我们举得例子,具体肯定是通过一些值来传递:具体的图是这样的:
四次挥手
我们知道TCP连接之后我们可以互相之间发消息了,这里假设通道里包含了两个小通道,一个是A发给B的,一个是B发给A的,这样当我们断开连接的时候有两大步。
- 断开A发给B信息的通道
- 断开B发给A信息的通道
我们先看断开A发给B信息的通道:
A发信息给B:我累了,我先睡了,88.
B发信息给A:好的,那你先睡吧。
这时候A就睡觉了,A也不会发信息给B了。但是这时候B还是可以继续给A发信息,B可能深夜突然来个深情告白
B发信息给A: 其实我XXXXXXXX。
所以单纯二次挥手是不够的,还要断开B发给A信息的通道:
B发信息给A:不过你说你要睡了,我觉得是比较晚了,我也要睡了,晚安。
A发信息给B: 那你也早点睡。晚安
所以连在一起是:
A发信息给B:我累了,我先睡了,88.
B发信息给A:好的,那你先睡吧
B发信息给A:不过你说你要睡了,我觉得是比较晚了,我也要睡了,晚安。
A发信息给B: 那你也早点睡。晚安
刚开始是双向通信,然后二次挥手后,A到B的断了,所以这时候变成单向的数据传输,然后再二次挥手,把这个单向数据传输也关闭。
所以我们看到了TCP的连接和断开都这么多步,多次确认等操作,但是UDP是不需要先建立一个稳定的通道,直接就把数据发过去了。所以UDP更快,因为不用先去建立连接。
1.2 TCP的无差错传输
TCP为什么传输安全,UDP传输不安全,TCP传输保证了数据最终能稳定安全的到达目的地,而UDP只管发送出去,不管最终是否收到,具体原因是为啥?
发送端
对于发送端:每收到一个确认帧,发送窗口就向前滑动一个帧的距离。当发送窗口内无可发送帧时(即窗口内的帧全是已发送但未收到确认的帧),发送方就会停止发送,直到接收方发送确认帧使窗口移动,窗口内有可以发送的帧,之后才继续发送 具体如下图:
接收端:
对于接收端:当收到数据帧后,将窗口向前移动一个位置,并发回确认帧,若收到的数据帧落在接收窗口之外,则一律丢弃。
滑动窗口协议的重要特性
- 只有接收窗口向前滑动、接收方发送了确认帧时,发送窗口才有可能(只有发送方收到确认帧)向前滑动
- 停止-等待协议、后退N帧协议 & 选择重传协议只是在发送窗口大小和接收窗口大小上有差异。
1.停止等待协议:发送窗口大小=1,接收窗口大小=1;即 单帧滑动窗口 等于 停止-等待协议
2.后退N帧协议:发送窗口大小>1,接收窗口大小=1。
3.选择重传协议:发送窗口大小>1,接收窗口大小>1。
- 当接收窗口的大小为1时,可保证帧有序接收。
- 数据链路层的滑动窗口协议中,窗口的大小在传输过程中是固定的(注意要与TCP的滑动窗口协议区别)