Explicit Congestion Notification
Explicit Congestion Notification (ECN) 是对 Internet Protocol 和 Transmission Control Protocol 的拓展,定义于 RFC 3168(2001) 中。ECN 允许端到端的通知 network congestion 而不丢失数据包。ECN 是一个可选的特性,可能被用于两个 ECN-enabled 的终端之间,当底层的网络基础结构也支持的时候。
依照惯例,TCP/IP 网络通过丢弃 packets 来通知拥塞。当 ECN 被成功协商时,ECN-aware 路由器可能在 IP header 中设置一个标识,而非丢弃 packet 以通知即将发生的拥塞。packet 的接收方将拥塞指示反馈给发送方,它会向检测到 packet 丢弃一样减少它的传输率。
Operation
ECN 需要位于 Internet layer 和 transport layer 的特定支持,理由如下:
- 在 TCP/IP 中,路由器运行在网络层,而传输率有运输层的终端处理。
- 拥塞仅能由发送端处理,但是因为只有在 packet 被发送后才知道发生了拥塞,因此必须通过接收方向发送方反馈拥塞指示。
没有 ECN,拥塞指示反馈通过检测 packet 的丢弃间接实现。使用 ECN,拥塞通过设置 IP packet 中的 ECN 字段为 CE (Congestion Encountered) 来指示;通过在传输协议的 header 中设置合适的位,拥塞指示由接收方反馈给发送方。例如,使用 TCP 时,通过设置 ECE 位反馈拥塞指示。
Operation of ECN with IP
ECN 使用 IPv4 和 IPv6 header 中 Traffic Class 字段的最低两位 (最右边) 进行编码:
- 00 - Non ECN-Capable Transport, Non-ECT
- 10 - ECN Capable Transport, ECT(0)
- 01 - ECN Capable Transport, ECT(1)
- 11 - Congestion Encounted, CE
当两端都支持 ECN 时,它们将它们的 packet 标识位 ECT(0) 或 ECT(1)。路由器将 ECT(0) 和 ECT(1) 看作是等价的。如果 packet 穿过 active queue management (AQM) 队列 (e.g.,使用 random early detection(RED) 的队列),AQM 队列正在拥塞,且对应的路由器支持 ECN,它会将 code point 改为 CE 而不是丢弃 packet。这种行为被称为 “marking” 且它的目的是通知接收端即将发送的拥塞。在接收端,拥塞通知由上层协议 (传输层协议) 处理,且需要反馈到发送节点以通知它减少传输速率。
当接收到有 Congestion Experienced code point 的 IP packet 时,TCP 接收方使用 TCP header 中的 ECE flag 来反馈拥塞指示。当终端收到具有 ECE bit 的 TCP segment,它如同packet 被丢弃一样减少它的拥塞窗口。随后它通过发送一个设置了 CWR bit 的 segment 来确认这个拥塞通知。
节点持续发送设置 ECE bit 的 TCP segment ,直到它收到了设置 CWR bit 的 TCP segment。
使用 tcpdump 查看受影响的 packets,使用筛选谓词 (tcp[13] & 0xc0 != 0)
。
ECN and control packets
因为 Transmission Control Protocol (TCP) 对 control packets (pure ACKs,SYN,FIN segments) 不执行拥塞控制。control packets 通常不被标记为 ECN-capable。
2009年的一项提案[7]建议将SYN-ACK包标记为支持ecn的。这种改进被称为ECN+,已被证明可以显著提高 short-lived TCP connections 的性能。
Operation of ECN with other transport protocol
ECN 也能对其他传输层协议执行拥塞控制,特别是 DCCP 和 [Stream Control Transmission Protocol] (SCTP) 。其基本规则与 TCP 类似,尽管在 on-the-wire encoding 的细节上有所不同。
Effects on performance
因为 ECN 仅当与 Active Queue Management (AQM) 政策结合使用时才有效果,ECN 的有点依赖于使用精确的 AQM。然而,一些观测结果,似乎在不同的 AQMs 中都成立。
正如所期望的,ECN 减少了 TCP 连接丢弃的 packets 的数量,ECN 避免了重传,减少了延迟,很大程度上减少了抖动。当 TCP 连接有一个未完成的 segment 时,这一影响最为明显,当它能够避免 RTO 超时;这通常是在交互式连接的情况下,比如远程登录,和事务性协议,比如 HTTP 请求,SMTP 的会话阶段,或 SQL 请求。
ENC 对批量吞吐量的影响不太清楚,因为现代 TCP 实现十分擅长当发送方的 window 很大时,重传丢弃的 segments。
当使用的 AQM 算法从不丢弃 packets 时,在高拥塞的网络中使用 ECN 被发现会影响性能。现代 AQM 实现通过在高负载时丢弃 packets 而不是标记 packets 来避免这一缺陷。