高帶寬往低帶寬傳送數據的處理機制是怎樣的?
比如主機A使用千兆鏈路連接到千兆交換機,千兆交換機上強制啟用一個百兆口連接到主機B。
假設A要傳送數據給B,如果使用TCP,由於擁塞控制機制的存在,發送方會選擇合適的發送窗口來避免擁塞。但是在使用UDP的情況下,A將以千兆速率向B傳送數據。這種時候這套傳輸系統是使用什麼樣的機制來處理擁塞,並且把實際流量跑成百兆的?
既然UDP撒手不管流量擁塞管理,總要有人出頭來管理這件煩心事。最適合出頭的就是應用程序本身,因為它才是數據源頭,所有數據都是由應用程序來組織,然後逐級提交給UDP/IP/Ethernet/Hardware。
流量擁塞管理與不管理的差別是:
沒有流量控制,入口速率1000Mbps 進交換機,出口速率100Mbps 離開交換機,則有900Mbps 速率的流量被交換機丟棄,這類似用流量儀單向打流量的場景。
有流量控制,發送端知道路徑的最大帶寬其實只有100Mbps,發多了也是浪費,於是只發100Mbps 速率的數據,交換機入口、出口速率都是 100 Mbps,這是理想的狀態,沒有數據丟棄。
有同學會說,發送端如何知道路徑的最大帶寬?
很簡單,模仿TCP啊,通過動態測量,開始發送速率很小的包,發現沒有丟失,再加倍速率,再檢查有沒有丟失,就這樣指數增加,可以使用這樣的公式:1,2,4,8,16,32,64,128,一直到128Mbps這個峰值出現丟包,發送端知道速率太快,於是使用( 64+ 128)/2 = 96 Mbps 繼續發送,通過這個迭代方式,最終能無限逼近100 Mbps 路徑的最大帶寬。
當然還可以動態測量RTT 時間,以決定最佳的發送間隔。以上都是應用程序來完成的,為了保證數據可靠傳輸,以及流量控制,應用程序還需要完成類似TCP的工作。
除了應用程序,難道交換機就不可以實現流量控制嗎?
可以的,當交換機發現入口進來的幀,需要交換到出介面,而出介面卻處於擁塞狀態,因為出介面的outgoing buffer 已滿,連緩存的空間都沒有了,於是果斷給入口發一個 Pause 消息(802.3x),暫停發送(潛台詞:發進來也是丟),發送的主機如果認識這個 Pause 消息,會暫停一段時間發送,然後繼續發送,如果此時依然擁塞,則交換機繼續發Pause 消息。
交換機的緩存方式
Cisco交換機採用每個埠獨享的緩存空間,互相不干擾,即使一個埠緩存滿了,也不一定會影響其它埠的流量交換,只要它們的流量不往緩存滿的埠發就沒有問題。
問題簡單,但是原理卻很複雜...
主要原因是跟交換機的buffer有關,如果buffer足夠,可以將多餘的流量先緩存起來那麼就能減少丟包的數量
當然還有其他的解決方案,例如原來有Pause Frame機制,由交換機強制發送一個Pause Frame給input設備,通過這種方式來減少掉包
另外,如果有多打一的情況,現在的交換機有VoQ功能,也可以緩解這個問題
應用層解決
如果網路設備的發送隊列已滿,那麼直接丟棄新過來的數據。
這鐘情況跟擁塞沒關係,因為你交換機承載力夠大而你又不限制發送速率,所以不可能出現擁塞,最可能的結果就是b機器內存不夠用,很多數據被b丟棄,解決辦法就是使用流量控制,簡單來講,就是 b不斷地告訴a自身緩存的大小 比如 100b,a發送的時候只能小於100-flight bytrs大小的數據
推薦閱讀:
※測試TCP server的QPS的合適方法?
※為什麼traceroute通過外網到了一個內網地址?
※《TCP/IP詳解卷一》中這一句話應該怎麼理解?
※網路連接中的長連接和短鏈接是什麼意思?
※選擇重傳協議的滑動窗口大小為什麼必須小於或等於序號空間大小的一半?