通信网络/TCP 和 UDP 协议/拥塞控制
介绍
当源发送的数据包数量超过目标所能处理的数量时,就会发生拥塞。当发生拥塞时,性能会下降。拥塞发生在目标端缓冲区填满时。数据包通常在转发到其上层之前,临时存储在源和目标的缓冲区中。
什么是拥塞?
假设我们正在观察目标。如果源发送的数据包数量超过目标缓冲区所能处理的数量,就会发生拥塞。当发生拥塞时,目标对到达的数据包只有两个选择,丢弃或保留。如果目标丢弃新到达的数据包并保留旧数据包,则这种机制被称为“Y”模型。如果目标丢弃旧数据包并用新数据包填充它们,则这种机制被称为“牛奶”模型。在这两种情况下,数据包都会被丢弃。检测拥塞的两种常见方法是超时和重复确认。
拥塞控制
拥塞控制可用于计算发送方可以在网络上发送给接收方的數據量。确定数据量并不容易,因为带宽会随着时间推移而变化,连接也会断开和重新连接。基于这些因素,发送方应该能够调整流量。TCP 拥塞控制算法用于检测和控制拥塞。以下是我们将要讨论的拥塞算法。
- 加性增长/乘性减小。
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
加性增长/乘性减小
此算法用于网络的发送方。拥塞窗口 SSIZE 是发送方在收到 ACK 之前可以发送到网络中的数据量。通告窗口 RSIZE 是接收方可以接收的网络上的数据量。TCP 源根据网络上的拥塞程度设置拥塞窗口。这是通过在拥塞增加时减小拥塞窗口,在拥塞减少时增大拥塞窗口来实现的。这种机制通常被称为加性增长/乘性减小。
源根据数据包丢失来确定拥塞。数据包丢失是在发生超时时确定的。源等待直到超时时间才能收到确认。在正常情况下,数据包不会丢失,因此源假设发生超时时就发生了拥塞。每当发生超时时,源都会将 SSIZE 设置为先前值的二分之一。这种机制被称为乘性减小。如果超时持续发生,窗口大小将一直减小,直到大小变为 1。这是因为拥塞窗口的最小值为 1。当发送方确定没有发生拥塞时,它会将拥塞窗口增加 1。这种增加是在每次发送方成功收到 ACK 后发生的,如下所示。 File:Congestion1.jpg
慢启动
加性增长/乘性减小方法的主要缺点是,发送方在检测到拥塞时将拥塞窗口减小一半,而对于每个成功收到的 ACK 只增加 1。如果窗口大小很大,或者拥塞窗口大小从 1 开始增加,那么我们将浪费许多拥塞窗口。慢启动算法用于解决这个每次只增加 1 的问题。SSIZE 是发送方在收到 ACK 之前可以发送到网络中的数据量。RSIZE 是接收方可以接收的网络上的数据量。SSTHOLD 是用于控制网络上数据流量的慢启动阈值。当 SSIZE 小于阈值 SSTHOLD 时,使用慢启动算法。在开始时,发送方不知道要发送多少数据。它必须找到要发送多少数据。最初,SSIZE 必须小于或等于 2*SMSS 字节,并且不能超过 2 个段。随着数据包的发送,SSIZE 会呈指数增长,直到 SSIZE 大于 SSTHOLD 或检测到拥塞。
当发送方检测到拥塞时,它会将拥塞窗口减小到先前值的一半。同样,慢启动算法用于增加拥塞窗口。
拥塞避免
SIZE 是发送方在收到 ACK 之前可以发送到网络中的数据量。RSIZE 是接收方可以接收的网络上的数据量。SSTHOLD 是用于控制网络上数据流量的慢启动阈值。当 SSIZE 大于阈值 SSTHOLD 时,使用拥塞避免算法。随着数据包的发送,SSIZE 每往返时间增加一个完整的段。这将持续进行,直到检测到拥塞。
快速重传
以上三种算法都使用超时来检测拥塞。这里的缺点是发送方需要等待超时发生。为了提高拥塞检测,发送方使用重复 ACK。每次数据包到达接收方时,接收方都会向发送方发送 ACK。当数据包以乱序到达接收方时,TCP 无法立即确认数据包中包含的数据,因为先前的数据包尚未到达。接收方发送上次发送的相同 ACK,导致重复 ACK。这在下图中进行了说明。
从发送方的角度来看,重复 ACK 可能来自许多网络问题。发送方不能假设发送的数据包丢失了,重复 ACK 可能是由段重排序、ACK 复制或段复制触发的。因此,发送方等待 3 个重复 ACK 来确定数据包丢失。TCP 会在未等待重传计时器到期的情况下,重新传输看起来丢失的段。
快速恢复
快速恢复算法控制新数据的传输,直到收到非重复 ACK。不执行慢启动的原因是,收到重复 ACK 不仅表明一个段已丢失,而且还表明段很可能离开了网络。快速重传和快速恢复算法通常一起实现,如下所示。1. 当收到第三个重复 ACK 时,将 STHOLD 设置为不超过 STHOLD = max (FlightSize / 2, 2*SMSS),其中 FlightSize 是网络中未完成数据的量。2. 重新传输丢失的段并将 SSIZE 设置为 STHOLD 加上 3*SMSS。这会人为地“膨胀”拥塞窗口,以反映已离开网络且接收方已缓冲的段数量(三个)。3. 对于收到的每个额外的重复 ACK,将 SSIZE 增加 SMSS。这会人为地膨胀拥塞窗口,以反映已离开网络的额外段。4. 传输一个段,如果新的 SSIZE 值和接收方通告的窗口允许。5. 当下一个 ACK 到达并确认了新数据时,将 SSIZE 设置为 STHOLD(在步骤 1 中设置的值)。这被称为“压缩”窗口。此 ACK 应该是由步骤 1 中的重新传输引发的确认,在重新传输后一个 RTT(尽管它可能在接收方存在大量乱序数据包传输的情况下更早到达)。此外,此 ACK 应该确认在丢失的段和收到第三个重复 ACK 之间发送的所有中间段,如果这些段没有丢失。
常见问题解答
是什么导致了这种拥塞?当源发送的数据包数量超过目标所能处理的数量时,就会发生拥塞。当发生拥塞时,性能会下降。拥塞发生在目标端缓冲区填满时。数据包通常在转发到其上层之前,临时存储在源和目标的缓冲区中。假设我们正在观察目标。如果源发送的数据包数量超过目标缓冲区所能处理的数量,就会发生拥塞。
发生拥塞时会发生什么?当发生拥塞时,目标对到达的数据包只有两个选择,丢弃或保留。如果目标丢弃新到达的数据包并保留旧数据包,则这种机制被称为“Y”模型。如果目标丢弃旧数据包并用新数据包填充它们,则这种机制被称为“牛奶”模型。在这两种情况下,数据包都会被丢弃
如何检测拥塞?检测拥塞的两种常见方法是超时和重复确认。