自從上周有個大半夜幫溫州皮鞋廠老闆計算了那個 2ln2 2 ln 2 之後,就着這個問題又進行了一些思考,過程中非常感謝BBR的作者之一Neal Cardwell,幫忙解釋了很多的細節并同時放出了關于BBR Startup gain的最新模型,看這裡:
https://github.com/google/bbr/tree/master/Documentation/startup/gain/analysis
其中的bbr_startup_gain.pdf中給出了bbr_high_gain的另一個值2.77,該文檔通篇通過一個簡易的數學模型解釋了這個2.77是怎麼算出來的,推導過程和我的TCP BBR的startup bbr_high_gain為什麼是2/ln2?這篇文章的推導過程非常類似,細節我這裡最多無非也就翻譯一遍,就不浪費篇幅了。
本文我來基于我的TCP BBR的startup bbr_high_gain為什麼是2/ln2?這篇文章給出另一個不同的推導過程,最終無論是 2ln2≈2.89 2 ln 2 ≈ 2.89 還是 4ln2≈2.77 4 ln 2 ≈ 2.77 都可以統一到同一個模型中來。
我們依然用下面的函數分别代表 PacingRate P a c i n g R a t e 和 cwnd c w n d :
f1(x)=2x f 1 ( x ) = 2 x
f2(x)=2x f 2 ( x ) = 2 x
PacingRate P a c i n g R a t e 的計算方法在下面的連結可以找到:
Delivery Rate Estimation:https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00
send_elapsed = (P.sent_time - P.first_sent_time)
send_rate = data_acked / send_elapsed
在Startup階段,我們可以用 RTT R T T 來對draft裡面的send_elapsed進行歸一化處理。是以,假設 RTT R T T 為 1 1 去歸一化,這樣我們就可以直接用cwndcwnd來表示 PacingRate P a c i n g R a t e 了。
有了上述的假設,我們再看一下 2ln2≈2.89 2 ln 2 ≈ 2.89 是怎麼推導出來的,請看下圖:

這樣我們可以導出:
G=2ln2≈2.885 G = 2 ln 2 ≈ 2.885
其實,從圖上看,顯然還有另外一種拟合的方式,非常簡單和對稱:
我們看一下推導過程:
last_cwnd=∫x−1x−22xdx=2x4ln2 l a s t _ c w n d = ∫ x − 2 x − 1 2 x d x = 2 x 4 ln 2
next_cwnd=2x n e x t _ c w n d = 2 x
根據圖示上的關系 G×last_cwnd=next_cwnd G × l a s t _ c w n d = n e x t _ c w n d ,我們有:
G×2x4ln2=2x G × 2 x 4 ln 2 = 2 x
是以,最終可以導出:
G=4ln2≈2.773 G = 4 ln 2 ≈ 2.773
這樣在同一個模型裡,我們發現兩個 G G 值都是正确的,最終全部拟合了PacingRatePacingRate和 cwnd c w n d 每 RTT R T T 增倍的平滑曲線,兩種方式的不同點主要展現在那個定積分代表的連續拟合到底是起點還是終點:
- 如果定積分作為終點,那麼就是離散向連續拟合;
- 如果定積分作為起點,那麼就是連續向離散拟合。
最終到底選擇哪個 G G 值作為gain,正如作者Neal Cardwell所說,除了理想化的模型之外,還需要真實網絡環境中的資料支撐,是以,并不确定gain的最終值。
事實上,最大的問題在于,如何确定初始PacingRatePacingRate,這個值目前顯然更多的是拍腦袋的結果,而我們的模型之是以精确是因為計算所用的 PacingRate P a c i n g R a t e 真的就是用下面的标準中的方法實測出來的:
Delivery Rate Estimation:https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00
顯然,一開始的 PacingRate P a c i n g R a t e 并沒有實測條件,是以在初始的幾個 RTT R T T ,Startup的表現并非如模型預測的那般精确,這也是不得已的事情。實際上,随着Startup階段的推進,實際資料和模型的預測将會越來越比對。
不多說。