當一個主機發送數據到另一個主機時,這些數據需要通過多個路由層轉發。ip在路由層的轉發過程較為復雜,如何處理目的主機發送的數據報呢?
? ?首先我們需要了解數據報的格式:
IP的轉發和控制都是由IP數據報的頭部決定
4位首部長度的數值是以?4字節為單位的,最小值為?5,也就是說首部長度最小是?4×5=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)具有重組超時機制,如果在重組完成之前超時溢出,則刪除該數據報的所有內容