當一個主機傳送資料到另一個主機時,這些資料需要透過多個路由層轉送。 IP在路由層的轉送過程較為複雜,如何處理目的主機所傳送的資料封包呢?
首先我們需要了解資料封包的格式:
IP的轉送與控制都是由IP資料封包的頭部決定
4位首長度的數值是以 4位元組為單位的,最小值為 5,也就是說首長度最小是 4x5=20位元組 ,
#也就是不帶任何選項的 IP首部 ,4位能表表示的最大值是 15,也就是說首長度最大是 60位元組
8位元TOS字段有 3個位元用來指定IP資料封包的優先權(目前已經廢棄不用 ),還有4個位元表示可選
包括服務類型的最小延遲、最大吞吐量、最大可靠性和最小成本,以及總位元始終為0。
16位元總長度是整個資料封包 (包括IP首部和 IP層payload)的位元組數。
每傳一個 IP資料封包 ,16 位元的識別加1,可用來分片和重新組裝資料封包。
3位元標誌和13位元片偏移用於分片 。
TTL(Time to live) 是這樣用的 :來源主機為封包設定一個生存時間 ,例如 64,每過一個路由器
就把該值減 1,如果減到 0就表示路由已經太長了仍然找不到目的主機的網路 ,就丟棄該包 ,因此
這個生存時間的單位不是秒 ,而是跳 (hop) 。
協定欄位指示上層協定是 TCP、 UDP、 ICMP或 IGMP。
接著是 校驗和, 只校驗IP首部 ,資料的校驗由更高層協定負責。
IPv4的IP位址長度為 32位元。
在IP資料封包中總長度是16位元的字段,一次資料封包的最大長度為2^16-1,雖然盡可能長的資料封包能夠提高傳輸效率,但是很少有超過1500字節的;所以這裡只要超過1500字節,就認為此數據報該分片了。 IP資料封包被分片以後,各分片分別組成一個具有IP首部的分組,並各自獨立的路由,分別抵達目的主機後,目的主機的IP層會在傳送給傳輸層之前將收到的所有分片重新組裝成一個數據報。
一.IP分片
1.IP分片原理:
分片與重新組裝的過程對於傳輸層是透明的,原因是IP資料封包進行分片以後,只有它到達下一站時才可以進行重新組裝,且它是由目的端的IP層來完成的,分片之後的數據報根據需要可以再次分片;
IP分片和完整的報文差不多擁有相同的IP頭,ID域對美英分片都是一致的,這樣才能在進行組裝的時候識別出來同一個IP頭報文分片。在IP頭裡面,16位元識別號碼唯一記錄了一個IP報的ID,具有同一個ID的IP分片將會重新進行組裝;而13位片偏移則記錄了某IP片相對於整個包的位置;這兩個表中間的3位標誌則標示該分片後面是否還有新的分片。接收者可透過這三個領域中提供的資訊對IP資料進行重組,而這三個領域是構成IP分片的全部資訊。
(1)標誌欄位的功能
0 DF MF
標誌欄位共三位,最高位元為0,且必須複製到所有分組中
不分片(Do not Fragment ,DF)值必須複製。 DF=1表示 接受主機不能對分組進行分片。如果無法對分組進行分片,但其長度超過了MTU,那麼這個分組只能被丟棄,同時需要使用ICMP錯誤訊息通知來源主機。 DF=0,表示可以分片
分片(MF)表示分片是不是最後一個分片,MF=1表示接受分片不是最後一個分片,MF=0表示接受分片時是最後一個分片
故意發送部分IP分片而不是全部,則會導致目標主機總是等待分片消耗並佔用系統資源。
2.MTU(最大傳輸單元)原理
當兩台遠端CP互聯的時候,他們的資料要穿過很多的路由器和各種各樣的網路媒介才能到達對端
,網路中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細的水管組成(MTU不同)通過這段水管最大水量就要由中間最細的水管決定。
對於網路層的上層協定而言(這裡以TCP/IP協定簇為例)他們對水管的粗細不在意因為他們認為 這是網路的事情。 IP協定在網路層會偵測每個從上層協定傳送下來的資料包的大小,根據本機的MTU大小來判斷是否需要對其進行分片處理。分片的最大缺點是會降低傳輸效能,需要將原本可以一次完成的任務分成多次處理。所以在網路的更高一層(傳輸層的實作)往往會對此加以注意,因為有些高層因為某些原因可能就要求不能對分組進行分片,索引會在IP資料報的包頭加上一個標籤:DF這樣IP封包在一大段網路傳輸的時候,如果遇到MTU小於封包的情況,轉送設備會根據情況丟掉這個封包。然後回傳一個錯誤訊息給發送者,這往往會造成通訊上的問題,不過幸運的是大部分網路連結MTU都是1500或大於1500
對於UDP而言,這個協定本身是無連接的協議,對資料包的到達順序是否正確並不關心,所以一般UDP對分片沒有多大要求
對於TCP就不一樣了,這個協議是面向連接的協議,對於TCP而言它非常在意資料包的到達順序
以及在傳輸過程中是否有錯誤發生,所以有些TCP應用程式對分片有要求---不能分片
3.MSS(最大封包長度)原理
MSS就是TCP封包每次能夠傳輸的最大資料分段,為了達到最佳的傳輸效能TCP協定在建立連線的時候通常要協商雙方MSS的值,這個值TCP協定在實現的時候用MTU取代(要減去IP封包的包頭大小20bites和TCP資料段的包頭20BITES)所以MSS大小往往為1460,雙方會根據提供的MSS最小值來決定這次連接的MSS最大值
二.IP分片步驟
一個未分片的資料封包的分片資訊欄位全為0,即多個分片標誌位元為0,且偏移量為0,分片一個資料報需要經過一下步驟
(1)檢查DF標誌位,查看是否允許分片,如果設定了該位,則資料報將被丟棄,並將ICMP錯誤傳回給來源端
(2)基於MTU值,把資料欄位分成兩個或對個部分,除了最後的資料部分外,所有新建的資料選項長度必須為8位元組的倍數
(3)每個資料被放入一個IP資料報,這些資料報的包頭稍微改變了原先的封包頭
(4)除了最後的資料報分片外,所有的分片都設定了多個分片標誌位元
(5)每個分片中的片偏移量欄位設為這個資料部分在原來資料封包中所佔的位置,這個位置相對於原來未分片資料報中的開頭處。
(6)如果在原來的資料報中包含了選項,則選項類型位元組的高位元組決定了這個資訊是被複製到所有分片資料報,還是只複製到第一個資料報。
(7) 設定新資料封包的封包頭欄位及總長度欄位。
(8)重新計算封包頭部校驗和欄位。
此時這些分片資料封包如一個完整的IP資料封包一樣被轉發,IP獨立的處理每個資料報分片,資料報分片能夠通過不同的路由,到達目的,如果他們通過了那些規定了較小的MTU路由,也能夠進一步對他們進行分片
在目的主機上,資料被重新組合成原來的資料報,發送主機設定的標示欄位與資料報中的袁IP位址和目的IP位址一起使用,分片過程不改變這個欄位
三.重組
為了重建這些資料封包的分片,接收主機會在第一個分片到達時分配一個儲存緩衝區。這個主機還將啟動一個計時器。當資料報的後續分片到達時,資料被複製到緩衝區記憶體中片偏移量指定的位置,當所有分片都到達時,完整的未分片的原始資料報就被恢復了。
如果計時器逾時且分片保持未經認可狀態,則資料將無法保留。這個計時器的初始值為IP資料封包的生存期值,它依賴實現的,一些實作允許對他進行設定。
重組步驟
在接受方,一個由發送方發出的原始資料IP報,將所有的分片重新組合,才能夠提交到上一層協議,每一個將被重組的IP資料封包都用一個ipq結構來表示
為了能夠有效提高組裝分片,用來保存分片的結構必須做到以下幾點
(1)快速定位某一個資料報的一組分組
(2)在屬於某一個資料報的一組分片中快速插入新的分片
(3)有效的判斷一個資料報的所有分片是否已經被全部接收
(4)具有重組超時機制,如果在重組完成之前超時溢出,則刪除該資料報的所有內容
以上是IP資料封包的分片和組裝原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!