b站相关视频:
https://www.bilibili.com/video/BV1kJ41177r8
当提供给任何网络的负载超过他的处理能力时,拥塞便会产生。当路由器上的队列增长到很大时网络层检测到拥塞,网络层会通过丢弃数据包来缓解拥塞,传输层会受到网络层返回回来的拥塞信息并减慢他发送到网络的流量速率。TCP的拥塞控制会维持一个拥塞窗口,窗口大小是任何时候发送端可以往网络发送的字节数。那速率就是窗口大小除以连接的往返时间了。除了一个拥塞窗口还要维护一个流量控制窗口,流量控制窗口指出了接收端可以缓冲的字节数,要并发跟踪这两个窗口,可能发送的字节数是这两个窗口中较小的那个。
慢速启动算法:该算法是一个线性增长和乘法增长相混合的方法。当建立连接时,发送端初始化一个很小的拥塞窗口,然后发送方发送初始窗口大小的数据,如果有一个段在计时器超时前得到确认,那么窗口就增加一个段的字节量,每经过一个往返时间窗口就增加一倍。虽然叫慢速启动算法,但是他以指数增长,可以说并不慢。由于慢速启动导致拥塞窗口按指数增长,最终会出现他将太多的数据包以过快的速度发到网络,在路由器上产生队列,因为他们传递到接收端的速度不够快所以会发生丢包和拥塞。所以发送端为了控制慢启动算法会为每个连接维持一个慢启动阈值,拥塞窗口会不断增大直到拥塞窗口大小超过阈值或者接收端窗口满。当拥塞窗口到达阈值,TCP就从慢速启动(指数增大)切换到线性增大,即每经过一个往返时间拥塞窗口只增加一段,但是增长的结果仍然是拥塞窗口过大导致丢包,每当检测到丢包(超时),慢启动阈值就会设置为当前拥塞窗口的一半,整个过程在重新启动。
发送端如何发现丢包了呢?当一个数据包的后续包在该数据包之前达到接收端时,接收端就会被触发发送一些具有相同确认号的确认段,称为重复确认。因为包会选择网络中不同的路径,所以他们确实可能没按一定顺序到达接收端,不过仍然会发送重复确认。当收到三个重复确认即使计时器没有超时,被认为丢弃的包也会被重传。这种启发机制称为快速重传。重传就像丢包一样,阈值设为当前拥塞窗口的一半,拥塞窗口大小设为一个包,慢启动重头开始。如下所示:
但这是88年发布的4.2BSD TCP Tahoe。
90年发布的4.3BSD TCP Tahoe加入了快速恢复机制。把拥塞窗口快速重传时窗口大小减半,而不是变为1。丢包后每个往返时间拥塞窗口减半,每收到一个重复确认都会发送一个新的包,快速重传一个往返时间后丢失的包将被确认,快速回复结束,拥塞窗口设置带一个新的慢启动阈值,并开始按线性增长,避免了慢速启动。后来发生丢包再快速恢复。