📜  显式拥塞通知的工作

📅  最后修改于: 2022-05-13 01:56:17.594000             🧑  作者: Mango

显式拥塞通知的工作

显式拥塞通知 (ECN) 是 Internet 协议和传输控制协议的扩展。它在 RFC 3168 中定义。它允许在不丢弃数据包的情况下进行网络拥塞的端到端通知。 ECN 是一项可选功能,可以在两个启用 ECN 的端点之间使用,前提是底层网络基础设施也支持它。

在本文中,我们将看到显式拥塞通知的工作原理。

步骤 1:假设发送方和接收方之间进行了 ECN 协商。发送方和接收方在最初的握手中相互通知他们支持 ECN 算法。

ECN的工作

现在发送方正在向另一方发送数据包。它将在 IP 标头中设置 ECT 以通知路由器发送者和接收者都启用了 ECN 并且他们已经相互交谈。相反,如果 ECN 协商失败,则发送方将在数据包中设置非 ECT 码点。发送方正在发送 ECT,它可以是 ECT(0) 或 (1),因为两者是相同的。这是告诉路由器,如果发生拥塞,则不要丢弃此数据包,而是标记此数据包并转发。

步骤 2:在下图中,路由器正在使用 AQM 算法,请参见底部的队列。当这个数据包到达时,AQM 算法运行并告诉路由器丢弃这个数据包。但是等一下,IP 标头中的 ECT 位打开,路由器无法丢弃此数据包。因此,路由器会将 IP 标头中的 ECT 更改为 CE。 CE 表示路由器正在经历拥塞。 CE 从路由器发送到接收器。只有路由器有权将 ECT 更改为 CE,其他任何人都不能这样做。数据包与 ECT 一起出现并与 CE 一起出现,IP 标头被修改。

ECT [0 1] -> CE [1 1]

采用 AQM 算法的路由器

第 3 步:当接收方收到数据包时。接收方看到 IP 报头中的 CE 标志,就知道路由器拥塞了。现在接收方有责任通知发送方有关拥塞的信息。因此,接收方现在将在TCP 标头中而不是在 IP 标头中标记此拥塞信息,因为某些中间设备可能会使用 IP 标头进行调整。

接收方在 TCP 报头中标记 ECE 位。请注意,在进行 ECN 协商时使用 ECE 位。接收器将此 ECE 用于两个目的。发送者通过简单地检查数据包的上下文来避免这种混淆。因为当 SYN/ACK 位打开时,ECE 位指示 ECN 协商,而不是拥塞。但此时,ACK 数据包中的 ECE 位打开,因此发送方知道路由器已拥塞。

TCP 标头中的 ECE 位

第 4 步:现在 CE 标志到达发件人。发送者将其拥塞窗口减少一半。如果发送方使用 NewReno,则 cwnd 将减少 50%。但是,如果携带 CE 信息的 ACK 数据包由于拥塞而被丢弃并且没有到达发送者怎么办。因此,接收方将继续在后续数据包中发送此 CE 标志,直到收到发送方的确认。如果一个或多个 ACK 被丢弃,那么至少一个 ACK 将到达发送者并通知链路中的拥塞。接收方的配置方式是,它将继续发送 CE,直到到达发送方。

cwnd的工作

第 5 步:现在,发送者到达 CE 并且发送者将 cwnd 减少了一半。现在发送方必须通知接收方它已经减少了拥塞窗口以避免拥塞。发送方将在 TCP 报头中设置 CWR 标志以及在 IP 报头中设置 ECT。当数据包到达路由器时,如果路由器感觉到拥塞,它可以将 ECT 推销给 CE。当数据包到达接收方时,它将获得一个 CWR 标志,并停止在后续的 ACK 数据包中向发送方发送 CE 标志。

因此,IP 标头和 TCP 标头中的标志一起工作。

ECN中的IP头和TCP头

现在假设发送方获得 CE 标志并减少 cwnd 并向接收方发送 CWR 标志。直到 CWR 到达接收方,接收方将继续向发送方发送 CE 标志。根据规则,发送方每次收到 CE 时应将 cwnd 再次减少一半,但不会发生。发送方只会将拥塞窗口减半一次。它不会为每个 CE 减少它。发送方将检查 CE 是否属于当前拥塞窗口。如果 CE 不属于当前拥塞窗口,则说明这个 CE 是一个新的 CE,所以会降低 cwnd。此功能与 NewReno 在快速恢复阶段减少 cwnd 相同。

第 6 步:现在接收方已收到来自发送方的 CWR。因此,它将停止在后续的 ACK 数据包中发送 CE。

ECN 中的 ACK 数据包

Linux内核命令行:

方法:

  • 发送方在数据包的 IP 标头中设置 ECT 标志并将其转发给路由器。
  • 如果遇到拥塞,路由器将 ECT 转换为 CE,否则不会。
  • 接收方看到 CE 后,在 ACK 数据包的 TCP 报头中设置 ECE 标志,并将其转发给路由器。
  • 现在,路由器不能摆弄 ECE 标志,因为它在 TCP 标头中,路由器只能访问 IP 标头。
  • 当发送方收到 CE 时,它会在 TCP 头中发送 CWR,在 IP 头中发送 ECT,然后转发给路由器。
  • 当接收方收到 CWR 后,它会停止在后续的 ACK 包中发送 TCP 包中的 CE。