引言:
通常要傳輸的IP封包的大小超過最大傳輸機關MTU(Maximum Transmission Unit)時就會産生IP分片情況。IP分片通常發生在網絡環境中。比如說,在以太網(Ethernet)環境中可傳輸最大IP封包大小(MTU)為1500位元組。而傳輸的封包大小要比1500位元組(不包括以太協定的首部和尾部18個位元組)大,這個時候就需要利用到分片技術,經分片後才能傳輸此封包。另外,使用UDP很容易導緻IP分片,而很難強迫TCP發送一個需要進行分片的封包。
分片和重新組裝的過程對傳輸層是透明的,其原因是當IP資料報進行分片之後,隻有當它到達下一站時,才可進行重新組裝,且它是由目的端的IP層來完成的。分片之後的資料報根據需要也可以再次進行分片。
IP分片和完整IP封包差不多擁有相同的IP頭,ID域對于每個分片都是一緻的,這樣才能在重新組裝的時候識别出來自同一個IP封包的分片。在IP頭裡面,16位識别号唯一記錄了一個IP包的ID(ipid),具有同一個ID的IP分片将會重新組裝;而13位片偏移則記錄了某IP片相對整個包的位置;而這兩個表中間的3位标志則标志着該分片後面是否還有新的分片。這三個域就組成了IP分片的所有資訊, 接受方就可以利用這些資訊對IP資料進行重新組織。
## 1、标志字段的作用
标志字段在分片資料報中起了很大作用,在資料報分片時把它的值複制到每片中。标志字段的其中一個比特稱作“不分片”位,用其中一個比特來表示“更多的片”。除了最後一片外,其他每個組成資料報的片都要把該比特置1。片偏移字段指的是該片偏移原始資料報開始處的位置。另外,當資料報被分片後,每個片的總長度值要改為該片的長度值。如果将标志字段的"不分片"比特置1,則IP将不對資料報進行分片。相反把資料報丢棄并發送一個I C M P差錯封包并通知源主機廢棄的原因。如果不是特殊需要,則不應該置1;最右比特置1表示該封包不是最後一個IP分片。
故意發送部分IP分片而不是全部,則會導緻目标主機總是等待分片消耗并占用系統資源。某些分片風暴攻擊就是這種原理。
這裡以以太網為例,由于以太網傳輸電氣方面的限制,每個以太網幀都有最小的大小64bytes最大不能超過1518bytes, 抛去以太網幀的幀頭(DMAC目的MAC位址48bit=6Bytes+SMAC源MAC位址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes,那麼剩下承載上層協定的地方也就是Data域最大就隻能有1500Bytes,這就是前面所說的MTU的值。這個也是網絡層協定非常關心的地方,因為網絡層的IP協定會根據這個值來決定是否把上層傳達下來的資料進行分片。就好比一個盒子沒法裝下一大塊面包,我們需要把面包切成片,裝在多個盒子裡面一樣的道理。
## 2、MTU原理
當兩台遠端PC互聯的時候,它們的資料需要穿過很多的路由器和各種各樣的網絡媒介才能到達對端,網絡中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細的水管組成(MTU不同 )通過這段水管最大水量就要由中間最細的水管決定。
對于網絡層的上層協定而言(這裡以TCP/IP協定族為例)它們對水管粗細不在意它們認為這個是網絡層的事情。網絡層IP協定會檢查每個從上層協定下來的資料包的大小,并根據本機MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸性能,本來一次可以搞定的事情,分成多次搞定,是以在網絡層更高一層(就是傳輸層)的實作中往往會對此加以注意!有些高層因為某些原因就會要求我這個面包不能切片,我要完整地面包,是以會在IP資料包標頭裡面加上一個标簽:DF(Donot Fragment)。這樣當這個IP資料包在一大段網絡(水管裡面)傳輸的時候,如果遇到MTU小于IP資料包的情況,轉發裝置就會根據要求丢棄這個資料包。然後傳回一個錯誤資訊給發送者。這樣往往會造成某些通訊上的問題,不過幸運的是大部分網絡鍊路MTU都是1500或者大于1500。
對于UDP協定而言,這個協定本身是無連接配接的協定,對資料包的到達順序以及是否正确到達不甚關心,是以一般UDP應用對分片沒有特殊要求。
對于TCP協定而言就不一樣了,這個協定是面向連接配接的協定,對于TCP協定而言它非常在意資料包的到達順序以及是否傳輸中有錯誤發生。是以有些TCP應用對分片有要求---不能分片(DF)。
## 3、MSS的原理
MSS就是TCP資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能TCP協定在建立連接配接的時候通常要協商雙方的MSS值,這個值TCP協定在實作的時候往往用MTU值代替(需要減去IP資料包標頭的大小20Bytes和TCP資料段的標頭20Bytes)是以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值确定為這次連接配接的最大MSS值。
當IP資料報被分片後,每一片都成為一個分組,具有自己的IP首部,并在選擇路由時與其他分組獨立。這樣,當資料報的這些片到達目的端時有可能會失序,但是在IP首部中有足夠的資訊讓接收端能正确組裝這些資料報片。
盡管IP分片過程看起來是透明的,但有一點讓人不想使用它:即使隻丢失一片資料也要重傳整個資料報。因為IP層本身沒有逾時重傳的機制——由更高層來負責逾時和重傳(T C P有逾時和重傳機制,但UDP沒有。一些UDP應用程式本身也執行逾時和重傳)。當來自T C P封包段的某一片丢失後,T C P在逾時後會重發整個T C P封包段,該封包段對應于一份IP資料報。沒有辦法隻重傳資料報中的一個資料報片。事實上,如果對資料報分片的是中間路由器,而不是起始端系統,那麼起始端系統就無法知道資料報是如何被分片的。就這個原因,經常要避免分片。
分片重組是IP層一個最重要的工作,其處理的主要思想:當資料包從一個網絡A進入另一個網絡B時,若原網絡的資料包大于另一個網絡的最大資料包的長度,必須進行分片。因而在IP資料包的報頭有若幹辨別域注明分片包的共同辨別号、分片的偏移量、是否最後一片及是否允許分片。傳輸途中的網關利用這些辨別域進行分片,目有主機把收到的分片進行重組以恢重資料。是以,分片包在經過網絡監測裝置、安全裝置、系統管理裝置時,為了擷取資訊、處理資料,都必須完成資料包的分片或重組。
Identification R DF MF Fragment Offset
R:保留未用;DF:Don’t Fragment,“不分片”位,如果将這一比特置1,IP 層将不對資料報進行分片;MF:More Fragment,“更多的片”,除了最後一片外,其它每個組成資料報的片都要把比特置1;Fragment Offset:該片偏移原始資料包開始處的位置。偏移的位元組數是該值乘以8。