1. 程式人生 > >TCP擁塞控制演算法 調整TCP擁塞控制演算法 TCP Congestion Avoidance Algorithm

TCP擁塞控制演算法 調整TCP擁塞控制演算法 TCP Congestion Avoidance Algorithm

中美之間的線路質量不是很好,rtt較長且時常丟包。TCP協議是成也丟包,敗也丟包;TCP的設計目的是解決不可靠線路上可靠傳輸的問題,即為了解決丟包,但丟包卻使TCP傳輸速度大幅下降。HTTP協議在傳輸層使用的是TCP協議,所以網頁下載的速度就取決於TCP單執行緒下載的速度(因為網頁就是單執行緒下載的)。
丟包使得TCP傳輸速度大幅下降的主要原因是丟包重傳機制,控制這一機制的就是TCP擁塞控制演算法。
Linux核心中提供了若干套TCP擁塞控制演算法,已載入進核心的可以通過核心引數net.ipv4.tcp_available_congestion_control看到:
sudo sysctl net.ipv4.tcp_available_congestion_control

沒有載入進核心的一般是編譯成了模組,可以用modprobe載入。
這些演算法各自適用於不同的環境。
reno是最基本的擁塞控制演算法,也是TCP協議的實驗原型。
bic適用於rtt較高但丟包極為罕見的情況,比如北美和歐洲之間的線路,這是2.6.8到2.6.18之間的Linux核心的預設演算法。
cubic是修改版的bic,適用環境比bic廣泛一點,它是2.6.19之後的linux核心的預設演算法。
hybla適用於高延時、高丟包率的網路,比如衛星鏈路——同樣適用於中美之間的鏈路。
多人實驗表明,TCP擁塞控制演算法對TCP傳輸速率的影響可很大。
修改TCP擁塞控制演算法需要修改核心引數net.ipv4.tcp_congestion_control(OpenVZ的VE無此許可權,Xen或者獨服才有):

sudo sysctl net.ipv4.tcp_congestion_control=×××


OpenVZ的可以在母雞上改tcp_congestion_control,建議凡是國人做OpenVZ的,一律把tcp_congestion_control改成hybla;做Xen的,一律把OS模板裡的tcp_congestion_control改成hybla。提高很明顯的。

(做vpn的實現不了tcp proxy改這個也沒用)


除非是獨服,要不然這個很難測。嗯。。。有沒有用htcp的?
bic
2011-04-05 00:35:36 (1.50 MB/s) - `/dev/null' saved [104857600/104857600]
hybla

2011-04-05 00:34:15 (1.88 MB/s) - `/dev/null' saved [104857600/104857600]
htcp
2011-04-05 00:33:11 (2.52 MB/s) - `/dev/null' saved [104857600/104857600]