tcp的拥塞控制

名词解释:
​cwnd  --  拥塞窗口
ssthresh(slow start threshold)--  慢启动到拥塞避免到阈值
RTT——Round Trip Time,也就是一个数据包从发出去到回来的时间
RTO(Retransmission TimeOut)重发超时时间
 
为何有了滑动窗口还须要有拥塞窗口?
滑动窗口是对发送接收双方的流量控制,若是中间的网络设备的转发性能达到极限是没法感知到的,而tcp除了针对自身的收发能力作调整,还根据总体的网络状况作调整,因此有了拥塞窗口。
​​​
拥塞控制分为四个阶段,每一个阶段的处理策略都不一样,大概就是先猛增,而后当心增加预防拥塞,还有就是已经发生拥塞了的措施和快速恢复。
 
​慢启动
此阶段的操做:
cwnd设置为一个很小的初始值,这个初始值在不一样版本里面是不同的,有一、三、10等。
每收到一个ack,cwnd = cwnd+1
cwnd*2
cwnd成指数级别递增。
跳出该阶段的标志:cwnd等于ssthresh时,进入拥塞避免阶段,那么ssthresh的值该设置成多少?将在后面介绍。
拥塞避免
此阶段的操做:
收到一个ACK时,cwnd = cwnd + 1/cwnd
当每过一个RTT时,cwnd = cwnd + 1
​此阶段cwnd成线性增加。
跳出该阶段的标志:发生拥塞,此时进入发生拥塞阶段
 
发生拥塞
分为两种状况:

1)RTO超时,重传数据包。TCP认为这种状况网络上很糟糕了,反应也很强烈。算法

sshthresh =  cwnd /2网络

cwnd 重置为初始值ssh

进入慢启动过程tcp

2)收到3个duplicate ACK,这种状况认为网络状况还能够,反应不是很强烈。性能

cwnd = cwnd /2spa

sshthresh = cwndip

进入快速恢复阶段it

跳出该阶段的标志:出现一下,处理以后必然跳出到其余状态。io

为何快速恢复中会收到多个相同的ack,以及为何认为收到多个相同ack要比RTO的网络状况好? 将在后面介绍。ast

 
快速恢复​​​​​​
cwnd = sshthresh  + 3 * MSS (3的意思是确认有3个数据包被收到了)
重传Duplicated ACKs指定的数据包
若是再收到 duplicated Acks,那么cwnd = cwnd +1
若是收到了新的Ack,那么,cwnd = sshthresh ,而后就进入了拥塞避免的算法了
跳出该阶段的标志:出现一下,处理以后必然跳出到其余状态。
 
ssthresh的值该设置成多少​​?
动态的,​由于不一样设备,不一样网络环境中网络等承载能力是不一样的,初始值会设置很大,
#define TCP_INFINITE_SSTHRESH 0x7fffffff,而后按照上面介绍的到了拥塞发生阶段,sshthresh会被设置成拥塞发生时候,拥塞窗口的一半。
 
为何快速恢复中会收到多个相同的ack,以及为何认为收到多个相同ack要比RTO的网络状况好?
这个是tcp的快速重传机制,接收方若是收到的包不连续,从断点开始,每次收到新包,都ack丢失点的序号,若是发送方连续收到3次相同的ack,就重传。Fast Retransmit的好处是不用等timeout了再重传。举例:若是发送方发出了1,2,3,4,5份数据,第一份先到送了,因而就ack回2,结果2由于某些缘由没收到,3到达了,因而仍是ack回2,后面的4和5都到了,可是仍是ack回2,由于2仍是没有收到,因而发送端收到了三个ack=2的确认,知道了2尚未到,因而就立刻重转2。而后,接收端收到了2,此时由于3,4,5都收到了,因而ack回6。从上面也能看出收到三个相同的2的ack,起码说明网络中还能正常来回传输3,4,5等,说明网络还有的救,因此反应没那么激烈,而RTO说明这段时间不单单是2丢了,并且2丢了这段时间尚未收到后面的3个包,因此tcp就认为网络比较糟糕了,反应也比较激烈。
相关文章
相关标签/搜索