【计网】TCP是怎么实现可靠传输的?
官方答案
知识储备
TCP流量控制
为什么要有 TCP 流量控制?
因为在通信的时候,接收方的接受能力有限。如果发送方一直发,接收方吃不下,接受处理来不及就会造成数据丢失。
所以就想出来这么一个法子:当一个主机通过 TCP 协议向另一个主机发送数据时候,接受方就会开启一个接受滑动窗口
。并由此对发送方的发送策略做出一定的信号进行干涉。
核心的一些技术是什么?
滑动窗口,超时重传,零窗口探测报文
。
具体过程
首先发送方通过三报文握手和接收方建立连接。
然后这时候,接收方就产生一个自己的接受窗口。并把这个窗口的大小传回给发送方。
然后发送方就会把这个值设置为自己的发送窗口。
然后就把应用程序给的数据分成不同的小组,先发一个小组给接收方,同时每发送一个报文小组就会开启超时重传。
也就是如果没有在规定时间内接受到这个已发送的报文 respon 就会重新发送这个报文小组。
这个发送动作会一直存在,直到发送窗口里的报文小组全发出去了。
接收方接受了这些报文后,会根据自己的缓存实际情况去调整自己的接受窗口大小。
并会就就接受到的最后一个小组发送一个收到确认报文端。里面会带着新的窗口大小。
接受方接收到这个respon之后会把发送窗口向后移动,把已经接受的小组移到外面去并删除这些小组。
然后就调整自己的发送窗口和接受窗口一样大。
然后就会重复上面这个过程。这之中如果一个发送小组的respon一直不来,等到这个小组的超时重传到时间了,就会重新发送这个小组。
如果接受窗口调整成0了,那在发送窗口设置成0了之后。发送方会每隔一段时间(零窗口探测报文的超时重传,==也就是持续计时器==)就发送一个只有一个报文的零窗口探测报文,接收方接收到了就立刻发送此时此刻自己的接受窗口给对面。
rwnd:这个接收方返回自己接受窗口的携带变量
TCP的拥塞控制
什么是拥塞?为什么要进行拥塞控制?
拥塞就是一个网络资源的提供是有限的,但是一段时间内却有很多人去请求。导致该网络资源无法再提供给申请者。
因为实际网络情况中,一个网络通道中随着加入的报文分组越来越多(也就是随着网络负载越来越大),实际返回回来出网络通道的数据(吞吐量)是呈急剧式下跌的,最后会直接不再返回数据。也就直接死锁了。
对应到现实生活就是APP上有一个资源,比如是一张图片。本来正常的不拥塞的网络,大家一访问就会立马看到显示到手机屏幕上。但是随着想看这个图片的人越来越多,发送到后端服务器的请求越来越多,也就是网络负载增大。服务器返回图片就会越来越慢,从用户点击要看图片到最后加载出来的加载时间越来越长。有些用户就会申请不到图片(丢包率上升。)最终只要网络请求足够多,网络负载达到一定层度,服务器和app之间的通道会直接完全阻塞。不会返回任何数据。
输入负载:单位时间内给网络通道的分组数量
吞吐量:单位时间内网络通道出来的分组数量
讨论前提:
- 接收方缓存够大,发送窗口只受网络拥塞影响;
- 发送的单位直接用完整报文单元;
机制流程
发送方有一个拥塞窗口,然后直接把拥塞窗口作为发送窗口。
然后拥塞窗口的值是根据网络通道拥塞程度动态变化的。
而网络拥塞程度是根据发送方是否发生超时重传来额定的。
有几个值要特别注意:
- 慢开始门限值ssthresh
- 拥塞窗口cwnd
- 发送窗口
解决策略:四种拥塞控制算法
慢开始 + 拥塞控制
下面的发送窗口 = 拥塞窗口 = 吞吐量
满开始就是刚开始的发送窗口是 1,然后每接受一个respon就 *2.成指数上升。
这里的慢指的是,发送窗口开始小,而不是发送大小增长慢。
然后当发送窗口达到慢开始门限值的时候就会启动拥塞控制,也就是发送窗口现在接受respon 每次就+1,线性增长。
如果中间发送的分组丢失,导致发送方发生超时重传就断定网络发生了拥塞。慢开始门限值直接变为当前发送窗口一半,然后发送窗口变为1。又开始慢开始算法。
快重传 + 快恢复
这个就是在上面的基础上,针对遇到数组丢失的情况做了一点优化。
之前是发送窗口中的东西发完了,轮到接收方respon的时候接收方顺带返回的。
现在是直接接收方接收到一个就回复确认一个,如果收到了不按照顺序到达的就直接重发上一个按序的最后一个respon。但是明确是重复标签。
然后如果发送方连续接受到了三个重复respon ()不包含正常的那个,就重发缺的哪一个
这时候就是明显拥塞了,上面这个就是快重传。
然后慢开始门限值和发送窗口统统变成当前吞吐量的一半然后直接线性拥塞控制算法上。
TCP超时重传时间选择
RTO = RTTs + 4*RTTd
RTO:超时重传时间
RTTs:加权平均往返时间
一般如果发生超时重传,RTO直接变大,准确点是变大 2 倍。
TCP可靠传输的实现
基于以字节为单位的滑动窗口
来实现
rwnd :接受窗口的大小
ack:希望收到下一个数据的序号是多少
如何描绘发送窗口的状态?
三个指针!
虽然发送窗口时接受窗口给的,但是同一时刻他两可能不一样。
因为一个有时延,二个有拥塞机制。
还有未按需到达的怎么处理,一般是先存起来,然后齐了再统一交付上层。