TCP Slow Start cause Tail Drop on interface with limited buffer
紫微網路迎來了第一位諮詢者:橙子同學,想澄清網路中的丟包現象是正常還是異常。
開始之前,需要一點背景知識…
有一位國際象棋冠軍為國家獲得了很多榮譽,國王為了獎賞她,對她說你有什麼要求儘管說,我一定儘力滿足,象棋冠軍說:我只有一個要求,就是把棋盤放滿糧食,第一個位子放1粒,第二個位子放2粒,第三個位子放4粒,依此類推。。。
國王聽到之後哈哈大笑,這又不是什麼難事,來人吶,扛幾袋糧食過來把棋盤擺滿,不一會兒手下扛來了糧食,一會兒糧食用完了,於是國王叫人再扛,最終國庫的糧食全用上了,還沒有滿足冠軍的需求,國王這下笑不動了,冠軍莞爾一笑說:陛下,別當真,只是和您開一個玩笑…
這是一個杜撰的真實故事,主要想讓各位同學對指數增加(2^N)有一個感性的認識,那個指數N>40 就是一個海量數字,以IPv4地址為例,2^32大概有近40億的數量。
看過我文章的同學,一定知道TCP Slow Start (慢啟動)這個演算法,TCP發送包的速率也是翻倍增長,有同學會有疑問,難道就這樣無窮無盡的增長下去,當然不是!
TCP 發送方一次能發多少,首先取決於接收方的advertised
window size ,假如 advertised window size = 8000,每個TCP報文可以裝載1000個位元組,意味著一次最多可以發送8000/1000=8個TCP報文,如果到達這個上限(一個RTT周期發8個),發送方也沒有檢測到丟包,那發送方的發送速率就是
Sending Rate = advertised window size / SRTT
其中SRTT是平均RTT。
但如果對方使用scaling window 這個TCP option, 使得 advertised window size =5M或更大,而在區域網的SRTT =2ms, 理論上可以達:
5000000/0.002 = 250M byte per second = 2Gbps
這是TCP演算法對於TCP參數能達到的最大發送速率,但不要忘記,底層的網卡帶寬只有1Gbps,TCP如何發2Gbps呢?這很荒唐,所以最大帶寬只會1Gbps。
意味著TCP slow start指數增長到到達2.5M時已經開始丟包,畢竟TCP就是依靠指數暴力發包,然後檢測丟包來實現限流的,所以有基於TCP應用的網路,丟包是一種常態,而不是異常。
橙子同學網路介面統計發現物理介面有大量的丟包,想知道為何有那麼多的丟包,以下是原圖:
路由器或交換機,一旦TCP流量暴力來襲時,會盡最大能力轉發流量,如果流量持續增長,流量流速> 物理線路速率,用緩存將多餘的流量緩存在隊列里,一旦線路空閑,再發送出去。
但如果多餘的流量> 緩存的空間,無法容納的流量將會統統丟棄,cisco官方的名詞稱之為尾丟( Tail Drop)。
所以緩存只能應付臨時的突發流量(Burst Traffic), 只要多餘的突發流量<= 緩存空間,就不會丟棄。
但是緩存無法應付諸如TCP 指數增長流量,唯一的辦法就是尾丟。
綜上所述,橙子同學網路介面出方向的 」out dircard」是正常的,TCP slow start演算法就是依靠丟包來實現的,至於哪裡要丟,取決於端到端哪條鏈路的可用帶寬最小,記住可用帶寬不是介面的最大帶寬,可用帶寬是真正可以利用的帶寬。
推薦閱讀:
※TCP連接中a連b和b連a是一碼事嗎?
※在以TCP為連接方式的伺服器中,為什麼在服務端設計當中需要考慮心跳?
※epoll非阻塞伺服器,在20k並發測試結束產生大量establish狀態假連接,可能原因?
※為什麼多 TCP 連接分塊下載比單連接下載快?