关于RFC 5681和《TCP/IP IIIustrated》在ssthresh(慢开始门限值)调整的区别

来源:互联网 发布:3ds淘宝 编辑:程序博客网 时间:2024/06/13 02:24

今天上课的时候,偶然发现老师讲的ssthresh在需要调整的时候和其他书籍有所不同,于是产生了好奇心,故进行了一番探究

TCP的拥塞控制

大家伙应该都十分清楚TCP的拥塞控制在计算机网络中占据了十分重要的地位,其中最重要的就是它的四大算法(慢开始、拥塞避免、快重传、快恢复),当然这些算法算不上完美,但就目前而言是十分受用的,这也是为什么现在网络前沿对于网络拥塞控制算法的研究一直居高不下,因为它们还存在极大的改善空间。

本文的主旨是介绍关于RFC 5681和《TCP/IP IIIustrated》在ssthresh(慢开始门限值)调整的区别,但为了更加便于理解,所以先进行四大算法的梳理,本着多一道公式就会丢失一半读者的原则,本文将对此只字不提

慢开始算法 思路:当主机开始发送数据的时候,如果将大量数据立即注入到网络中,那么很有可能引起网络拥塞。于是采用:由小到大逐渐增大拥塞窗口数值。通常将cwnd(拥塞窗口)设置为一个最大报文段mss的数值,在每次收到一个对新的报文段的确认之后,把拥塞窗口逐渐增大,即每经过一个传输轮次,cwnd就加倍。例如:初始为cwnd=1,接着2,然后4,8,16,32,64………

拥塞避免算法:为了防止拥塞窗口增长过大,引起网络拥塞,设置一个慢开始门限值ssthresh(如何设置此值,就是本文重点),当慢开始算法超过ssthresh时,执行拥塞避免算法,具体为让cwnd缓慢的增大,即每经过一个往返时间RTT就将发送方的cwnd+1,这样拥塞窗口cwnd就按照线性规律缓慢增长。

发生快重传时一般都是默认出现了网络拥塞

快重传算法:发送端只要一连收到三个重复的ACK即可断定有分组丢失了,就应该立即重传丢手的报文段而不必继续等待为该报文段设置的重传计时器的超时。

快恢复算法:当发送端收到连续三个重复的ACK时,就重新设置慢开始门限 ssthresh,与慢开始不同之处是拥塞窗口 cwnd 不是设置为 1,而是设置为ssthresh,若收到的重复的ACK为n个(一般默认为3),则将cwnd设置为ssthresh+3,若发送窗口值还容许发送报文段,就按拥塞避免算法继续发送报文段。

以上内容反复提到ssthresh,但对于此值的具体大小,似乎还未明确下来,接下来就是本文的主要讨论的东西

《TCP/IP IIIustrated》版ssthresh值

在《TCP/ip IIIustrated》中,对于ssthresh值的设定是这么描述的:“无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(根据就是没有按时收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不可小于2个mss)

举个例子:当前网络的ssthresh值为16,网络拥塞值为24,慢开始初值为4,则开始慢开始算法:4、8、16,开始拥塞避免算法:17、18、19.。。。。24,出现网络拥塞,开始进行ssthresh值调整,为网络拥塞值一半,值为12,重新开始慢开始算法,初值为4、8、16,开始拥塞避免算法:13、14、15.。。。

RFC 5681版ssthresh值
RFC 5681文档说明

RFC 5681认为ssthresh值应该是发生拥塞时没被确认数据量的1/2,但不小于2个mss。

举个例子:发了19个包出去,但只有前3个包收到确认,那么ssthresh值就被定为后16个包所携带数据量的1/2。

总结
1、超时重传触发慢启动 2、凑满n个DuP Ack触发快速重传(一般规定为3个,因为网络包有时会乱序,因为乱序而重传没有必要)

举个例子:丢包对于较小文件的影响大于大文件,较小文件传输包数很少,故丢包往往凑不满3个DuP AcK,所以只能触发超时重传,而超时重传触发了慢启动,若为大文件,则一般触发快速重传,所以大文件的丢包影响小于较小文件。

一般情况下我们是采用《TCP/IP iiiustrated》的ssthresh版本,这也是国内教材统一采用的版本,但如果是去研发一套拥塞控制系统,那么这个标准问题可要好好考虑一下了,原则上是以最有效的为基础,当然不同情况不同考虑。

ps:路由器的诞生晚于交换机,因为早期的路由器是软件,所以这也是为什么现在的服务器一般可以转发数据包的原因,只要服务器安装了路由器软件就可以充当一个路由器。现在的路由器因为结构功能比较复杂,同时也是为了更好的服务网络,所以就采用了单个系统,这样可以提高路由器的效率。

原创粉丝点击