TCP相关控制算法
以段为单位发送数据
在TCP建立连接三次握手的时候,协议中带有自己接口最适合的MSS (Maximum Segment Size)大小,发送方以后就按照这个大写切分数据段。
滑动窗口来提高传输速度
原先发送方每发送一条数据,都要等待接收方的反馈才会发送下一条,这样效率太低。
现在定义一个窗口大小,每次发送窗口大小内数据不等待反馈,全部发送完毕等待一次反馈,相比原来节约很多时。
滑动窗口与重发机制
在使用窗口控制中,出现段丢失或者应答丢失会不会出发重传?
-
数据应答丢失
-
数据段丢失
流控制 flow control
主要利用滑动窗口和上面相关设计实现,滑动窗口主要由接收方反馈缓存情况来维护,维护接收方的承受能力
接收端主机向发送端通知自己可以接收数据的大小,于是发送端会发生不超过这个限度的数据, 这个限度就是窗口大小,由接收端确定的。值越大说明网络的吞吐量越高。 如果接收端数据缓冲区一旦溢出,窗口大小也会减小并发给发送端。
若接收端无法及时清理缓冲区,导致缓冲区没有多于空间,发送方会等待接收方通知新的有效窗口值, 如果过了超时时间没有收到新通知,会发送一个窗口探测包,获取窗口大小。
拥塞控制 congestion control
主要利用拥塞窗口实现,拥塞窗口主要由发送方的拥塞控制算法检测出的网络拥塞程度来决定的,维护网络带宽的承受能力
慢启动的时候,初始大小设为1个MSS,发送后收到一个ACK,拥塞窗口增加1。 在发送数据包时将拥塞窗口和滑动窗口做比较,用较小值继续作为阈值继续发送。
由于拥塞窗口会以指数型激增,导致网络拥塞,所以引入阈值,当拥塞窗口到达阈值,后面会降低增长速度 。
TCP刚开始没有设置慢启动阈值,所以会指数型上升直到遇到超时(采用重发机制,不同于下面的高速重发机制)(①慢启动阶段)。 超出带宽上限。此时设置拥塞窗口为当时窗口一半的大小,cwnd缓慢增加( ②拥塞避免阶段)。
超时重发: 数据段发送后,在一个时间周期内没有收到ACK,则自动重发
快速重发: 在一个滑动窗口内,收到3次重复ACK,则启动重发,不需要等待超时
由重复确认应答进行高速重发控制时,慢启动阈值设置为当时窗口一半,拥塞窗口大小设置为慢启动阈值+3个数据段。
快速重发后没有使用慢启动算法,而是拥塞避免,所以又叫快恢复阶段
延迟确认应答
因为有滑动窗口的概念,应答少一些也无妨,所以延迟确认得以实现,例如每次双数的数据段到达才回复ACK,或者最多0.5s内没收到下一个数据段就回复ACK。
是提高网络利用率降低计算机处理负荷的一种较优机制.
捎带应答
在使用延迟应答的同时,拿到程序对于本次接收消息的回复内容,放在ACK中发送给发送方.
常见的拥塞控制算法
Reno:Linux内核使用的
BBR: Google 2016年提出的
Reno
分为4个阶段,慢启动,拥塞避免,快重传,快恢复
与TCP 内部拥塞控制相似。
缩略词注解
RTT: round-trip delay time 来回通信时延
TD: Triple duplicate acknowledgements 三次重复确认应答
TO: TimeOut 丢包超时
MSS: Maximum Segment Size 最大包尺寸
ssthresh: slow start threshold 慢启动阈值