1. 程式人生 > >TCP層的分段和IP層的分片之間的關係 MTU和MSS之間的關係

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層

來進行重新組裝,其目的是使分片和重新組裝過程對運輸層(TCP/UDP)是透明的。由於每一分片都是一個獨立的包,當這些資料報的片到達目的端時有可能會失序,但是在IP首部中有足夠的資訊讓接收端能正確組裝這些資料報片。

(3)儘管IP分片過程看起來透明的,但有一點讓人不想使用它:即使只丟失一片資料也要重新傳整個資料報。why?因為IP層本身沒有超時重傳機制------由更高層(比如TCP)來負責超時和重傳。當來自TCP報文段的某一片丟失後,TCP在超時後會重發整個TCP報文段,該報文段對應於一份IP資料報(而不是一個分片),沒有辦法只重傳資料報中的一個數據分片。

(4)使用UDP很容易導致IP分片,TCP試圖避免IP分片

。 那麼TCP是如何試圖避免IP分片的呢?其實說白了,採用TCP協議進行資料傳輸是不會造成IP分片的,因為一旦TCP資料過大,超過了MSS,則在傳輸 層會對TCP包進行分段(如何分,見下文!),自然到了IP層的資料報肯定不會超過MTU,當然也就不用分片了。而對於UDP資料報,如果UDP組成的 IP資料報長度超過了1500,那麼IP資料報顯然就要進行分片,因為UDP不能像TCP一樣自己進行分段。總結:UDP不會分段,就由我IP來分。TCP會分段,當然也就不用我IP來分了!

2,MSS(Maxitum Segment Size)最大分段大小的縮寫,是TCP協議裡面的一個概念

(1)MSS就是TCP資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能TCP協議在建立連線的時候通常要協商雙方的MSS

值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP資料包包頭的大小20Bytes和TCP資料段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值確定為這次連線的最大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位元組。