目录
什么是拥塞控制,为什么需要拥塞控制
慢启动
拥塞避免
什么是拥塞控制,为什么需要拥塞控制
拥塞通常是指从随着网络中的主机增加其发送速率并因为网络的原因使网络变得十分拥挤,此时会经常发生丢包现象,导致网络的传输效率急剧降低。分组的超时重传和重复收到的分组确认ACK报文,通常被作为网络拥塞的标志。
通常局域网近似于理想网络,最大带宽大小固定,几乎无抖动,几乎不会因为网络原因丢包,几乎不会发生乱序。在这种网络下,通常不会发生拥塞,发送方一开始便向网络发送多个报文段,直至达到接收方通告的窗口(滑动窗口协议)大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。
但是如果不是局域网(比如广域网)的情况下,在发送方和接收方之间存在多个路由器和一些速率较慢的链路,有时还会出现某些链路断开或者各种原因导致的路由路径切换,就有可能出现一些问题。比如中间突然出现一段速率慢的链路导致中间路由器必须要缓存分组,但其缓存的能力有限,耗尽存储器的空间后必须丢弃报文。那么这种情况下,我们就需要引入拥塞控制算法,来避免拥塞的发生。
在TCP里,使用三个窗口进行流量控制,分别是:
- 接收窗口rwnd(receive window)
- 发送窗口swnd(send window)
- 拥塞窗口cwnd(congestion window)
这3个窗口的定义与关系可以参见文章:TCP的三个窗口
TCP协议除了用swnd和rwnd进行流量控制外,还引入了cwnd来进行拥塞控制。
另外TCP的拥塞控制算法包括4大算法,分别是:
- 慢启动
- 拥塞避免
- 拥塞发生
- 快速恢复
慢启动
TCP是一个“无私”的协议,当它检测到拥塞发生时,它就会主动降低发送速度,以避免拥塞变得更加严重,主动来帮助网络恢复正常状态。为了避免拥塞,TCP在最开始的阶段:先将拥塞窗口cwnd设置1个mss长度,然后有一个以指数形式增长的过程称为慢启动。
在文章TCP的三个滑动窗口,swnd, cwnd, rwnd中,我们已经知道, 发送窗口swnd
的大小是由cwnd拥塞窗口
和接收方的rwnd接收窗口
大小(swnd= min[rwnd, cwnd])中比较小的那个值来决定的。
本文章中为了简单讨论慢启动的模型,我们提出二个假设:
- 发送窗口swnd完全由网络的拥塞程度决定
我们假设接收端主机的缓冲区足够大或者说接收端主机的处理能力足够快,使得接收窗口总是足够大,进而可以得出,发送窗口swnd的大小就完全是由拥塞窗口cwnd的大小来决定,即完全由网络的拥塞程度决定。
- 以MSS的个数做为cwnd的单位
并且我们假设需要发送的TCP报文足够大并且MSS设置成了合适的值,那么使得TCP报文总是以一个MSS的长度来发送任意一个报文,并且不会产生IP分片。这们我们就可以用MSS的个数来取代字节个数来做为CWND的窗口大小的单位。
理解二个概念:
- 初始cwnd
- 慢启动门限ssthresh
TCP刚刚开始传输数据时,会从一个较小的cwnd开始,然后逐步增长到sshthresh的过程称为慢启动,这个慢启动过程中的增长算法很简单:发送方每从网络上收到一个 ack,拥塞窗口 cwnd的值就会加 1。
如图所示,
1,发送方最开始(横坐标1)时,只发送1个数据包到接收方---------cwnd的大小为1(纵坐标)
2,当发送方收到第1次发送的1个数据包的ACK后,将cwnd的大小加1成2(1+1=2),再发送2个数据包给接收方(横坐标2)
3,当发送方收到第2次发送的2个数据包的2个ACK后,将cwnd的大小加2成4(1+1+2=4),再发送4个数据包给接收方(横坐标3)
4,当发送方收到第3次发送的4个数据包的4个ACK后,将cwnd的大小加4成8(1+1+2+4=8),再发送4个数据包给接收方(横坐标3)
5,依此类推,直到cwnd>ssthresh,则结束慢启动过程,进入到拥塞避免阶段
我们可见在慢启动阶段cwnd是以指数的形式增长的,直到拥塞窗口大小大于门限值为止。
拥塞避免
当TCP经过慢启动阶段,wnd>ssthresh时,就开始使用拥塞避免算法来进行拥塞控制,这个阶段cwnd以线性方式增长,每次收到前面发出去的所有包时,cwnd = cwnd + 1(实际是每收到一个ACK, cwnd = cwnd + 1/cwnd),线性增长直到检测到拥塞发生。
见横坐标从6开始的,每一轮cwnd就加1。