您當前的位置:首頁 > 書法

分享案例之一:TCP

作者:由 車小胖 發表于 書法時間:2018-06-07

斜體部分位讀者的提問

你好,請教你一個問題,在用tcp通訊時,應用層每次傳送包的大小是儘量一個mtu以內呢還是無所謂?在行動網路下跟pc下分別如何?我的理解是tcp既然是流式的,並且自己會切包,超時重傳也是基於切要後的包(不像udp按照切完前),所以無所謂,不知道這樣理解是不是正確的?

TCP/IP

協議模組

,在應用層看來,就是自己的本地代理,代理自己與別的

計算機程式

通訊。

代理算好聽的,說難聽一點就是一群打雜的。TCP/IP將底層通訊有關的所有細節都大包獨攬了,留下有限幾個

介面函式

,讓應用層給自己發號施令(^_^)。

介面函式,經常被寫作

API

,API是

Application Programming Interface

的縮寫,如果沒有這些API介面,應用層如何對那些底層幹活的發號施令?

先假設應用層需要傳輸一個10M的檔案,應用層透過send()介面函式傳送資料,問題來了,send()最大可以接受多少位元組的資料?

這個是send()函式的實現限制,太大了超過TCP的緩衝區肯定不行,最好每次傳送的資料不超過TCP緩衝區的一個單元的大小。

所以應用層會遵照send()的大小限制,每次傳送的資料都在最大限度以內,這個算分片嗎?

算第一次分片,但是這個是無法避免的!但是這個過程耗費的資源比較少,只是順序讀取10M位元組過程,每次讀取的位元組長度有限制。

TCP接到send()傳送的位元組,會立馬保持原封不動傳送嗎?

不確定!

TCP會先將這些資料放在自己的倉庫(傳送

緩衝區

),至於什麼時候發,每次發多少,已經不是

應用層

所能左右的了。

TCP是基於位元組流傳送,可能將使用者的一次資料傳送砍成多個segment傳送,也可能將多次應用層的傳送合併在一個segment傳送。而決定TCP一次最大能發segment的大小則和MSS有關,而MSS最終和MTU有關。

終於說到了MTU,大家可能知道MTU是資料鏈路層對網路層的限制,以最常見的Ethernet鏈路為例,Ethernet MTU = 1500,這個意思是Ethernet Payload最大的尺寸不得超過1500位元組。這1500位元組包含Ethernet頭部、尾部嗎?

當然不包含!

那問題又來了,Ethernet幀如果加上4個位元組的802。1Q的頭部,

MTU =

1500 裡包含4位元組的802.1Q嗎?

包含!

這樣操作的話,意味著使用者的IP報文如果是1500位元組,新增一個802。1Q會變成1504,意味著需要分片處理!

分片是非常不利的選擇,當前網路所做的很多努力都是極力避免分片!

如何避免分片呢?

其實很簡單,凡是可能新增802。1Q介面將MTU = 1504,甚至1508,這樣即使新增1個、2個802。1Q頭,使用者1500位元組的IP報文也不會被分片。

Okay,再回到正題,大家有沒有思考過為何Ethernet要有MTU的限制?

Ethernet最初對IP報文也沒有什麼限制,IP報文最大可以有65535位元組長,但是發現Ethernet對於長報文無法可靠地傳輸,而將報文限制在一定的尺寸,Ethernet可以將報文大機率傳輸到目的地,於是就有了MTU這一限制措施,MTU是為了更可靠地傳輸資料。

既然物理硬體有了MTU的限制,那麼希望TCP/IP將這種硬性的限制措施,層層向上傳達,於是TCP選擇了MSS來限制傳送segment的大小。

MSS = MTU – IP Header – TCP Header = 1500 -20

-20 = 1460

TCP MSS真的可以避免分片嗎?

TCP連線的雙方依據本地

物理鏈路

的MTU,按照以上的公式計算出本地的MSS,然後雙方交換各自的MSS,雙方會選擇兩者中小的MSS來繼續通訊。但有沒有想過,如果路徑中的MTU比連線雙方的MTU都小,是不是分片就無法避免了?答案是肯定的!

這個時候必須分片,不分片就會丟,這是DF = 1的狀況,需要給源主機發送ICMP訊息,問題是ICMP訊息能到達源主機嗎?如果不能到達,通訊就會斷,即使TCP有重傳機制。

能到達源主機,源的TCP意識到這一點,會將重傳的

報文

重新切片,重新發送,這沒有什麼問題,只是耽誤一點時間而已。

DF = 0時,可以直接分片,儘管耗費很多分片的資源,到達目的地再重組,也要耗費一點資源。

問題是,沒有埠號的分片,經過安全裝置時,可能會遇到障礙,這同樣會造成通訊的障礙。

看,一旦分片造成多大的麻煩,麻煩意味著CPU資源的耗費,為了避免這些不必要的動作,只要不分片,一切都會變的簡單。

UDP

UDP是塊式訊息,UDP本身沒有任何分片的能力,也沒有任何重傳的能力,這些能力需要依賴應用層、IP層。

計算機網路

發展到今天,大家已經形成了一個共識,如果使用者的資料確實需要分片傳輸,務必保證分片的動作由應用層來完成,到達目的地由應用層將位元組流,再整理成有意義的訊息塊。

更多內容請參考公眾號文章:

標簽: 分片  TCP  MTU  位元組  應用層