1. 程式人生 > >一篇文章講懂IP資料報分片、組裝以及與TCP/UDP的聯絡

一篇文章講懂IP資料報分片、組裝以及與TCP/UDP的聯絡

http://www.mamicode.com/info-detail-1465195.html

https://blog.csdn.net/leex_brave/article/details/51971053

https://blog.csdn.net/buptzwp/article/details/5055487

一、術語:

a、MTU:        

        當兩臺遠端PC互聯的時候,它們的資料需要穿過很多的路由器和各種各樣的網路媒介才能到達對端,網路中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細的水管組成(MTU不同 )通過這段水管最大水量就要由中間最細的水管決定。網路層IP協議會檢查每個從上層協議下來的資料包的大小,並根據本機MTU的大小決定是否作“分片”處理。

b、DF:

        DF(Donot Fragment)。這是一個標誌位,指明瞭不能進行IP資料包的分片。當這個IP資料包的DF設定為1,在一大段網路(水管裡面)傳輸的時候,如果遇到MTU小於IP資料包的情況,轉發裝置就會根據要求丟棄這個資料包。然後返回一個錯誤資訊給傳送者。

 c、MSS:
  MSS就是TCP資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能TCP協議在建立連線的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP資料包包頭的大小20Bytes和TCP資料段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值確定為這次連線的最大MSS值。

二、分片:

        IP報文在傳輸過程中,有些時候“水管”會越來越窄,也就是MTU會越來越小。IP報文也會一分再分。每個IP分片的報頭基本相同,只是片偏移不一樣

三、組裝:

         IP報文在傳輸過程中可能會分成多個片,在整個傳輸過程中是不會組裝的(路由器也沒有這個能力組裝),IP報文分片的組裝統一在對端主機上進行。對端主機在接收到IP資料報分片後會對其進行排序,形成一個完整的IP資料報之後上傳給傳輸層。但IP資料報之間是不保證有序的。

四、IP分片與TCP/UDP的聯絡:

TCP:

TCP三次握手時會商量好MSS值,其實也是根據下層的MTU值確定的。MSS指定了TCP資料包的大小,TCP流資料會按照MSS大小進行“打包”,打包後加上IP報頭後就是一個IP報文。IP報文在傳輸過程可能會分片。IP報文分片到對端後會在IP層進行組裝,組成一個完整的IP報文(也是一個TCP資料包)後上傳到傳輸層。由於IP層不確保IP報文之間有序,TCP得到的資料包也是無序的,但是TCP協議會對其進行排序,進而提交給上層使用者。如果因為某個IP報文分片丟失而導致IP層無法拼裝成一個完成的IP報文,就是接向傳輸層報告,也就是TCP的“丟包”,TCP進行重傳。

UDP:

UDP將整個報文直接傳給IP層,IP層加上IP報頭後就是一個IP報文,如果UDP報文很大,IP報文也會很大。當IP層發現MTU很小時,對IP報文進行切分。對端主機在IP層將IP分片組裝成完整的IP報文後上傳。在拼裝IP報文分片時如果少了某些分片,整個UDP報文就廢了。所以不應該將UDP報文的大小設定過大,越大,在傳輸過程中分片就會越多,丟失的可能性越大,傳送成功的可能性也就越低。

五、總結:

1、IP報文在傳輸過程中可能會多次分片

2、IP報文分片再傳輸過程中只會越分越小,不會組裝,組裝統一在對端主機的IP層進行

3、IP層不保證IP報文之間有序。但是對端主機在IP層會拼裝IP報文分片,形成一個完整的IP報文後上傳。拼裝過程其實就是對IP報文分片進行收集、排序的過程。