拥塞控制
TCP协议相关的内容可以分为五个部分:TCP报文,TCP连接,Socket编程,可靠传输机制和流量控制,拥塞控制。本篇文章记录拥塞控制部分的内容。
1. 网络拥塞
流量控制是避免发送方数据填满接收方缓存,发送方和接收方仅仅知道彼此的网络状态,并不知道整个网络环境中发生了哪些事情。一般来说,计算机网络都处在一个共享网络环境。当网络发生拥堵时,如果继续发送大量数据包,可能会导致数据包丢失等,此时TCP会重发数据,又会导致网络负担更严重,进而导致更大延迟和更多丢包。为了解决重传机制导致的网络环境恶性循环问题,便有了拥塞控制。
网络中进行数据传输时,如果发送方发送窗口无节制的变大,一定会导致网络不堪重负,发生网络拥堵。因此需要对发送方发送窗口进行一定控制,称为拥塞控制。
拥塞控制是为了避免发送方数据填满整个网络,该方案提出拥塞窗口的概念,由发送方维护一个状态变量(cwnd),会根据网络拥塞程度动态变化 ,并且 s w n d = m i n ( r w n d , c w n d ) swnd = min(rwnd,cwnd) swnd=min(rwnd,cwnd)。
2. 拥塞控制算法
发送方维护一个“拥塞窗口”(cwnd),单位为MSS(1046),发送方让自己的发送窗口=cwnd。发送窗口和接收窗口用于控制发送方和接收方均衡,拥塞窗口用于控制整个网络的均衡。
2.1. 慢启动算法
发送方开始发送数据时,选择发送1个字节的试探性报文,收到确认后,指数级增长cwnd,直到达到预先设定的慢开始门限(ssthresh)。
当cwnd达到ssthresh后,切换为拥塞避免算法。
2.2. 拥塞避免算法
加法增大:每经过一个往返RTT,拥塞窗口+1,即让拥塞窗口缓慢的增大,按照线性增长,称为拥塞避免算法。
乘法减小:当出现网络拥塞时,将慢开始门限设为cwnd的一半,然后将cwnd置为1,执行慢启动算法(已弃用改为快恢复算法)。
2.3. 快重传和快恢复
1. 一旦发送方收到三个一样的确认(连续4个相同的ACK,标志着1个数据段已丢失),就知道该包之后出现了问题,立刻重传该包,称为快重传。
2. 发送方开始执行“快恢复”算法,慢开始门限(ssthresh) 减为发生拥塞时cwnd的一半。
3. cwnd设为慢开始门限(ssthresh)减半后的数值,执行“拥塞避免”算法。