說到
tcp原理,一般的人談傳輸效率,也就是吞吐率,了解的人談公平性,以及收斂性。本篇博文講一下
tcp為什麼使用
aimd
策略,為什麼是收斂的?
1.公平性和收斂性
才接觸網路協議的人可能會問:為什麼要收斂和公平?
tcp不是傳輸可靠、夠快就行了嗎?
遠遠不夠,因為
tcp是端到端的,視窗增減也是試探性的
「自適應
」方式,網路是黑盒,這就有很多問題。你自己乙個人發包發得快,侵略性強,沒有太大問題。但是如果其他人也跟你一樣沒有節制的發包呢?這就會造成網路負載過重,以至於崩潰。公平性和收斂性的出發點就在這裡。讓每乙個
tcp傳送端盡可能地均分頻寬,同時減少丟包,減輕網路裝置的壓力。這其實是很難的
trade off
。tcp
視窗總是鋸齒狀地週期抖動,增長
-減小,不斷迴圈,這種探測頻寬的行為一定會造成丟包,只是或多或少的差別而已。
舉個例子:你現在看動漫《
fate/stay night ubw
1)。公平分配說起來容易,做起來難。怎麼保證完全均分?這就要靠丟包和延時變動來反映網路狀況。你的同學加入了,新建的
tcp連線會嘗試慢啟動,慢啟動其實不慢,視窗指數增長,緩衝速度快速增加,也就是說,他開始搶你的頻寬了。搶到一定時刻,一定會引起丟包,或者延時的急劇增長。這時候,基於丟包或者延時變動的
tcp減窗機制起作用了,你們兩個都開始減窗。你減一點,我減一點。這時候你會想:不對啊,我先開始的,速度早就漲上去了,我們兩個都減,他永遠趕不上我。那麼,開始談第二個問題。
2.aimd為什麼收斂
上面說到減窗,現在普遍的減窗策略是
「乘性減窗
」,英文對應
「md」
。比如你們固有的頻寬是
8m,一開始你自己全佔了,然後同學開始搶,慢啟動發包很快,於是,交換機快取扛不住了,丟包了。這時候你的吞吐率是
7m,同學的速率是
1m。你們兩個的
tcp察覺到丟包後,把速率各減去一半,你有
3.5m
,他有0.5m
。網路不擁塞了,沒有丟包,那就繼續增窗。該增多少呢?你的頻寬明顯佔優勢,同學有沒有可能獲得比你更高的速率呢?怎麼樣增才能達到均分頻寬的目的?現在普遍的增窗策略是
「加性增窗
」,英文對應
「ai」
。也就是每條
tcp連線在乙個
rtt內的增量是常數,假設這個加性因子為
200k
。那接下來的速率增長就是:你有
3.5+0.2=3.7
,同學有
0.5+0.2=0.7.
看到這裡,或許有的人就恍然大悟了:這樣增窗,結果是大家的速率都收斂。也許還有人不明白,那就把速率隨時間變化的情況列出出來:
3.5 0.5
3.7 0.7
3.9 0.9
4.1 1.1
……………………………
5.5 2.5
2.75 1.25 md
……………………………
4.75 3.25
2.375 1.625 md
……………………………
4.375 3.625
2.1875 1.8125 md
……………………………
4.1875 3.8125 md
……………………………
從以上速率變化,可以看出,兩條
tcp連線的速率在逐漸趨近,這就是
aimd
策略的效果:收斂,到最後公平。也許有的人意猶未盡,那就從公式角度再算一次看看。假設
flow1
的初始視窗為c1,
flow2
的初始視窗為c2。
md減窗過程中,乘性因子為
beta=0.5
,也就是遇到丟包,視窗減一半。
ai增窗過程中,加性因子為
a。於是有:
c1' = ((c1*0.5 + m*0.2)*0.5 + m*0.2)*0.5 + m*0.2 …………
這裡m是變化的,表示增窗的次數,直到遇到丟包。但是由於頻寬有限,於是m可以視為常數。
c1'可以用等比數列求和公式給出,這裡就不詳細計算了。結論可以直接告訴大家:
c1'收斂到跟m和beta有關,跟c1無關的常數。
c2'也類似。
收斂性的證明比較複雜,我也懶得在博文裡講這麼學術化的事情。參見(注 2)。
看到這裡,你也就明白,
tcp如何均分頻寬,你同學又為什麼能從你手裡搶到頻寬了。至於減窗是不是過於劇烈,
beta
能不能設定得更好,變成動態的,增窗因子能不能設定更好,變成動態的。以及能不能拋棄
aimd
,使用mimd
,在什麼網路中能這樣做。這些問題就不是本文的討論範圍了,也許以後會講。 注:
(1udptcp
,這裡用人氣動漫舉例,是比較恰當的,動漫不像籃球比賽,沒有太強的實時性。好奇的同學可以查閱
「牛奶葡萄酒
」原則。(2
)jacobson
在他著名的**,
sigcomm 88
中已經證明了收斂性。
jacobson sigcomm 88 **:
TCP擁塞控制之擁塞避免
tcp傳送方通過慢啟動確定傳送資料的視窗閾值,一旦達到這個閾值,就意味著雖然網路中可能有更多可用的資源,但是如果占用全部的資源,將會使共享路由器佇列的其他tcp連線出現嚴重的丟包和重傳情況,從而導致整個網路效能不穩定。為了傳輸更多的資源而不至於影響其他tcp連線的傳輸,tcp實現了擁塞避免演算法。一...
TCP擁塞控制 慢開始與擁塞避免演算法
計算機網路中的頻寬 交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制是乙個全域性性的過程,和流量控制不同,流量...
TCP擁塞控制
擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載,擁塞控制要做的都有個前提,就是網路能夠承受現有的網路負荷。擁塞控制是個全域性性的過程。幾種擁塞控制方法 慢開始 擁塞避免 快重傳 快恢復 1.慢開始和擁塞避免 傳送方維持乙個叫做擁塞視窗的狀態變數,擁塞視窗取決於網路的擁...