標籤:
本文轉自: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。
【轉】TCP ECE/CWR標識位