TCP――為什么是AIMD?
TCP——為什么是AIMD
本文引用地址:http://2s4d.com/article/201609/304176.htm說到TCP原理,一般的人談傳輸效率,也就是吞吐率,了解的人談公平性,以及收斂性。本篇博文講一下TCP為什么使用AIMD策略,為什么是收斂的?
1.公平性和收斂性
才接觸網絡協(xié)議的人可能會問:為什么要收斂和公平?TCP不是傳輸可靠、夠快就行了嗎?
遠遠不夠,因為TCP是端到端的,窗口增減也是試探性的“自適應”方式,網絡是黑盒,這就有很多問題。你自己一個人發(fā)包發(fā)得快,侵略性強,沒有太大問題。但是如果其他人也跟你一樣沒有節(jié)制的發(fā)包呢?這就會造成網絡負載過重,以至于崩潰。公平性和收斂性的出發(fā)點就在這里。讓每一個TCP發(fā)送端盡可能地均分帶寬,同時減少丟包,減輕網絡設備的壓力。這其實是很難的trade off。TCP窗口總是鋸齒狀地周期抖動,增長-減小,不斷循環(huán),這種探測帶寬的行為一定會造成丟包,只是或多或少的差別而已。
舉個例子:你現(xiàn)在看動漫《fate/stay night ubw》,已經開始了一段時間,視頻緩沖速度很快。這時候你旁邊的同學看你這么入神,發(fā)現(xiàn)很好看,于是加入隊伍,也點開視頻。這時候網絡該怎么分呢?又通過什么樣的機制分呢?最好的結果當然是均分帶寬,你自己分一半,同學也分一半,這時候你的視頻緩沖就慢下來了【注 1】。公平分配說起來容易,做起來難。怎么保證完全均分?這就要靠丟包和延時變動來反映網絡狀況。你的同學加入了,新建的TCP連接會嘗試慢啟動,慢啟動其實不慢,窗口指數增長,緩沖速度快速增加,也就是說,他開始搶你的帶寬了。搶到一定時刻,一定會引起丟包,或者延時的急劇增長。這時候,基于丟包或者延時變動的TCP減窗機制起作用了,你們兩個都開始減窗。你減一點,我減一點。這時候你會想:不對啊,我先開始的,速度早就漲上去了,我們兩個都減,他永遠趕不上我。那么,開始談第二個問題。
2.AIMD為什么收斂
上面說到減窗,現(xiàn)在普遍的減窗策略是“乘性減窗”,英文對應“MD”。比如你們固有的帶寬是8M,一開始你自己全占了,然后同學開始搶,慢啟動發(fā)包很快,于是,交換機緩存扛不住了,丟包了。這時候你的吞吐率是7M,同學的速率是1M。你們兩個的TCP察覺到丟包后,把速率各減去一半,你有3.5M,他有0.5M。網絡不擁塞了,沒有丟包,那就繼續(xù)增窗。該增多少呢?你的帶寬明顯占優(yōu)勢,同學有沒有可能獲得比你更高的速率呢?怎么樣增才能達到均分帶寬的目的?現(xiàn)在普遍的增窗策略是“加性增窗”,英文對應“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能不能設置得更好,變成動態(tài)的,增窗因子能不能設置更好,變成動態(tài)的。以及能不能拋棄AIMD,使用MIMD,在什么網絡中能這樣做。這些問題就不是本文的討論范圍了,也許以后會講。
評論