2011年6月30日星期四

  Explicit Congestion Notification

ECN是一个IP协议和TCP协议的扩展,详细定义请见RFC 3168 (2001)

ECN允许端到端的网络拥塞通告,不同于通常我们使用的方式,即通过丢包来判断拥塞。ECN作为一个可选项,需要通信双方同时支持。当ECN被成功的协商后,一个支持ECN的路由器可以在IP头设置一个代替丢包的位来预警即将发生的拥塞。需要注意的是,有些老的网络设备会丢弃带有ECN位的包而不是仅仅忽略这个位。

IP中ECN的操作方式

ECN使用IP头中的两个比特的区分服务位(DifServ)来表明四种不同的代码点。
00代表Non ECN-Capable Transport -- Noe-ECT; 10代表ECN Capable Transport – ECT(0); 01代表ECN Capable Transport – ECT(1); 11代表Congestion Encountered – CE

当通信双方支持ECN时,他们将ECN位置为ECT(0)或ECT(1)。如果数据包穿过一个动态队列管理的队列(AQM),例如使用RED的队列,它们是支持ECN的,设备将改变代码点为CE来代替丢包。这个操作是为了告诉接收端即将出现拥塞。在接收端这个拥塞的通知被上层协议处理(TCP协议),然后需要被回馈给发送方以此来降低发送速率。

由于CE需要被TCP来处理,ECN必须联合TCP共同使用:需要支持拥塞控制;需要有方法将CE回馈给发送方。

TCP中ECN的操作方式

TCP支持ECN通过TCP头的两个标志位。这两个位被用来回馈可能出现的拥塞同时也确认拥塞的通告已经被成功接收。两个标志位分别叫做ECN-Echo(ECE)和Congestion Window Reduced(CWR)

因为ECN是可选的,如果要使用ECN需要在SYN和SYN-ACK中进行协商。

实现

Microsoft Windows:Windows Server 2008, Windows 7, and Windows Vista均支持ECN for TCP,但是默认是关闭状态。通过下面命令开启:netsh interface tcp set global ecncapability=enabled

Apple Macintosh: Mac OS X 10.5和10.6支持ECN for TCP。使用下面的sysctl变量来控制:net.inet.tcp.ecn_negotiate_in(enable ECN on incoming connections that already have ECN flags set), net.inet.tcp.ecn_initiate_out (try to initiate outgoing connections with ECN enabled). Both variables default to 0, but can be set to 1 to enable the respective behavior: sysctl -w net.inet.tcp.ecn_negotiate_in=1 and sysctl -w net.inet.tcp.ecn_initiate_out=1
To make the settings persistent, put following lines in /etc/sysctl.conf:
net.inet.tcp.ecn_initiate_out=1
net.inet.tcp.ecn_negotiate_in=1

Linux:Linux Kernal支持三种状态的ECN for TCP,分别是 no ECN(0),Use ECN(1), Support ECN/Server Mode(2)。如果对方支持ECN,默认被设置为支持。在大多数系统可以通过下面查看支持情况:sysctl net.ipv4.tcp_ecn=1

没有评论:

发表评论