摘要
拥塞控制
什么是拥塞控制?
计算机网络是共享的,流量控制避免的是发送方填满接收方的空闲空间,而拥塞控制是避免发送方填满整个网络。
没有拥塞控制网络会发生什么?
当网络极度拥堵时,如果没有拥塞控制,发送方会继续发送大量的网络数据包,而这些数据包因为网络阻塞而延时、丢失,触发了TCP重传,重传使得网络更加阻塞,整个网络将会陷入不可用的状态。
什么是拥塞窗口?
拥塞窗口(cwnd)是发送方维护的一个状态变量,它会根据网路拥堵情况动态调节。
之前发送窗口约等于接收窗口,但在拥塞窗口加入后,发送窗口=min(拥塞窗口, 接收窗口)。
拥塞窗口的变化规则
发送方如何判定网络出现阻塞?
发送方在规定时间内没有收到ACK报文(也就是触发了超时重传)。
拥塞控制算法有几种?
慢启动
慢启动的规则就是当发送方收到一个ACK,拥塞窗口的大小就会加1。
上图中假定发送窗口和拥塞窗口相等:
慢启动算法的发报个数呈指数级增长。
慢启动算法何时停止?
慢启动算法中有一个慢启动门限ssthresh(slow start threshold)的状态变量:
一般来说,ssthresh的大小为65535字节。
拥塞避免
拥塞避免算法的规则是:每收到一个ACK报文,拥塞窗口cwnd增加1/cwnd。
上图中进入拥塞避免算法以后,第8个到来的ACK会增加1/cwnd,也就是增加1个变为9,最终可以发送9个MSS的数据。
通过上图可以看出,拥塞避免算法拥塞窗口还是增长的,只不过增长速度由指数变为了线性。
拥塞避免算法何时停止?
窗口一直在增长,网络会渐渐开始变得阻塞,网络中逐渐出现延时、丢包现象,导致TCP发生重传,此时就会进入拥塞发生阶段。
拥塞发生
TCP重传的机制大类主要有两种:
上述两种重传使用的拥塞发生算法也不相同。
超时重传拥塞发生
超时重传拥塞发生以后,ssthresh和cwnd会发生变化:
上图中可以看出超时重传拥塞发生时,可发送的数据包将会出现一个断崖式的下跌,这很容导致发送方卡顿。
快速重传拥塞发生
快速重传会在收到相同的3个ACK包时发生,发送端可以快速重传,不必在等待超时。这种情况下ssthresh和cwnd会发生以下变化:
快速恢复
上图中可以看出,进入快速恢复前,ssthresh和cwnd的值已被更新。进入快速恢复以后: