TCP使用两个标志(ECE和CWR)协商和实现传输中的显式拥塞机制。在发生拥塞时,TCP的接收方发送置有ECE标志的数据包,直到它接收到置有CWR标志的数据包,这意味着发送者观察到了拥塞,并且减小的拥塞窗口。
ECN标志决定了在发送TCP数据时,TCP头的ECN字段值,它可能有如下值:
TCP_ECN_OK : 此TCP连接可以使用ECN功能。
TCP_ECN_QUEUE_CWR: 源于TCP接收方(丢包)的CWR。
TCP_ECN_DEMAND_CWR: TCP发送者出现拥塞(IP报文报告),需要收缩拥塞窗口。
在sysctl (sysctl_tcp_ecn)允许使用ECN的情况下:
在发送的SYN的TCP头部中设置 ECE 和 CWR 字段。
ECN 标志设置为TCP_ECN_OK
在sysctl (sysctl_tcp_ecn)允许使用ECN的情况下,并且输入SYN的TCP头部中设置了 ECE 和 CWR 字段,就将ECN标志设置为TCP_ECN_OK
如果ECN标志为TCP_ECN_OK,设置输出SYN-ACK报文中TCP头部的ECE 标志。
接收到SYN时处理ECN (),如果接收到的SYN的连接的ECN标志是TCP_ECN_OK,但SYN报文的 ECE 或者 CWR 标志没有置位,就会清理TCP_ECN_OK。
以 SYN-ACK作为回应 () ,将接收的到SYN作如下修改发送出去:
CWR标志复位
如果ECN标志不是TCP_ECN_OK,就将ECE标志复位为0
如果连接的ECN标志为TCP_ECN_OK ,但接收到的SYN-ACK标志既没有设置 ECE 也没有设置 CWR ,将关掉ECN标志中的TCP_ECN_OK
显式拥塞的触发原因可能主要是两个事件:
如果TCP因为观察到本地设备上的拥塞( ),而无法发送数据。
接收到ICMP Source Quench ( )
此时,就设置TCP_ECN_DEMAND_CWR。
在接收到数据时,执行以下ECN处理:
如果对端带有CWR标志,复位TCP_ECN_DEMAND_CWR 标志,因此接下来的数据包不再需要减少拥塞窗口了。
如果这个连接 TCP_ECN_OK,并且输入IP头部中置有 CE 标志位,就设置标志TCP_ECN_DEMAND_CWR。
如果这个连接 TCP_ECN_OK,但是输入IP头部中ECT标志没有置位,这表示它是一个重传的数据包,TCP进入快速确认模式。
如果数据包不是被重传的:
设置IP头中的 ECT 标志。
如果减少了拥塞窗口,通过设置TCP头的CWR标志通知对方。
如果是在重传数据,复位IP报文头部的ECT位。如果接收到CE标志(即进入了TCP_ECN_DEMAND_CWR),就设置要发送的数据的TCP头部中的ECE 位。
在以下条件下对方的拥塞通知:
接收到的数据包置有ECE位。
不是 SYN packet
TCP_ECN_OK (ECN 可用)
在因为检测到丢包而减少拥塞窗口时,如果TCP_ECN_OK 就设置ECN标志为TCP_ECN_QUEUE_CWR。
在TCP要恢复减少的拥塞窗口时,会复位 TCP_ECN_DEMAND_CWR。
原文地址:
维护:
翻译: raise.sail@gmail.com