引言:為了適應以太網的這種數據傳輸限制,IP在網絡層傳輸時采用的了分片的技術手段。下面我們將通過PING命令發送ICMP數據包來真實體驗一下IP分片的全過程。
傳統的以太網是共享性局域網,采用載波偵聽多路訪問/沖突檢測CSMA/CD協議。最小幀長必須大于整個網絡的最大時延位(最大時延時間內可以傳輸的數據位)。
如果幀長度太小,就可能出現網絡上同時有兩個幀在傳播,就會產生沖突(碰撞)而造成網絡無法發送數據。如果數據幀太長就會出現有的工作長時間不能發送數據,而且可能超出接受端的緩沖區大小,造成緩沖益出。
由于多方面的限制,每個以太網幀最小不能低于64字節,最大不能超過1518字節。對于小于或者大于這個限制的以太網幀我們都可以視之為錯誤的數據幀,一般的以太網轉發設備會丟棄這些數據幀。
為了適應以太網的這種數據傳輸限制,IP在網絡層傳輸時采用的了分片的技術手段。IP協議在傳輸數據包時,將數據報文分為若干分片進行傳輸,并在目標系統中進行重組。這一過程稱為分片(fragmentation)。
MTU(最 大數據傳輸單元)是指一種通信協議的某一層上面所能通過的最大數據報大小(以字節為單位)。最大傳輸單元這個參數通常與通信接口有關(網絡接口卡、串口等)。
我們這里是IP數據包的MTU即網絡層的最大數據傳輸單元,常見的以太網鏈路的MTU值為1500字節(這里不包括以太網幀頭開銷18字節)。
數據包MTU的大小,并不是固定的。需要注意的是:網絡層外面還會加上數據鏈路層的封裝,經過數據鏈路層封裝之后,才是一個數據包最終的大小。MTU只是限制了一個數據包經過網絡層的封裝后,不要超過1500字節。

圖 1 IP包大小

圖 2 科來網絡分析系統抓包

圖 3 第1個ICMP數據包
以ICMP數據包為例,可用您想發送的 IP 包的大小減去 28。這是因為,IP報頭的大小為 20字節,而ICMP Echo 消息的 ICMP報頭的大小為 8 字節。
圖1顯示了二者的關系。實質上所發送的有效數據是1472字節(1500-20-8)。
下面我們通過最常用的PING命令發送ICMP數據包來驗證IP分片的過程。這里我們采用科來網絡分析系統(中文版)進行抓包分析。
因為以太網默認的MTU值為1500Byte,所 以 為了達到分片的效果,我們應該傳輸大于1500Byte字節的數據包,才能使該數據包分段傳輸。
我們平時在檢測網絡故障時采用PING命令,默認都是發送的32字節,現在為了實驗的效果我們發送使MTU大于1500字節的數據,從上面分析得出最大可發送的有效數據為1472字節,所以我們發送1473字節的ICMP數據包。
實驗環境:內網訪問 ,兩端電腦的MTU=1500。在Windows命令提示符下輸入:ping 192.168.0.1-l 1473。
通過科來網絡分析系統抓包,我們看到,該數據包被分片了,由于PING命令重復ping了4次,每次分片后有2個數據包,所以總共抓到了16次。數據包如圖2所示。
查看詳細的數據包解碼,第1個發出的ICMP數據包,如圖3所示。
分析:因為ping的長度是1473字節,IP數據包就是1501(20+8+1473)大于了MTU1500的值,所以會分片發送。捕獲的這個數據包總長度為1500字節,更多分段位置1,表示還有數據分段。s,偏移量為0。
需要注意的是IP頭部的總長度字段值(這里是1500字節)并不全是數據的凈載荷長度,這里還包括了IP以及ICMP的頭部長度,分別是20字節和8字節。另外,IP協議的頭部總長度并不一定就是MTU值1500字節,這個值與網絡環境、操作系統等因素有關。

圖 4 第1個分片包

圖5 接收的分片包
圖4是第一個發送出去的分片包。分析:IP字段的標 識0x3D7D,與第一個包相同,說明這是同一個數據包,只是被分片了。偏移量為185,表示相對第一個包的位置,以便接收主機根據偏移量進行數據重組。
需要注意的是此處分片包并沒有ICMP字段,接收主機會根據偏移來重組成完整的ICMP數據包。
最后,我們來計算一下該數據包的長度:第一個數據包的總長度為1500字節,減去IP頭部長度20字節,減去ICMP頭部長度8字節,即1500-20-8=1472字節;第二個數據包的總長度為21字節,減去IP頭部長度20字節,即21-20=1字節,兩個數據包的凈載荷 1472+1= 1473,正好是我們發送的數據長度。
以上就是IP分片包的全過程,但細心的朋友會發現發送與接收的數據包大小不一樣了。
首先來說一下第1個發出的數據包大小1518,它實質上是IP數據包大小1500字節加上以太網的幀頭開銷18字節,這個接收的數據包也是1518。
再看第一個發出的IP分片大小39字節,它由21字節的IP數據包加上18字節的以太網的幀頭。但接收到的IP分片大小為64字節,64-20-18=26字節。也就是說收到的分片數據包里有效數據是26并不是發出去的1,通過抓包確實如此,如圖5。
以上是收到的第1個數據包及IP分片包,IP分片包中額外數據顯示字節數26,但IP總長度只有21。其實這也是以太網中有關數據包傳輸大小的限制了,我們更多的時候只是關注了MTU即最大傳輸單元,其實還有一個最小傳輸值64,這是根據以太網的特性設置,為了檢測到網絡中的沖突數據包,規定最小傳輸數據幀的大小為64。

圖 6 發出去的ICMP數據包

圖 7 回顯數據包
如果發送的數據不足,MAC子層就會在數據字段的后面填充,以滿足數據幀長不小于64字節。但為什么發出去的數據包沒有呢,MAC子層的數據網絡分析軟件沒有捕捉到,但在接收電腦上是可以抓到的。
實驗環境:內網訪問一端電腦的MTU=1480一端電腦的MTU=1500。
對方電腦的MTU 是 1480,實際可以處理的數據應是1480-20(IP)-8(ICMP)=1452,所以我們發送數據包大 小 1453。ping 192.168.0.4 -l 1453。
圖6是發出去的ICMP數據包,因為1453比1472小不需要分片,所以直接發送,沒有IP分片數據包了。
圖7是對方電腦發來的回顯數據包,1453剛好超過1452。但請注意,這里并不是分成第一個數據包1452,第二個數據包1,而是第1個數據包1448。
這是因為為了方便地址尋址,分片后的數據包要是8的整數部(最后一個除外),這樣最接近1452被8整除的是1448,所以分片后第一個數據包是1448,第二個IP分片數據包是5。
圖8是ICMP回顯的IP分片數據包,其中IP總長底是25,其中包括20字節的IP信息,所以真正回顯的數據是5字節,當然為了滿足最小傳輸數據長度64,還要填充21字節,所以下面額外數據顯示26字節。

圖 8 回顯的分片包

表1 實驗列表
如表1所示,以上兩個實驗都是在內網測試,關于MTU值的設定可以通過很多工具來實現。雖然在整個互聯網中,數據包要經過很多網絡設備,不同網絡設備的MTU都不一樣,但是都需要經過IP分片再重組最后到達目的地。
當然,在分片數據包適應了網絡數據傳輸大小限制的同時,也帶來了一些問題:第一,性能消耗。分片和重組會消耗發送方、接收方的CPU等資源,如果存在大量的分片報文,可能會造成較為嚴重的資源消耗。分片對接收方內存資源的消耗較多,是因為接收方要為接收到的每個分片報文分配內存空間,以便于最后一個分片報文到達后完成重組。如果某個分片報文在網絡傳輸過程中丟失,接收方將無法完成重組,這時應用進程要求重傳的話,那么發送方必須重傳所有分片報文而不是僅重傳被丟棄的那部分。這種效率低下的重傳行為會給端系統和網絡資源帶來額外的消耗。
第二,安全隱患。不向接收方發送最后一個分片報文的惡意報文,會導致接收方要為所有的分片報文分配內存空間,可接接收方的內存得不到及時的釋放(接收方會啟動一個分片重組的定時器,在一定時間內,如果無法完成重組,將向發送方發送ICMP重組超時差錯報文)。
只要這種攻擊的分片報文發送的足夠多、足夠快,很容易占滿接收方的內存,讓接收方因無內存資源而不能處理正常業務,從而達到DOS的惡性攻擊效果。
由于分片只有第一個分片報文具有四層信息而其他分片沒有,這就給路由器和防火墻等中間設備在訪問控制策略匹配方面帶來了一定麻煩。
如果路由器和防火墻等中間設備不對分片報文進行安全策略的匹配檢測而直接放行IP分片報文,則有可能給接收方帶來安全隱患和威脅,因為黑客可以利用這個特性,繞過路由器、防火墻的安全策略檢查對接收方實施攻擊。如果路由器、防火墻等中間設備對這些分片報文進行重組后,再匹配其安全策略,那么又會對這些中間設備的資源帶來極大的消耗。
特別是在遇到分片攻擊的時候,這些中間設備會在第一時間消耗完所有內存資源,最后導致全網中斷的嚴重后果。所以,分片帶來的安全隱患要及時防范。