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