嗯,确實還真有人看了我在雨夜寫的上一篇文章:
BBR的startup gain為什麼是2/ln2?:https://blog.csdn.net/dog250/article/details/80660091
并且提出了問題。我就再寫一篇文字解釋一下這些問題。
問題1: init_cwnd×2n=cwnd i n i t _ c w n d × 2 n = c w n d 對 n n 求導怎麼會是n×2n−1n×2n−1
問題2:如果能用 2x 2 x 同時表示速率和BDP,那麼對速率積分所得的BDP為什麼會比 2x 2 x 多出來一個 1ln2 1 ln 2 因子呢?
先來看第一個問題,這個是溫州皮鞋廠老闆在問我為什麼bbr_high_gain是 2ln2 2 ln 2 的時候他自己算出來的,很顯然他算錯了,至于為什麼錯,這要問老闆,可能是求導公式記錯了,但畢竟思路是對的,老闆記成了二項式的求導,比如 (xn)′=nxn−1 ( x n ) ′ = n x n − 1 這種。
長期不用這些公式,誰都會忘,熟記它們毫無意義,緊急用到了現查,不緊急又查不到就用連續性和求極限原理現推導都可以,我的觀點就是原理一定要明白,必要時自己能算,公式本身背下來沒有意義,大腦的存儲空間分為兩種用途,一部分是暫時記憶計算的中間過程的,類似寄存器,另一種用途則是記憶生活的,比如某段刻骨銘心的經曆或者讓你難忘的某個人的音容笑貌,純粹去記公式或者背誦課文,除了應對該死的考試,毫無意義。
第一個問題回到到此。
來看第二個問題,這個問題比較有意思。
首先你要先明白并且承認,我們可以用以下兩種方式表示BDP:
- BDP随着RTT指數倍增,是以使用 f2(x)=2x f 2 ( x ) = 2 x 表示BDP
- 速率随着RTT指數倍增,速率也可表示為 f1(x)=2x f 1 ( x ) = 2 x ,是以 F(x)=∫f1(x)dx F ( x ) = ∫ f 1 ( x ) d x 可以表示BDP
現在,沖突來了,我們注意到兩種方式表示的BDP并不相等!
f2(x)=2x≠2xln2=F(x) f 2 ( x ) = 2 x ≠ 2 x ln 2 = F ( x )
它們之間差了一個 1ln2 1 ln 2 因子!這是為什麼??
答案就是BBR試圖要回答的:用平滑的曲線去拟合平滑的而不是離散的發送過程,進而求出bbr_high_gain。
我這裡形象的用圖示解釋一下。
我們把TCP BBR在startup階段發送的資料包想象成一個連續不斷向前走的東西,至于什麼東西,都可以,可以是汽車,也可以是火車。很顯然,發送的速率不斷增加,相鄰資料包是時間上的間隔會不斷縮短,對于第一個表達BDP的式子,它就像下圖這樣,我用顔色深淺表示發送速率,顔色越深,速率越低:
這像什麼?這像越來越快發射的子彈,也像一個城市的一條路上進入早高峰的過程。我們數數看一共多少個包,嗯,是6個,沒錯,這時的BDP就是6。
那麼如果用速率進行積分的話,會是一種什麼樣的場景呢?我們知道,積分是在一個連續函數上進行的,是以它的樣子應該是下面的這樣:
這像什麼?感覺有點像人留下來的長鼻涕,開始的時候很慢,随着越拉越長,在重力作用下其下端會加速墜落,同時一直到鼻孔處全部黏在一起而不斷…
看看這時的BDP怎麼算,非常顯然,這麼一長條除以MSS即是以資料包個數計數的BDP。由于其連續性,填補了直接用 2x 2 x 計數資料包時的離散空隙,多出來的那部分就是用因子 1ln2 1 ln 2 來增益的。
BBR算法正是用後面的這個連續函數的積分來計算針對上一個RTT時BDP的增益的,是以便有了:
F(x)=G×f2(x−1) F ( x ) = G × f 2 ( x − 1 )
由這個式子直接可以導出 G=2ln2 G = 2 ln 2 ,非常直接,以一個确定性的上個RTT周期的 f2(x−1) f 2 ( x − 1 ) 為錨點,求出連續情況下增益為多少,才能達到目前的BDP。
類似的,你也會發現,用BDP的表達式 f1(x)=2x f 1 ( x ) = 2 x 求導數計算速率時,也會遇到相同的問題,也是連續和離散的問題。這個時候,計算出來的導函數為 g(x)=2xln2 g ( x ) = 2 x ln 2 ,顯然是比 f2(x)=2x f 2 ( x ) = 2 x 更小,這是因為求導是在連續函數上進行的,是以為了求導,你必須把離散的資料包壓縮在一起,必然要縮短總距離:
好了,解釋完了,至于說為什麼一定要用連續函數來計算bbr_high_gain,純粹是因為這樣算出來的值會更加平滑,因為如果你直接使用曲線 2x 2 x 中的增益 2 2 <script type="math/tex" id="MathJax-Element-3585">2</script>,那麼相當于你預設了一個限制,即每到一個RTT倍數的準點,你的PacingRate即速率将會面臨一次翻倍,然而具體實作當中,這個限制很難滿足,BBR的實作可以看出,其PacingRate的計算是實時的,所得到的結果是一個即時的正确的速率,并沒有受到RTT的限制。
既然BBR要以測量而不是假設為準,那麼算法執行地越平滑越好。記不記得當初BIC進化到CUBIC的時候,就是去除了RTT的限制,最終CUBIC放棄了BIC二分折線,CUBIC拟合了一條平滑的三次曲線,與RTT徹底無關了,進而解決了RTT公平性問題!唉,日光之下,并無新事。明天将重播今天的故事…
浙江溫州皮鞋濕!