本文轉自:http://blog.sina.com.cn/s/blog_7fc4c23d0101fa0z.html
當前的TCP實現將TCP端節點之間的中間網絡視為一個不透明的“黑盒”。TCP包進入和流出這個盒子。有些時候進入盒子的包被丟失了。因為今天的數字和光媒體上出現比特級錯誤的機會非常少,TCP的設計者們就假設包的丟失很大程度上是因為路由器的擁塞
TCP對ECN的支持
當一個IP包的ECN域被路由器設置為11時,接收端而非發送端被通知路徑上發生了擁塞。ECN使用TCP頭部來告知發送端網絡正在經歷擁塞,並且告知接收端發送段已經受到了接收端發來的擁塞通告,已經降低了發送速率。
圖2
TCP對ECN的支持使用TCP中預先定義的保留位。ECN定義兩個新的標志,如圖2所示:
- ECE:ECN響應標志被用來在TCP3次握手時表明一個TCP端是具備ECN功能的,並且表明接收到的TCP包的IP頭部的ECN被設置為11。更多信息請參考RFC793。
- CWR:擁塞窗口減少標志被發送主機設置,用來表明它接收到了設置ECE標志的TCP包。擁塞窗口是被TCP維護的一個內部變量,用來管理發送窗口大小。
當兩個支持ECN的TCP端進行TCP連接時,它們交換SYN,SYN-ACK和ACK包。對於支持ECN的TCP端來說,SYN包的ECE和CWR標志都被設置了。SYN-ACK只設置ECE標志。
一個支持ECN的TCP主機在支持ECN的TCP連接上發送設置了IP頭部為10或者01的TCP包。支持ECN的路由器在經歷擁塞時設置IP頭部的ECN域為11。當一個TCP接收端發送針對收到的一個設置ECN位為11的TCP包的響應時,它設置TCP包頭中的ECE,並且在接下來的ACK中也做同樣設置。
當發送主機接收到設置了ECE標志的ACK時,它就像感知到包丟失一樣,開始減少發送窗口,運行慢啟動過程和擁塞避免算法。在下一個數據包中,發送者設置CWR標志。在接收到新的設置CWR標志的包時,接受者停止在接下來的ACK中設置ECE標志。
ECN例子
圖3
圖3展示了一個在支持ECN的TCP端節點之間的一個TCP連接的例子,它們之間的一個支持ECN的路由器正在經歷擁塞。
在這個例子中,TCP端A發送數據給TCP端B。TCP端A一次性發送5個包。包2通過一個擁塞的支持ECN的路由器轉發,將IP包頭的ECN位設置為11。當TCP端B接收到這個包,它發送設置了ECE標志的ACK。當TCP端A接收到第一個設置了ECE的ACK以后,它降低發送速率,並且在發送下一個包(6)時設置其CWR標志。通過接收包6,TCP端將不對接下來的ACK包設置ECE標志。詳情請參考RFC 3168。
Windows對ECN的支持
Windows Vista支持ECN但是缺省是關閉的。你可以通過netsh interface tcp set global ecncapability=enabled來打開支持。因為ECN使用到了IP和TCP包頭中以前未使用或者保留的位,中間的網絡設備如路由器和防火牆將會靜默地丟棄ECN域設置為非0值的包。為了防止出現這種情況,請對你的網絡設備進行適當的配置和升級以支持ECN。