拥塞现象是指到达通信子网的某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分甚至整个网络性能下降的现象,严重时可能导致网络通信业务陷入停顿即出现死锁现象。
简单点说,受限于网络状况、带宽以及应用请求处理能力等因素,TCP传输会出现超时、发送失败、重发等现象,要解决拥塞问题,除了增加通信链路带宽、链路缓存以及处理器处理能力外,还需要引入拥塞控制机制;
经过长时间的发展,TCP传输拥塞控制算法有许多种类型,不过大致可以总结为如下四种,分别是:慢启动、拥塞避免、快重传以及快恢复。
术语
- 拥塞窗口(cwnd):发送端在拥塞情况下一次最多能发送多少个数据包
- 接收窗口(rwnd):接收端对发送端窗口大小所做的限制
- 通告窗口(awnd):TCP内核缓冲区的大小,通常要求其为MSS(Maxsimum Segment Size:最大报文段大小)的偶数倍
- 慢启动阙值(ssthresh):慢启动与拥塞避免的临界值,即慢启动过程能达到的最大发送速率
- 往返时延(RTT):发送端发送报文到收到接收确认的时间
- 超时重传计时器(RTO):一次发送未接收到确认需要重发的时间,通常为
2*RTT或5*RTT
慢启动
在连接建立之初,TCP会指数型增大数据包发送速率直到达到慢启动阙值(ssthresh),可以理解为连接建立之初的网络探测阶段。
详细策略为:连接建立,cwnd=1,如果没有发送丢包与拥塞,则线性增大cwnd,直到cwnd>=ssthresh,这是一个发送速率快速增长的阶段。
拥塞避免
上述慢启动过程直到cwnd等于ssthresh,则进入 拥塞避免 过程。
详细策略为:当拥塞窗口到达慢启动阙值时,保险起见,降低发送速率增长率,这个阶段是发送速率&cwnd缓慢增长的阶段。如果一旦出现拥塞情况,ssthresh会设置为cwnd/2,cwnd会重新设置为1,重复慢启动、拥塞避免的过程(旧版本,现已使用快速恢复算法替换,见下文)。
快重传
快重传用于控制发送方重发丢失的数据包,一旦传输过程出现丢包,则判定出现了拥塞,会使用快速重传重新发送丢失的数据包。
实现策略:接收方接收到失序的报文,立刻向发送方发送重复确认。如果发送方收到三个接收方发来的重复确认,则不必等待重传计时器到期,立即重发未被确认的报文段。
快恢复
快恢复算法也是用于控制发送方发送报文的速率,在TCP Reno版本被提出(TCP NewReno又提出队快恢复算法改进的”选择性应答算法”)
实现策略:发送端在执行快速重传后(收到3次重复ACK确认后的快速重传),将ssthresh与cwnd设置为原cwnd一半,直接开始阻塞避免,
总结
拥塞控制机制基于【调整发送端发送速率来控制网络负荷量】