前言
本文为个人学习笔记的整理,其中很多借鉴了小林coding的图解网络。
为了避免发送方无节制地发送数据,从而造成网络拥堵,所以 TCP 设计了拥塞控制。
流量控制和拥塞控制的区别
-
流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
-
拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。
拥塞窗口
拥塞窗口 cwnd(congestion window)是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。拥塞控制的本质就是使用算法控制拥塞窗口,从而避免过多的数据注入到网络。
但是其实真正决定传输速率的是发送方的滑动窗口大小,发送窗口 = min(拥塞窗口,接收窗口)
当发生了重传,就会认为网络出现了拥塞,拥塞窗口减小;否则拥塞窗口增大。
拥塞控制算法
拥塞控制算法:慢启动、拥塞避免、快速重传、快速恢复(这是官方定义的四大算法,但是个人认为不方便记忆和理解)。整体过程大约如下:
- 在 TCP 连接建立完毕后,会先使用慢启动算法,指数级逐渐增大拥塞窗口(+1 +2 +4 +8…)。
- 当拥塞窗口达到慢启动门限 ssthresh(slow start threshold)时,会使用拥塞避免算法,线性逐渐增大拥塞窗口。(+1 +1 +1…)
- 当发生超时重传或快速重传时,会使用拥塞发生算法:
- 发生超时重传,将 ssthresh 设为 cwnd/2,将 cwnd 设为初始值,然后会再次使用慢启动算法。
- 发生快速重传,使用快速恢复算法,然后进入拥塞避免阶段。
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。慢启动算法发包的个数是指数性的增长。
有一个叫慢启动门限 ssthresh
(slow start threshold)的状态变量。
- 当
cwnd
<ssthresh
时,使用慢启动算法。 - 当
cwnd
>=ssthresh
时,就会使用「拥塞避免算法」。
拥塞避免
规则:每当收到一个 ACK 时,cwnd 增加 1/cwnd。
拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长。就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,当触发了重传机制,也就进入了「拥塞发生算法」。
拥塞发生
当触发 TCP 重传机制时,就视为拥塞发生。TCP 的重传包括超时重传和快速重传,两种重传表示两种不同的网络情况,对应的也有两种拥塞控制手段。
超时重传
当发送方未在规定时间内接收到 ACK 确认包时,就会超时重传。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
当发生「超时重传」,就会使用拥塞发生算法,重新进入慢启动阶段。
这个时候,ssthresh 和 cwnd 的值会发生变化:
ssthresh
设为cwnd/2
。cwnd
重置为初始值。
快速重传
快速重传不以时间为驱动,而是以数据驱动重传。
如果接收方收到一个失序的报文段,就即回送一个 ACK 给发送方。
快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
当发生「快速重传」,TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh
和 cwnd
变化如下:
cwnd = cwnd/2
;ssthresh = cwnd
;- 进入快速恢复算法阶段
快速恢复
快速恢复算法如下:
- 拥塞窗口
cwnd = ssthresh + 3
( 3 的意思是已经确认收到了 3 个重复的数据包); - 重传丢失的数据包;
- 如果再收到重复的 ACK,那么 cwnd 增加 1(1 代表每个收到的重复的 ACK 包,都已经离开了网络。)
- 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
首先,快速恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。
其次,过程2(cwnd逐渐加1)的存在是为了尽快将丢失的数据包发给目标,从而解决拥塞的根本问题(三次相同的 ACK 导致的快速重传),所以这一过程中 cwnd 反而是逐渐增大的。
TCP 拥塞控制算法也有很多个版本,最早的 TCP Tahoe,是没有快速恢复算法的,当发生快速重传时,也会进入慢启动过程。
这里说的是 TCP Reno,除此之外,还有很多版本进行了各自的优化。
另外,网上的许多资料都对快速恢复算法进行了简化,跳过了中间过程而直接进入到拥塞避免阶段。文中的详细过程可以参考 RFC2581文档。
扩展-快速恢复失败:快速恢复算法会重传丢失的数据包,如果此时再次发生快速重传,就不会再使用快速恢复,而会直接进入慢启动阶段。
今天的文章TCP的拥塞控制_tcp窗口滑动以及拥塞控制分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69540.html