引用维基百科:
“当两个端点都支持 ECN 时,它们会使用 ECT(0) 或 ECT(1) 标记其数据包。路由器将 ECT(0) 和 ECT(1) 代码点视为等效。如果数据包遍历活动队列管理 (AQM) 队列(例如,使用随机早期检测(RED)的队列遇到拥塞并且相应的路由器支持ECN,它可能会将代码点更改为CE而不是丢弃数据包。此行为称为“标记”及其目的是通知接收端点即将发生拥塞。在接收端点,该拥塞指示由上层协议(传输层协议)处理,并且需要回显给发送节点,以便向其发出信号以降低其传输速率. ”
因此,拥塞反馈机制是在传输层(TCP)中通过接收端发送ECE标志设置为1的报文来实现的。我的问题是,为什么首先遇到拥塞的路由器不直接发送例如ICMP消息立即返回给发送者(我知道ICMP没有拥塞选项,但是,不能简单地实现吗?)以便发送者可以更早地减少其拥塞窗口?为什么要等到数据报到达接收端?如果这些数据段到达接收端的时间足够长,导致发送方突发传输,从而导致缓冲区膨胀(这可能已通过早期通知来阻止),从而导致路由器上的其他连接甚至经历高延迟和抖动,会发生什么情况如果可能是很短的一段时间?
可能的情况是,这对网络的有益影响并不值得付出努力,而接收端之所以是回显拥塞的一方,可能是因为路由器无法费心在网络中准备控制消息。许多连接都受到监管的环境。但是,我找不到有关此主题的任何来源。
此外,我首先想到也许数据包需要经过所有路由节点以明确正在经历拥塞的节点,但是,没有一个信息选项可以跟踪帧、数据报、和段头字段。我认为这些段到达接收端发送拥塞反馈而不是直接由路由器发送的另一个原因是在传输层(特别是 TCP)上保持拥塞控制,但互联网层(例如 IPv4)也通过以下方式支持拥塞信息: 2位ECN字段,这让我质疑这个原因。不过,我不确定我的推理是否有实际意义。
这样的机制早在 1980 年就已经存在了——它就是ICMP“Source Quench”消息。(它于 1995 年被删除;我记得读过有关它的帖子,有一个不够精确的问题,并且受到欺骗的“Source Quench”数据包的影响。)
因此,已经有关于ECN 与 Source Quench 的讨论:
根据https://wiki.geant.org/pages/releaseview.action?pageId=121340501:
根据https://personal.utdallas.edu/~kxs028100/courses/Papers/explicit-congestion-notification.pdf:
根据https://end2end-interest.postel.narkive.com/PlR0pX2J/e2e-ecn-vs-source-quench: