TCP層的分段和IP層的分片之間的關係 MTU和MSS之間的關係
首先說明:資料報的分段和分片確實發生,分段發生在傳輸層,分片發生在網路層。但是對於分段來說,這是經常發生在UDP傳輸層協議上的情況,對於傳輸層使用TCP協議的通道來說,這種事情很少發生。
1,MTU(Maximum Transmission Unit,MTU),最大傳輸單元
(1)乙太網和802.3對資料幀的長度都有一個限制,其最大 值分別是1500和1492個位元組。鏈路層的這個特性稱作MTU。不同型別的網路大多數都有一個上限。如果IP層有一個數據要傳,且資料的長度比鏈路層的 MTU還大,那麼IP層就要進行分片(fragmentation),把資料報分成若干片,這樣每一個分片都小於MTU。
(2)把一份IP資料報進行分片以後,由到達目的端的IP層
(3)儘管IP分片過程看起來透明的,但有一點讓人不想使用它:即使只丟失一片資料也要重新傳整個資料報。why?因為IP層本身沒有超時重傳機制------由更高層(比如TCP)來負責超時和重傳。當來自TCP報文段的某一片丟失後,TCP在超時後會重發整個TCP報文段,該報文段對應於一份IP資料報(而不是一個分片),沒有辦法只重傳資料報中的一個數據分片。
(4)使用UDP很容易導致IP分片,TCP試圖避免IP分片
2,MSS(Maxitum Segment Size)最大分段大小的縮寫,是TCP協議裡面的一個概念
(1)MSS就是TCP資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能TCP協議在建立連線的時候通常要協商雙方的MSS
(2)相信看到這裡,還有最後一個問題:TCP是如何實現分段的呢?其實TCP無所謂分段,因為每個TCP資料報在組成前其大小就已經被MSS限制了,所以TCP資料報的長度是不可能大於MSS的,當然由它形成的IP包的長度也就不會大於MTU,自然也就不用IP分片了。
簡而言之:
1.IP分片產生的原因是網路層的MTU;TCP分段產生原因是MSS.
2.IP分片由網路層完成,也在網路層進行重組;TCP分段是在傳輸層完成,並在傳輸層進行重組. //透明性
3.對於乙太網,MSS為1460位元組,而MUT往往會大於MSS.
故採用TCP協議進行資料傳輸,是不會造成IP分片的。若資料過大,只會在傳輸層進行資料分段,到了IP層就不用分片。
所以可以看成是這種情況:傳輸層協議想傳送一個超過了MTI的資料報,這個時候網路層就需要對其進行分片,一般UDP和ICMP會出現分片情況,但是TCP不會出現這種情況!因為TCP使用了MSS來避免分片!
IP分片只有第一個帶有傳輸層或ICMP首部,其餘的分片只有IP頭。至於怎麼重組就是到對端以後IP層的事情了。
若TCP報文非常長那麼在IP層傳輸時就有可能要分解成多個短資料報片。(計算機網路謝希仁)
TCP分段每個都有完整首部。
PS:所以我覺得是這樣的,TCP的分段是針對應用層的資料來說的,比如使用TCP傳送70KB的資料,這個時候就需要將70KB分成若干個MSS,到了網路層就不需要分片了。MSS的存在就避免了網路層分片的發生,
IP層的分片是針對傳輸層中使用UDP協議來說的,如果使用UDP傳送資料,UDP並不知道如何分段,那麼到了IP層就需要進行分片,分片的原則根據MTU,那麼分UDP最大的資料負載就是1500-8=1492
TCP/UDP實驗
看完了理論,讓我們實踐一把,看是否與以上的理論相符。
對於TCP來說,它是儘量避免分片的。假設我們這裡要傳送給TCP層的資料大小為2748個位元組,這個大小是明顯大於鏈路層的傳送資料的大小的,在這個情況
下我們來看,對於來自TCP層的資料,IP會不會進行分片。
從第一張圖看來,應用層的2748個位元組在TCP層就進行了分段,分層了兩個TCP段,一個1460位元組,一個1288位元組。那麼到IP層的時候,自然就不會在進行分片了。
從第二張圖片看出,在這兩個TCP分段中,在序號3處,IP的頭部欄位(Don ' t Fragment) 被設定了,用於告訴IP層不要對該資料進行分片。
而對於MSS大小的協商,我們可以從下面這張圖片看到,下面的圖片是TCP CLIENT發出的第一個SYN TCP分段:
對於UDP來說,假設我們要傳送的一個UDP資料包大小為1600個位元組,那麼在實際上通過UDP/IP分發出去的時候,會不會進行分片呢? 看如下的圖片: 從上面的圖片可以看出,我們傳送的資料包的大小為1600位元組(序號1處),在UDP層,長度為1608位元組(序號2處),這裡的8個位元組是UDP的頭部欄位的長度, 到了IP層(序號3處),我們可以清楚的看到IP對UDP資料包進行了分片,一個大小為1480位元組,一個為128位元組。