在TCP中,CWR(Congestion Window Reduced)和ECN(Explicit Congestion Notification)是两个与拥塞控制紧密相关的标志位:

  • ECN:允许网络路由器在不丢弃数据包的情况下,向发送方和接收方显式地发出网络拥塞的信号。
  • CWR:CWR标志是发送方对ECN拥塞信号的确认。当发送方收到一个带有拥塞通知的数据包时,它会设置CWR标志,表示它已经执行了拥塞控制动作(减小拥塞窗口)来缓解网络拥塞。

简而言之,ECN负责通知,CWR负责确认。它们协同工作,共同提升TCP在网络拥塞时的性能。

工作流程

1. 协商阶段

发送方:在TCP三次握手时,发送方在SYN数据包中设置ECN-Echo和CWR标志,向接收方表明自己支持ECN。

接收方:如果接收方也支持ECN,它会在SYN-ACK数据包中设置ECN-Echo标志,向发送方确认它也支持ECN。

2. 拥塞通知阶段

发送方:在数据传输过程中,发送方会将数据包的IP头部中的ECN字段设置为ECN Capable Transport(ECT),告诉路由器该数据包可以被标记为拥塞。

路由器:当路由器检测到网络队列即将满员(拥塞)时,它不会立即丢弃数据包。相反,它会将数据包的ECN字段从ECT改为Congestion Experienced(CE),然后将数据包转发给接收方。

IP协议头中有个2bit的ECN字段:

  • 00 – 非ECN能力传输,非ECT
  • 10 – 支持 ECN 的传输,ECT(0)
  • 01 – 支持 ECN 的传输,ECT(1)
  • 11 – 遇到拥塞,CE。

3. 拥塞响应阶段

接收方:当接收方收到一个ECN字段为CE的数据包时,它会知道网络发生了拥塞。在回复给发送方的ACK数据包中,接收方会在TCP头部设置ECN-Echo标志,将拥塞信息反馈给发送方。

4. 拥塞控制阶段

发送方:发送方收到带有ECN-Echo标志的ACK数据包后,就会知道网络拥塞了。这时,它会像丢包发生时一样,立即采取拥塞控制措施(拥塞窗口cwnd减小),以降低发送速率。在发送下一个数据包时,发送方会设置CWR标志,表示它已经执行了拥塞控制。

接受方:接收方收到带有CWR标志的数据包后,就知道发送方已经处理了拥塞通知,下次发送的ACK就不需要再设置ECN-Echo。