TCP 拥塞窗口原理 (2)

经过3个 RTT, cwnd = 2^(3) = 8

拥塞避免

让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

无论在慢启动阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢启动ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞

cwnd = i

经过 1 RTT, cwnd = i+1

2 RTT, cwnd = i+2

3 RTT, cwnd = i+3

快速重传

TCP 有一个快速传输特性——在它的计时器到期之前重新传输丢失的段。 为了允许快速传输,我们需要为发送方和接收方设置一些规则。

作为接收者,它应该始终发送它期望接收的序列号。 例如,当接收方接收到第 1 段时,它以 ACK2 响应,

作为发送方,它应该忽略定时器并在收到 3 个重复的ACK 后立即开始重传丢失的段。

用一句话概况,就是发送端在收到3个重复无序的ACK时候,它假定数据包丢失并重传该数据包,而无需等待重传计时器到期。

而在此时,拥塞窗口的变化过程如下:

ssthresh设置为拥塞窗口的1/2

拥塞窗口大小设置为ssthresh

重新进入拥塞避免阶段

快速恢复

当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。

每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送)。

当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

算法

快速重传和快速恢复的目的是:快速恢复丢失的数据包。 如果没有快速重传和快速恢复这俩算法,那么tcp可能

Tahoe

Tahoe算法是TCP的早期版本。除了具备TCP的基本架构和功能外,引入了慢启动、拥塞避免以及快速重传机制。 在该算法中,快速重传机制策略如下:

ssthresh设置为拥塞窗口的1/2

拥塞窗口大小设置为1

重新进入慢启动阶段

Reno

Reno与Tahoe相比,增加了快速恢复阶段,也就是说,完成快速重传后,进入了拥塞避免阶段而不是慢 启动阶段。 Reno 在快速重传阶段,重新发送数据之后:

ssthresh设置为拥塞窗口的1/2

拥塞窗口设置为之前的1/2

进入快速恢复阶段

在快速恢复阶段,每收到重复的ACK,则cwnd加1;收到非重复ACK时,置cwnd = ssthresh,转入拥塞避免阶段;

如果发生超时重传,则置ssthresh为当前cwnd的一半,cwnd = 1,重新进入慢启动阶段。

Reno快速恢复阶段退出条件:收到非重复ACK。

NewReno

在Reno版本中,若同时有多个数据包丢失,则大部分必须等到TimeOut之后,才进行重传。这是因为在Reno中,同时有多个数据包丢失时,只要收到部分丢失数据的ACK,便退出快速恢复。而之所以能收到部分丢失数据的ACK,这是因为在快速重传阶段,只重新发送了部分丢失的数据。而在Reno结束快速恢复,进入拥塞避免阶段之后,对于其他未重新发送的数据包来说,常常没有足够的重复ACK来触发快速重传机制。只好等等TimeOut,而TimeOut对于TCP性能有非常大的影响,在等待TimeOut这段时间,无法发送新的数据包,而在TimeOut之后,CWND被重新设置为1。

基于上述原因,NewReno优化了该机制,NewReno在收到部分丢失数据的ACK后,并不会退出快速恢复阶段,而是等待所有丢失的包都重新发送之后,才退出快速恢复阶段。这就使得NewReno在遇到多个数据包同时丢失时,不需要等待TimeOut,便可重新发送所有丢失的数据包,进而减小TimeOut对性能的影响。

SACK

除了NewReno的方法之外,要解决大量数据包丢失的问题,还有一个解决方案,就是让发送端知道,哪些数据包已经送达,哪些数据包已经丢失。 SACK修改在接收端发送重复的ACK时,同时在ACK中携带连续的已经收到的数据序列号范围,而连续数据序号范围与连续数据序号范围之间的间隔就是已经丢失的数据。

滑动窗口与拥塞窗口

共同点:提高网络性能。

不同点:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgpzy.html