TCP協(xié)議有了擁塞控制機(jī)制,為什么還會網(wǎng)絡(luò)擁塞?
隨著骨干帶寬增長,擁塞被阻滯在接入網(wǎng),大規(guī)模擁塞崩潰難再呈現(xiàn),tcp 擁塞控制(不僅限于 tcp,但以 tcp 為主線來說)從避免崩潰,保證可用性逐漸轉(zhuǎn)到提高效率。
過程曲折而漫長。
起初 aimd 挺好,為了更好,bic/cubic 相繼出爐,此過程正與 linux 蓬勃發(fā)展同步,大概從 1990 年初一直持續(xù)到 2005 年前后,linux kernel 內(nèi)置所謂 “擁塞狀態(tài)機(jī)” 邏輯,以至于完全不同于傳統(tǒng) aimd 的 delay-based cc 比如 vegas 竟無處安放。
擁塞狀態(tài)機(jī)其實(shí)就是 loss-based cc 的抽象,將 “擁塞避免”,“快速重傳” 等這些狀態(tài)與 tcp 語義的傳輸和重傳強(qiáng)制捆綁,以至于只要出現(xiàn)丟包進(jìn)入快速重傳,必須無條件執(zhí)行固定邏輯,比如降窗(比如 prr)。這種框架下,如果想在丟包時不降窗就無從談起,顯然 vegas 不適合這框架。但由于這種方式工作的足夠好,vegas 幾乎被遺忘。
進(jìn)入 2010 年代,隨著摩爾定律效應(yīng)減弱,主機(jī)帶寬逐漸追平交換帶寬,而移動互聯(lián)網(wǎng)興起,圖片,視頻等大流量激增,單位帶寬逐漸吃緊,帶寬資源不能再繼續(xù)以粗放方式被使用,另一方面,受限于時延 qoe,buffer 不能繼續(xù)增大,cc 開始以帶寬利用率為目標(biāo),pacing 代替突發(fā)降低報文到達(dá)率,減少對 buffer 的依賴。
bbr 在此背景下產(chǎn)生。
為支持 bbr,linux kernel 引入 cong_control 回調(diào),允許 cc 自定義行為,開辟了擁塞狀態(tài)機(jī)之外的新路。
但直到今日這條新路上大量的代碼都在處理 “兼容公平性”。
當(dāng)年 vegas 被詬病不能和 cubic 共存,解法其實(shí)是全網(wǎng)部署 vegas。如今 bbr 又落入尋求 “與 aimd(主要是 cubic) 公平混部” 的老路,而這些問題幾乎不能徹底解決。
分布式網(wǎng)絡(luò)是個博弈網(wǎng)絡(luò),即使 bbr 優(yōu)秀到讓人們明確想用 bbr 替換 cubic,但隨著替換的進(jìn)行,替換收益遞減,人們的替換動機(jī)減弱,最終 bbr 占比將穩(wěn)定在不到 80%,bbr 還是要兼容 cubic,因此 bbr3 或許是個好算法。
但數(shù)據(jù)中心則是個不同的場子。
如果在數(shù)據(jù)中心大搞公平混部就大可不必了,找經(jīng)理開會能解決的事就不要用算法自適應(yīng)。一個簡單方法是增量部署算法默認(rèn)設(shè)置在裝機(jī)腳本,存量逐漸分批次切換?;蛉?cubic,或全部 bbr,或全部 vegas。
最近一直強(qiáng)調(diào)同質(zhì),卡車從不考慮與轎車碰撞時的公平性問題。核心還是那些車轱轆話,讓算法盡量少做甚至不做判斷,猜測,評估,針對的事,簡單才能高效,大一統(tǒng)對效率反而是拖累,俾斯麥明白的道理,將奧地利排除在帝國之外,主打一個純凈。
暫時不說關(guān)于同質(zhì)的話題了,說惡心了。接下來看 bbr。
不管哪個場子,也不管目標(biāo)是避免崩潰還是提高效率,擁塞控制的核心都是 數(shù)據(jù)包守恒,在這個視角下重新審視 bbr,看它有什么問題:
具體可參考 bbr 模型 以及 更合理的 bbr。
此前說過,bbr 看起來好只因?yàn)樗拇箝_合動作,并且很多人理解的 “bbr 好” 就是和 cubic 相比 bbr 的吞吐更高,這是對擁塞控制最大的誤解,你不光要看結(jié)果,還要看拿什么換的結(jié)果。其實(shí) bbr 選的操作點(diǎn)非常不穩(wěn)定,所以無法自適應(yīng)收斂,需要一個狀態(tài)機(jī)不斷進(jìn)行刺激和反應(yīng),總體上大開合的意思就是激進(jìn)。如果操作點(diǎn)對了,什么都不需要做就能收斂。
看上圖的下半部分,合理的 bbr 操作點(diǎn)更偏右,在這個操作點(diǎn)上,和理想情況相反,bbr 需要持續(xù)占據(jù)一些 buffer 空間,用它來做帶寬變化的自動探測。
bbr 用 maxbw 追蹤最佳操作點(diǎn)是追不到的,在多流共享帶寬時更是捕風(fēng)捉影。如果辦不到就不要辦了,計算是滯后的,且根本算不準(zhǔn),那么追蹤 max(bw / rtt) 就豁然開朗:
- 在 winmax 中追蹤 alpha rounds 的 bw / rtt,將其 bw 記為 b;
- 在 winmin 中追蹤 k*alpha rounds 的 rtt,記為 minrtt;
- 保持 inflight = b * minrtt + beta。
這就避開了復(fù)雜的狀態(tài)機(jī),probe,drain 等邏輯。圍繞上面的 3 步算法做任何事都行,其實(shí)只這 3 步就夠了。
本文不詳細(xì)聊這個算法動力學(xué),簡單推理一下,如果有新帶寬,max(bw / rtt) 會更新,bw 增加,inflight 增加,如果有效帶寬減少,早晚 max(bw / rtt) 會滑走而更新,bw 減少,inflight 減少,而如果 bw 和 rtt 同時增加或減少,minrtt 在更長周期不改變,算法就可以自適應(yīng)它們而改變 inflight。
解釋一下最后一步為啥要 + beta,這是 vegas 里的辦法,目的是 “始終在 buffer 中保留一些報文”,效果是:
- 有流退出,這些報文可以瞬間分享騰出的帶寬;
- 有流進(jìn)入,這些報文避免當(dāng)前流被擠占而抖動。
是不是簡單又有趣。
那么 pacing 哪去了?和傳統(tǒng) bbr 不同,pacing 退居二線,而 inflight 成了第一控制要素,只要保持 inflight 就那么多,pa 不 pacing 不重要,反正都要回來,核心還是守恒律。
人們對 pacing 的誤解在于以為 pacing rate 是端到端的,但它只對第一跳有效。數(shù)據(jù)包在網(wǎng)絡(luò)轉(zhuǎn)發(fā)過程中,其形式完全受交換機(jī)(等一切轉(zhuǎn)發(fā)節(jié)點(diǎn))當(dāng)前狀態(tài)的影響,在沒有任何 aqm,qos 配置的簡單 fifo 情形,一條流的 pacing rate 完全由該交換機(jī)當(dāng)前的 buffer 構(gòu)成決定。
端到端控制需要控制 inflight,而不是 pacing rate。
pacing 按照 delivery rate 的 n 倍吐,簡單給前面第一跳交換機(jī) buffer 留點(diǎn) time slot,不用太精確算計,因?yàn)樗懔艘矝]用,統(tǒng)計復(fù)用要按統(tǒng)計方法來,抓住統(tǒng)計量,追蹤,過濾它們,做出判斷,執(zhí)行守恒律。
擁塞控制的核心是在 pipe 中保有多少 inflight,而不是以多大的 pacing rate 發(fā)送,所以控制要素還得是 cwnd,而測量 delivery rate 只做采集 bw / rtt 而計算 inflight。
好,該總結(jié)一下了。
tcp 擁塞控制從最初 1980 年代末的 aimd 隨著 linux kernel 經(jīng)過 1990 年代直到 2010 年代引入 bbr,要分清楚新的,舊的,就知道哪些是核心,而哪些是為了兼容公平性。其中摩爾定律,移動互聯(lián)網(wǎng),視頻流的發(fā)展也對 tcp 擁塞控制的形態(tài)產(chǎn)生了甚至決定性的影響。
提到擁塞控制就是慢啟動,擁塞避免,快速重傳那一套非常教條,擁塞控制和丟包檢測和重傳是沒有關(guān)系的兩件事,恰巧 tcp 在初期實(shí)現(xiàn) linux kernel 的擁塞控制算法時作為內(nèi)置硬編碼實(shí)現(xiàn),而后來模塊化時又沒有將其分開,埃里克作為后來的妹忒呢兒自己可能對這方面也不是非常清楚,本沒關(guān)系的邏輯就被擁塞狀態(tài)機(jī)關(guān)聯(lián)了起來,但如果網(wǎng)絡(luò)發(fā)生擁塞,用 inflight = 100 來控制擁塞,這 100 個報文中并不規(guī)定哪些是新報文哪些是重傳報文。
30 多年的發(fā)展讓 tcp 擁塞控制算法自發(fā)多樣化,但兼容公平性并不是每個場景都需要考慮,比如數(shù)據(jù)中心。bbr3 作為以兼容公平性為目標(biāo)的算法,它進(jìn)入通用 linux kernel 的目標(biāo)或許能實(shí)現(xiàn),但作為 bbr 本身,bbr4,bbr5 應(yīng)該在其提高帶寬利用率以及自身公平性方面有更多迭代。
最后,我認(rèn)為以守恒律為核心的 inflight 控制才是高尚的,E = max(bw / rtt) 是一個好收斂點(diǎn),以 inflight = bw * minrtt + beta。而不是捕風(fēng)捉影的 pacing 計算。文章來源:http://www.zghlxwxcb.cn/news/detail-855473.html
浙江溫州皮鞋濕,下雨進(jìn)水不會胖。文章來源地址http://www.zghlxwxcb.cn/news/detail-855473.html
到了這里,關(guān)于大歷史下的 tcp:從早期擁塞控制 到 bbr 再到未來的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!