先梳理兩個概念:
什麼是高時延帶寬乘積的網絡環境(帶寬(Byte/s)*時延>64k字節):
1)衛星傳輸(時延550ms),帶寬1Mbps以上。(1024*1024)/8 *0.6=72090字節。
2)跨國internet訪問或國際電路(時延200ms),帶寬超過2.6Mbps以上。
3)千兆網絡已經很流行了,時延>=1ms,都算。更不要說萬兆網絡
TCP滑動窗口如何進行流量控制及64K概念。
TCP是一種可靠的面向連接的協議,TCP滑動窗口兩作用:提供可靠性,流量控制。這裏我們關心的是流量控制。tcp滑動窗口控制在收到確認包前能夠最大發送多少字節的TCP數據包,如果收到了將再發送下一組數據。在TCP包頭裏描述TCP滑動窗口占了16位,剛好是65535也就是64K。默認最大允許發送64K字節的數據包就必須有迴應包,否則就等。
在高時延帶寬的網絡環境下,會有什麼問題,如何解決?
TCP這樣的特點就導致,雖然帶寬富裕,但是單個TCP線程不能把帶寬佔滿。
解決辦法:TCP包頭裏最後一部分是選項字段,當kind=3時,用來給出TCP窗口擴大因子。當新建立TCP連接時,會查找這個選項參數,如果設置了TCP窗口因子(取值範圍0~14),就可以突破默認TCP窗口限制,使其支持更大的窗口.相當於2的(16+擴展值)次方,最大2的30次方。
這樣在高帶寬時延的網絡環境下,單TCP會話對帶寬利用率將明顯改善。
測試環境A端103.38.X.X 主機
B端103.16.X.X主機
兩主機之間的帶寬大於100M,時延200ms左右
UDP 100M測試:達到預期結果
服務端iperf-u -s
客戶端iperf -c 103.16.X.X -b 100M -i 5 -t 60
TCP單線程測試:默認64K窗口,只能達到 2.5Mbps
服務端iperf-s
客戶端iperf -c 103.16.X.X -i 5 -t 60
TCP單線程測試:默認2M窗口,可達到 70Mbps
服務端iperf-s -w 2M
客戶端iperf -c 103.16.X.X -w 2M -i 5 -t 60
利用TCP擴大因子,不光系統要支持,應用軟件也要給力。
linux 2.6.9以上內核, windows vista/2008以上默認支持,只需要關心應用軟件即可。
早期版本系統優化:
linux
echo 'net.ipv4.tcp_window_scaling = 1'>>/etc/sysctl.conf
sysctl -p
windows XP/2003優化
打開註冊表,進入如下位置
添加鍵值