TCP 流量控制和拥塞控制专题
[1] 什么是“拥塞”?
当提供给任何网络的负载能力超过它的处理能力时,拥塞便会产生。
[2] TCP流量控制和拥塞控制有什么区别?
TCP协议有两个比较重要的控制算法,一个是流量控制,另一个就是阻塞控制。
TCP协议通过滑动窗口来进行流量控制,它是控制发送方的发送速度从而使接受者来得及接收并处理。而拥塞控制作用于整体网络,它是防止过多的包被发送到网络中,避免出现网络负载过大,网络拥塞的情况。
拥塞算法需要掌握其状态机和四种算法。拥塞控制状态机的状态有五种,分别是Open,Disorder,CWR,Recovery和Loss状态。四个算法为慢启动,拥塞避免,拥塞发生时算法和快恢复。
[3] TCP拥塞控制四大算法?
拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)快重传,4)快速恢复。
- 也就是CP连接刚建立使用慢启动算法,发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,其发送的数据包数量在每一个往返时间段都会呈指数形式上升,即cwnd会加倍。
- 直到达到预设置的一个慢开始门限 ssthresh ,就会执行拥塞避免算法。拥塞避免规定数据包会从指数递增切换到加法递增。
- 若发生拥塞,比较古老的方法是超时重传算法,它会在发送一个数据以后就开启一个计时器,在一定时间内如果没有得到发送数据报的ACK报文,那么就重新发送数据,直到发送成功为止。但是如果执行快重传算法,发送方如果收到三个重复确认,那么可以知道下一个报文段丢失,立即重传下一个报文段,而不用等计时器到时间。
- 超时重传算法将慢启动阈值ssthresh设置为当前cwnd的一半,即ssthresh = cwnd / 2。并且cwnd重置为1,但是使用快速恢复算法会将cwnd大小缩小为当前的一半,ssthresh设置为缩小后的cwnd大小。总结则是,超时重传算法会让一切重新开始,慢启动阀值折半且拥塞窗口置为1,进入慢启动。但是使用快速恢复算法则只需要将窗口和慢启动阀值折半,窗口重新进入线性增加状态即可。
详细过程:
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。慢启动算法+拥塞避免
- 发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
- 注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
- 如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
快重传+快恢复
- 在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
- 在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
- 在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
- 慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。