网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

什么是ECN( Explicit Congestion Notification)?

更新时间:2026年03月27日   作者:spoto   标签(Tag):

ECN代表的是“Explicit Congestion Notification”算法。它并非像Slow Start、Restart或AIMD那样用于拥塞控制的算法。该算法的唯一职责就是向发送方通报路由器处的拥塞情况。因此,ECN实际上是一种拥塞通知或拥塞信号传递算法。它通过向发送方通报拥塞情况,从而促使发送方采取相应的措施来避免拥塞现象的发生。

ECN是一种在RFC 3168中定义的拥塞信号机制。它诞生于1999年,并于2001年左右正式确立。该机制在TCP头部使用两个比特位,在IP头部则使用两个比特位来标记数据包。其实现方式是通过在头部中翻转某个比特位来实现对数据包的标记。

假设X正在将一封信寄给一个人Z,而这个人Z离他只有两栋房子的距离。
=> X将信封递给中间人Y。
=> Y会看看他是否会出现拥堵的情况。
=> 如果Y所在的位置变得拥挤不堪,那么他就会用笔在信封上画个叉号来表示。
把信封的其中一个角折起来,然后把它交给下一个人。
当Z收到这个信封时,它会注意到信封上有一个十字标记。
意识到其中某个中间人已经不堪重负了。
=> Z将会向发送者X发送一个相同的ACK响应。
在ACK信封上标记出来。通过查看该标记,就可以了解是否存在拥塞情况。

ECN可以与AQM算法一起使用。 我们已经了解到了AQM算法的工作原理:当链路变得拥塞时,该算法会主动地丢弃那些数据包。 但是,如果这些数据包不是被“丢弃”,而是可以被“标记”的话,那该多好啊。那样就太棒了。 由于ECN不会丢弃这些数据包,因此也就避免了重新传输的情况。 这就是为什么在当今时代,ECN算法如此受欢迎的原因。 因为,这样做的目的只是为了让路由器能够识别出是已知的发送者导致了拥塞情况。那么,既然我们可以通过ECN来通知发送者这一情况,为什么还要丢弃那些数据包呢? 此外,丢弃数据包并不会立即让发送方意识到网络拥塞的情况。 对于需要快速传输的数据包来说,这一点非常重要,因为这些数据包的流量非常低。

为了使用ECN机制,发送方、接收方以及路由器都必须支持ECN功能。目前,ECN已经被实现在所有操作系统上,比如手机、服务器、笔记本电脑,甚至包括路由器这样的中间设备。不过,默认情况下,ECN功能是关闭的。原因并非是因为ECN本身存在什么问题,而是因为ECN是与AQM算法一起被部署使用的。而AQM算法因为其参数配置方面的复杂性,所以并不那么受欢迎。

符合RFC 3168的标准要求:ECN不得应用于TCP控制数据包。作者强烈建议不要对控制数据包使用ECN。控制数据包的例子包括:SYN、SYN/ACK、ACK、FIN、RST、PSH、URG。因此,只有数据数据包才应该被标记为ECN。

TCP头部中的ECN位:

这2位比特是从预留的部分中取得的。现在,还有4位比特被保留下来,而2位比特则被ECN所占用。这2位比特分别是CWR和ECE。请注意它们的排列顺序。我们无法改变这两个标志位的顺序。CWR位于左边,而ECE则位于右边。

  • CWR:拥塞窗口减少标志
  • ECE:ECE Echo

因为这里只有2位,所以总共有4种可能的组合。这些组合在这里被称为“编码点”。

TCP头部中的ECN代码点

S. 编号:CWRECE 编码点:从…发送到…1.2. 3. 4.
00非ECN模式设置任何任何
1ECN 回声接收器发送者
0拥塞窗口已降低发送者接收器
11ECN设置发送者接收器
  • [0 0] 是一种非ECN模式的编码点。这种编码点可以从任何地方发送到任何地方。当X和Y共享这个编码点时,这意味着X表示自己不支持ECN模式。
  • [0 1] 是ECN Echo的编码点。这个编码点是由接收方发送给发送方的。首先,当发送方告知接收方自己支持ECN时,接收方会告诉发送方自己是否也支持ECN。如果接收方支持ECN,那么它就会用这个编码点进行回复。此外,当接收方告知发送方存在拥塞情况时,也会使用这个编码点。因此,这个编码点具有两种用途。
  • [1 0] 是CWR的编码点。这个编码点是由发送方发送给接收方的。该编码点被用作确认信息,由发送方发送给接收方。当发送方得知存在拥塞情况时,它会通知接收方,要求其降低其拥塞窗口的大小。
  • [1 1] 是ECN设置的代码点。这个代码点是由发送方发送给接收方的。通过这个代码点,可以表明发送方支持ECN协议。

ECN协商:

  • 步骤1:发送方通过指定的编码点向接收方发送SYN数据包。这里的ECN设置意味着CWR=1且ECE=1。发送方表明自己支持ECN协议。这些信息在通过三路握手建立TCP连接时,会包含在SYN数据包中。现在,接收方需要回复发送方,告知其关于ECN的支持情况。
  • 步骤2:如果接收方支持ECN功能,那么它会通过ECN-Echo编码点来向发送方发送回信息。此时,CWR为0,ECE为1,这表示接收方也支持ECN功能。如果接收方不支持ECN功能,那么它就会回复CWR为0且ECE为0。这就是第四个编码点所表示的含义。这种情况下,接收方不支持ECN功能。这个编码点可以由发送方与接收方共同使用。
  • 步骤3:现在,ECN信息正在由发送方和接收方进行交换。发送方可以像往常一样向接收方请求数据。

但是,如果发送方和接收方都支持ECN协议的话,那么就必须对数据包进行标记,而不是将其丢弃。路由器无法读取TCP头部信息,它只能读取数据包的IP头部信息。因此,在IP头部中使用了2位来告知路由器关于ECN协议的信息。

IP头部中的ECN位:

路由器负责执行AQM算法,同时还需要对数据包进行标记。因此,路由器必须知道发送方和接收方是否支持ECN功能。由于这一原因,路由器无法访问TCP头部的信息,所以需要在IP头部添加两个新的位。请查看IP头部的第三个字段,那里有8个比特位被预留出来用于区分服务。其中,有2个比特位被用于表示ECN编码点。

第一个代码段被称为ECT:具备ECN功能的传输方式。第二个代码段则被称为CE:经历拥塞情况的传输方式。同样,这里也会存在四个代码点,但这些代码点与发送方和接收方所使用的ECN代码点有所不同。

IP头部中的ECN编码点:

编号:ECTCE 发送方:从…到…1. 2. 3.4. 
00非ECT任何任何
01ECT(1):具备ECN功能的运输工具发送者接收者
10ECT(0):具备ECN功能的运输工具发送者接收者
1CE:经历过拥堵情况的人路由器接收者
  • [0 0]表示该数据包不支持ECN协议。也就是说,该数据包无法被处理。因此,没有必要标记这个数据包。如果此时存在拥塞情况,那么就必须丢弃这个数据包,而不是对其进行标记处理。
  • [0, 1] 是 ECT(0)编码点,这意味着该数据包支持 ECT 协议。
  • [10] 是 ECT(1)的编码点,这也意味着该数据包被启用了ECT功能。如果某个数据包的ECT值为0或1,那么路由器不会丢弃该数据包,而是会将其标记为某种状态。
  • [1 1] 是CE编码点。当路由器处于拥塞状态,且数据包启用了ECT功能时,路由器会将该数据包标记为CE。此时,路由器会翻转ECT编码点中的0位,使其变为CE状态。这样,数据包并不会被丢弃,而是被标记为CE状态后继续传输到接收端。
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料