目录
1. TCP拥塞控制和TCP流量控制的区别
TCP流量控制是控制端对端的数据发送量。是局部的概念。
TCP拥塞控制是控制整个网络中每台主机的数据发送量。是整体的概念。
2. 检测到拥塞该怎么办
接收窗口代表数据的接收方接收数据的能力;拥塞窗口代表当前网络传输数据的能力。
如果发送了网络拥塞,应该减小拥塞窗口,也就间接减小了发送窗口。每一台主机就会减少数据的发送量,网络拥塞的情况就会有所缓解。
2.1 如何判断网络拥塞?
①每个报文段发送以后都能得到ACK确认,不拥塞。
②发出的报文段未能按时收到ACK从而超时重传,严重拥塞。
③收到冗余的ACK,引发快重传,有点拥塞。
(假设接收窗口足够大)
3. 慢开始算法 + 拥塞避免算法
严重拥塞的时候,迅速降低拥塞窗口 + 网络不拥塞的时候,调大拥塞窗口。
解释:
刚开始发送数据的时候设置拥塞窗口为1,拥塞阈值为16;此时发送一个报文段立即接受ACK,每收到一个ACK就让拥塞窗口的值+1,所以第二次发送两个报文段收到两个ACK那么拥塞窗口的值+2,以此类推,每次拥塞窗口的值会翻倍;知道阈值窗口达到设定的拥塞阈值16。
达到拥塞阈值之后,在一个RTT内无论有多少个ACK一律全部把拥塞窗口的值+1。当返回16个ACK的时候,拥塞窗口的值+1。
假如拥塞窗口到了24的时候出现了超时重传,此时网络处于严重拥塞,我们这个时候立即启用慢开始算法,把拥塞窗口降低到1,此时拥塞阈值的值会变成超时重传之前的拥塞窗口的一半也就是12;后面就继续翻倍,当拥塞窗口为8的时候,发送了8个报文段应该收到8个ACK,但是不能超过新的拥塞阈值12,所以只能加4到达阈值,到达阈值之后算法从慢开始变成了拥塞避免算法,后续不论收到多少ACK每次拥塞窗口只加1
4.快重传事件->快恢复算法
有点拥塞的时候,适当减少拥塞窗口。
我们查看上图,在RTT=12的时候此时发生了超时重传,说明网络拥塞特别严重,需要立即启用慢开始算法,把拥塞窗口的值变为1,拥塞阈值变成之前拥塞窗口的一半。但是如果只是收到了冗余ACK发生了快重传,说明网络此时稍微有点拥塞,采用快恢复算法,把当前拥塞窗口变为原来的一半即可;拥塞阈值也变成拥塞窗口的一半,这样一来拥塞窗口和拥塞阈值是相等的,就可以使用拥塞避免算法:即无论收到多少个ACK,拥塞窗口只+1。
5. 总结
一开始我们使用慢开始算法,使得拥塞窗口成倍数增加,当达到拥塞窗口=拥塞阈值的时候,我们需要切换算法为拥塞避免算法。我们需要进行分辨接下来的事件:
事件1:发生超时重传,说明网络非常拥塞,直接启用慢开始算法,把拥塞窗口重新变为1,拥塞阈值变为原来拥塞窗口的一半。
事件2:发生快重传事件,也就是收到多个重复ack,立即重传;说明网络有点拥塞,此时把拥塞窗口调整为原来的一半,拥塞阈值调整到原来拥塞窗口的一半,这样一来拥塞阈值和拥塞窗口相等,就可以开始拥塞避免算法了。