TCP --- 拥塞控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hudazhe/article/details/80173876

网络发生拥塞的原因:
当数据到达一个较大的管道并向一个较小的管道发送数据时便会发生拥塞。
当多个输入流到达同一个路由器,而路由器的输出流小于输入流时也会发生拥塞。

拥塞控制:
避免过多的数据注入到网络中,这样可以减轻网络中路由器或链路的负载。

拥塞避免是发送方使用的流量控制,发送方感受到的网络拥塞的估计。
通告窗口是接收方进行的流量控制,接收方在该连接上的可用缓存大小。

在讨论拥塞控制算法前,我们需要知道两个概念:
1. 拥塞窗口 — cwnd
TCP 输出例程不能超过 cwnd 和 接收方通告窗口的大小。
2. 慢启动门限 — ssthresh
当拥塞发生时,ssthresh 被设置为当前窗口大小的一般。

慢启动

慢启动为发送方的 TCP 增加了另一个窗口:拥塞窗口。
当两台主机建立TCP链接时,拥塞窗口被初始化为 1 个报文段。
每收到一个 ACK, 拥塞窗口就增加一个报文段。发送方取拥塞窗口与通告窗口中的最小值作为发送上限 。

在某个时间点上,可能达到了网络的最大容量,于是中间路由器开始丢弃分组,这样就通知发送方它的拥塞窗口开的过大。

拥塞避免算法

拥塞避免算法是一种处理丢失分组的方法。
算法假定由于分组损坏而造成的丢失是很少的,所以分组丢失意味着在源主机和目的主机之间的某处网络上发生了拥塞。

拥塞避免算法要求每次收到一个确认时将 cwnd 增加 1/cwnd。是一种线性增长。

分组丢失指示:发生超时或收到重复确认 。

实际中慢启动和拥塞避免算法通常在一起实现:
工作过程:
1. 对一个连接,初始化 cwnd 为一个报文段,ssthresh 为 65535 字节。
2. TCP 输出例程不能超过 cwnd 和 通告窗口的大小。
3. 当拥塞发生时,ssthresh 被设置为当前窗口大小的一半(cwnd 和 通告窗口的最小值,但最少为 2 个报文段)。如果是超时引起了拥塞,则 cwnd 被设置为 1 个报文段。
4. 当新的数据被确认时,就增加 cwnd,增加的方法

当 cwnd 小于 ssthresh,进行慢启动,否则进行拥塞避免。
慢启动一直持续到我们回到拥塞发生时所处位置一般的时候才停止,然后执行拥塞避免。

快速重传和快速恢复算法

同上面的两个算法一样,快速重传和快恢复通常也是放在一起实现的。

由于我们并不能直到一个重复的 ACK 报文是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的 ACK 到来。

如果一连串收到3个或三个以上重复的 ACK,就非常可能是一个报文段丢失了。于是重传丢失的数据报文段,而不需要等待超时定时器,这就是快速重传。
在快速重传后,执行的不是慢启动算法而是拥塞避免算法,这就是快恢复算法。

工作过程:
1. 当收到第三个重复的 ACK 时,将 ssthresh 设置为当前拥塞窗口的一半,重传丢失的报文段,设置 cwnd 为 ssthresh + 3*报文段大小。
2. 每收到一个重复的 ACK 时,cwnd 增加一个报文段大小并发送一个分组。
3. 当下一个确认新数据的 ACK 到达时,设置 cwnd 为 ssthresh。(ACK 是对重传后的报文的确认)。

展开阅读全文

没有更多推荐了,返回首页