为了面试大厂,回顾tcp协议的细节。我用我自己的话来梳理tcp的拥塞控制。当然可能会有一些细节上不是那么到位。
TCP 拥塞的算法:
慢启动
网络的带宽上总是有限的,所有的连接都想尽量的抢占带宽。
形象的场景,比如想要通过tcp连接发送一个1G的文件。假设双方资源都充足,tcp 一开始就以最大的带宽来传输吗?当然不是的。tcp协议会从逐渐增大拥塞窗口的大小,来试探到合适的拥塞窗口大小。
Chandler: 什么是拥塞窗口呢?可以简单理解为一次连续发送多少个报文。拥塞窗口,会根据网络情况不停的调节,比如出现了丢包重传,那么拥塞窗口就会变小,如果连续没有丢包,就假设网络还有空间,拥塞窗口就会上调。
拥塞避免
报文开始传输的时候,会按照指数来增长,比如第一次1个报文,第二次2个报文,第三次4个报文,第四次8个报文,直到数量到了初始门限值,就不再是指数增长,而会改为每次增加一个,来避免拥塞。这个数值会逐个增长,直到出现丢包重传。
快重传与快回复
假设发送方传输了24个数据包,却只收到20个回应报文,此时网络并不是拥塞,而是传输中的超时或丢包。那么发送方等到数据包的发送计时器超时,再改用拥塞避免算法补发,这样处理传输效率不高。快重新与快恢复便是为了解决这种场景的。
快重传是指,接受方接受到第1,第2个的数据包,却没有等来后面的第3个数据包,而是来了第四个,第五个,第六个。那么此时接受方会连续发出对第2个数据包的ack。发送方收到后,进而补发。
快恢复是指,在这种场景中,初始门限值不是变回1,而是发送窗口和初始门限值都下调为当前拥塞窗口的一半。