- 拥塞处理和流量控制不同,后者是作用于接收方,保证接收方来得及接受数据。而前者是作用于网络,防止过多的数据拥塞网络,避免出现网络负载过大的情况。
- 拥塞处理包括了四个算法,分别为:慢开始,拥塞避免,快速重传,快速恢复
慢开始算法
慢开始算法,顾名思义,就是在传输开始时将发送窗口慢慢指数级扩大,从而避免一开始就传输大量数据导致网络拥塞。想必大家都下载过资源,每当我们开始下载的时候都会发现下载速度是慢慢提升的,而不是一蹴而就直接拉满带宽
慢开始算法步骤具体如下
- 连接初始设置拥塞窗口(
Congestion Window
) 为1 MSS
(一个分段的最大数据量) - 每过一个
RTT
就将窗口大小乘二 - 指数级增长肯定不能没有限制的,所以有一个阈值限制,当窗口大小大于阈值时就会启动拥塞避免算法。
拥塞避免算法
-
拥塞避免算法相比简单点,每过一个
RTT
窗口大小只加一,这样能够避免指数级增长导致网络拥塞,慢慢将大小调整到最佳值。 -
在传输过程中可能定时器超时的情况,这时候
TCP
会认为网络拥塞了,会马上进行以下步骤:1.将阈值设为当前拥塞窗口的一半
2.将拥塞窗口设为1 MSS
3.启动拥塞避免算法
快速重传
快速重传一般和快恢复一起出现。一旦接收端收到的报文出现失序的情况,接收端只会回复最后一个顺序正确的报文序号。如果发送端收到三个重复的
ACK
,无需等待定时器超时而是直接启动快速重传算法。具体算法分为两种:
TCP Taho 实现如下
- 将阈值设为当前拥塞窗口的一半
- 将拥塞窗口设为
1 MSS
- 重新开始慢开始算法
TCP Reno
实现如下
拥塞窗口减半
- 将阈值设为当前拥塞窗口
- 进入快恢复阶段(重发对端需要的包,一旦收到一个新的
ACK
答复就退出该阶段),这种方式在丢失多个包的情况下就不那么好了 - 使用拥塞避免算法
TCP New Ren 改进后的快恢复
TCP New Reno
算法改进了之前TCP Reno
算法的缺陷。在之前,快恢复中只要收到一个新的ACK
包,就会退出快恢复。- 在
TCP New Reno
中,TCP
发送方先记下三个重复ACK
的分段的最大序号。
假如我有一个分段数据是
1 ~ 10
这十个序号的报文,其中丢失了序号为3
和7
的报文,那么该分段的最大序号就是10
。发送端只会收到ACK
序号为3
的应答。这时候重发序号为 3 的报文,接收方顺利接收的话就会发送ACK
序号为7
的应答。这时候TCP
知道对端是有多个包未收到,会继续发送序号为7
的报文,接收方顺利接收并会发送ACK
序号为11
的应答,这时发送端认为这个分段接收端已经顺利接收,接下来会退出快恢复阶段。