
/* Track min RTT seen in the min_rtt_win_sec filter window: */filter_expired = after(tcp_time_stamp, bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);if (rs->rtt_us >= 0 && (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { bbr->min_rtt_us = rs->rtt_us; bbr->min_rtt_stamp = tcp_time_stamp; bbr->rtt_us = rs->rtt_us; if (filter_expired) bbr->max_rtt_us = rs->rtt_us;}bbr->rtt_us = bbr->min_rtt_us;if (!filter_expired && rs->rtt_us >= 0 && rs->rtt_us < bbr->max_rtt_us) { bbr->rtt_us = rs->rtt_us;}2.修改bbr_target_cwnd
if (inet_csk(sk)->icsk_ca_state != TCP_CA_Open) w = (u64)bw * bbr->min_rtt_us;else w = (u64)bw * bbr->rtt_us;----------------------------最大RTT和最小RTT之差就是排隊(duì)延遲,充分利用這個(gè)排隊(duì)延遲去添堵是一件簡(jiǎn)單的好事,但是如何去對(duì)抗AQM則是一件非常復(fù)雜的事,因?yàn)槟悴⒉恢繟QM的行為。以上的討論均建立在尾部丟包的基礎(chǔ)之上,然而現(xiàn)實(shí)情況則要面臨復(fù)雜的AQM,在文章《linux Kernel 4.9中TCP BBR算法的科普解釋》的“君莫舞,君不見(jiàn)玉環(huán)飛燕皆塵土”以及“BBR的優(yōu)勢(shì)之-與AQM的關(guān)系”兩節(jié)中,我有闡述BBR如何樂(lè)觀地等待CUBIC之流被懲罰以及如何愉快地上位,然而在“廣中路上匝道”情形中,CUBIC并不會(huì)被懲罰,BBR自然也就不會(huì)上位,那怎么辦,只能添堵,至于AQM怎么處理,一視同仁吧。換句話(huà)說(shuō),BBR在CUBIC以及任意所謂“TCP加速者”面前,不必客氣,他們抽煙,你就放火。快遞或者網(wǎng)絡(luò)可靠嗎
現(xiàn)在人們沒(méi)了互聯(lián)網(wǎng)就不能生活,這也是一種錯(cuò)覺(jué)。 其實(shí)互聯(lián)網(wǎng)本身就是一種錯(cuò)覺(jué),它是一種不得已而為之的錯(cuò)覺(jué)! 去年1月我去深圳萬(wàn)象城(之所以說(shuō)萬(wàn)象城而不是人人樂(lè),我是想說(shuō)我買(mǎi)的東西有多么高大上,以至于我多么迫不及待地想擁有)買(mǎi)東西,無(wú)貨,咋辦?店主說(shuō)次日可取,他們從廣州拿貨。現(xiàn)在問(wèn)題來(lái)了,去一趟廣州難嗎?為什么我自己不直接去廣州買(mǎi),還要深圳萬(wàn)象城去廣州拿貨后再賣(mài)給我?因?yàn)槲覜](méi)時(shí)間!如果我有大把的時(shí)間又那么喜歡那件物品,我肯定自己去廣州了,順帶旅游,然而我缺的正是時(shí)間。 快遞業(yè)務(wù)填補(bǔ)了人們的時(shí)間間隙。但是快遞業(yè)務(wù)真的可靠嗎? 如果我自己去廣州拿貨,假設(shè)高鐵不脫軌,汽車(chē)不翻車(chē),自己不被人捅的情況下,一路上我愉快地去,拿到貨后愉快地歸來(lái),一路上我親自護(hù)送貨品,我放心,我踏實(shí)。如果交由快遞,我不知道快遞車(chē)會(huì)不會(huì)翻車(chē),會(huì)不會(huì)被人搶?zhuān)锩鏁?huì)不會(huì)是假貨...一切我都不確定,在送到我手里前,我只能禱告~!但好處在于,這段送貨的時(shí)間,在我信任快遞公司的前提下,我可以做別的工作,如果我不信任快遞公司,我只能心急如焚。好在,現(xiàn)在的快遞公司,特別是順豐還算靠譜,你不需要心急如焚。 但是網(wǎng)絡(luò),其可靠性完全是另一回事,幸虧人們用了TCP,不然就別玩了。字節(jié)的復(fù)制往往比絲帛的織造更加廉價(jià),所以TCP有一個(gè)存儲(chǔ)重發(fā)的機(jī)制,發(fā)送信息前先存儲(chǔ)信息,一段時(shí)間沒(méi)有收到回應(yīng),就重發(fā)被存儲(chǔ)的信息,收到回應(yīng)則將信息刪除,如果發(fā)了一批絲綢到遠(yuǎn)方,一段時(shí)間沒(méi)有反饋,然后再去織一批新的,那代價(jià)可就大了去了...----------------------------我不親自去廣州而去委托快遞公司,正是因?yàn)槲覜](méi)有時(shí)間,那么如果快遞公司的快遞過(guò)程“彌補(bǔ)”了我本應(yīng)該節(jié)省的時(shí)間(比如快遞員懶惰),我還不如自己去拿貨呢。網(wǎng)絡(luò)也一樣,如果網(wǎng)絡(luò)的延遲太高,那還不如用U盤(pán)拷貝信息,用汽車(chē)運(yùn)輸U(kuò)盤(pán),然后交付呢...網(wǎng)絡(luò)和快遞一樣,就是圖快,用專(zhuān)業(yè)的運(yùn)輸代替你自己的自取。然而,如果網(wǎng)絡(luò)中有Bufferbloat,那么還不如去自取,甚至去用U盤(pán)拷貝。 Bufferbloat讓網(wǎng)絡(luò)喪失了快速傳輸通道的名聲。新的Bloat版本的BBR算法
周日早晨,我登錄到了溫州老板提供的位于國(guó)外的VPS機(jī)器上,演繹了一個(gè)新版的BBR。也是添堵版的,在我的WIFI環(huán)境下碾壓了標(biāo)準(zhǔn)的BBR,這就好像魔人布?xì)W的分身一樣,一個(gè)是好人的時(shí)候,另一個(gè)必須是惡棍。非常簡(jiǎn)單:1.為bbr增加一個(gè)minmax類(lèi)型的max_rtt字段
2.修改bbr_update_min_rtt函數(shù)
filter_expired = after(tcp_time_stamp, bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);if (rs->rtt_us >= 0 && (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { bbr->min_rtt_us = rs->rtt_us; bbr->min_rtt_stamp = tcp_time_stamp; bbr->rtt_us = rs->rtt_us;}bbr->rtt_us = rs->rtt_us;rtt_PRior = minmax_get(&bbr->max_rtt);// 迄今為止最大的RTT與當(dāng)前RTT取其小!是不是拿最大RTT和最小RTT求個(gè)"平均"什么的更合理呢?// 反正我是占點(diǎn)Buffer空間bbr->rtt_us = min(bbr->rtt_us, rtt_prior);minmax_running_max(&bbr->max_rtt, bbr_bw_rtts, bbr->rtt_cnt, rs->rtt_us);我祝愿所有的TCP連接早日崩潰,我祝愿互聯(lián)網(wǎng)越來(lái)越擁堵,最終不可用。為什么BBR是合理的
AIMD是基于丟包的擁塞控制算法的根基,這必然會(huì)Buffer bloat,解決之道就是不采用基于丟包的算法,而采用基于時(shí)延的算法,但是.... 但是只要有一個(gè)基于丟包的算法還跑在互聯(lián)網(wǎng)上,那么所有基于時(shí)延的算法都會(huì)集體退讓...這是基于時(shí)延算法弊端,既然它基于時(shí)延而不是丟包,那么它就是注定要吃虧的。正確的做法是什么? BBR無(wú)視丟包(也并非絕對(duì),BBR在處理非Open狀態(tài)時(shí)還是有措施的),無(wú)視時(shí)延(也非絕對(duì),BBR只是無(wú)視了RTT的瞬時(shí)變化值),采用了實(shí)時(shí)采集并保留時(shí)間窗口的策略,這初看起來(lái)是吃虧的算法,與基于時(shí)延的算法無(wú)異,但是BBR擁有Probe More和Drain Less過(guò)程,這非常合理。 合理的并不意味著是可用的。我依然祝愿所有的TCP連接早日崩潰,我祝愿互聯(lián)網(wǎng)越來(lái)越擁堵,最終變得不可用。我有一個(gè)夢(mèng)想,每個(gè)人掄起鐵錘去煉鋼,少說(shuō)多做,最好不說(shuō)。
新聞熱點(diǎn)
疑難解答
圖片精選