引言:為了適應(yīng)以太網(wǎng)的這種數(shù)據(jù)傳輸限制,IP在網(wǎng)絡(luò)層傳輸時(shí)采用的了分片的技術(shù)手段。下面我們將通過PING命令發(fā)送ICMP數(shù)據(jù)包來真實(shí)體驗(yàn)一下IP分片的全過程。
傳統(tǒng)的以太網(wǎng)是共享性局域網(wǎng),采用載波偵聽多路訪問/沖突檢測CSMA/CD協(xié)議。最小幀長必須大于整個(gè)網(wǎng)絡(luò)的最大時(shí)延位(最大時(shí)延時(shí)間內(nèi)可以傳輸?shù)臄?shù)據(jù)位)。
如果幀長度太小,就可能出現(xiàn)網(wǎng)絡(luò)上同時(shí)有兩個(gè)幀在傳播,就會產(chǎn)生沖突(碰撞)而造成網(wǎng)絡(luò)無法發(fā)送數(shù)據(jù)。如果數(shù)據(jù)幀太長就會出現(xiàn)有的工作長時(shí)間不能發(fā)送數(shù)據(jù),而且可能超出接受端的緩沖區(qū)大小,造成緩沖益出。
由于多方面的限制,每個(gè)以太網(wǎng)幀最小不能低于64字節(jié),最大不能超過1518字節(jié)。對于小于或者大于這個(gè)限制的以太網(wǎng)幀我們都可以視之為錯(cuò)誤的數(shù)據(jù)幀,一般的以太網(wǎng)轉(zhuǎn)發(fā)設(shè)備會丟棄這些數(shù)據(jù)幀。
為了適應(yīng)以太網(wǎng)的這種數(shù)據(jù)傳輸限制,IP在網(wǎng)絡(luò)層傳輸時(shí)采用的了分片的技術(shù)手段。IP協(xié)議在傳輸數(shù)據(jù)包時(shí),將數(shù)據(jù)報(bào)文分為若干分片進(jìn)行傳輸,并在目標(biāo)系統(tǒng)中進(jìn)行重組。這一過程稱為分片(fragmentation)。
MTU(最 大數(shù)據(jù)傳輸單元)是指一種通信協(xié)議的某一層上面所能通過的最大數(shù)據(jù)報(bào)大?。ㄒ宰止?jié)為單位)。最大傳輸單元這個(gè)參數(shù)通常與通信接口有關(guān)(網(wǎng)絡(luò)接口卡、串口等)。
我們這里是IP數(shù)據(jù)包的MTU即網(wǎng)絡(luò)層的最大數(shù)據(jù)傳輸單元,常見的以太網(wǎng)鏈路的MTU值為1500字節(jié)(這里不包括以太網(wǎng)幀頭開銷18字節(jié))。
數(shù)據(jù)包MTU的大小,并不是固定的。需要注意的是:網(wǎng)絡(luò)層外面還會加上數(shù)據(jù)鏈路層的封裝,經(jīng)過數(shù)據(jù)鏈路層封裝之后,才是一個(gè)數(shù)據(jù)包最終的大小。MTU只是限制了一個(gè)數(shù)據(jù)包經(jīng)過網(wǎng)絡(luò)層的封裝后,不要超過1500字節(jié)。
圖 1 IP包大小
圖 2 科來網(wǎng)絡(luò)分析系統(tǒng)抓包
圖 3 第1個(gè)ICMP數(shù)據(jù)包
以ICMP數(shù)據(jù)包為例,可用您想發(fā)送的 IP 包的大小減去 28。這是因?yàn)?,IP報(bào)頭的大小為 20字節(jié),而ICMP Echo 消息的 ICMP報(bào)頭的大小為 8 字節(jié)。
圖1顯示了二者的關(guān)系。實(shí)質(zhì)上所發(fā)送的有效數(shù)據(jù)是1472字節(jié)(1500-20-8)。
下面我們通過最常用的PING命令發(fā)送ICMP數(shù)據(jù)包來驗(yàn)證IP分片的過程。這里我們采用科來網(wǎng)絡(luò)分析系統(tǒng)(中文版)進(jìn)行抓包分析。
因?yàn)橐蕴W(wǎng)默認(rèn)的MTU值為1500Byte,所 以 為了達(dá)到分片的效果,我們應(yīng)該傳輸大于1500Byte字節(jié)的數(shù)據(jù)包,才能使該數(shù)據(jù)包分段傳輸。
我們平時(shí)在檢測網(wǎng)絡(luò)故障時(shí)采用PING命令,默認(rèn)都是發(fā)送的32字節(jié),現(xiàn)在為了實(shí)驗(yàn)的效果我們發(fā)送使MTU大于1500字節(jié)的數(shù)據(jù),從上面分析得出最大可發(fā)送的有效數(shù)據(jù)為1472字節(jié),所以我們發(fā)送1473字節(jié)的ICMP數(shù)據(jù)包。
實(shí)驗(yàn)環(huán)境:內(nèi)網(wǎng)訪問 ,兩端電腦的MTU=1500。在Windows命令提示符下輸入:ping 192.168.0.1-l 1473。
通過科來網(wǎng)絡(luò)分析系統(tǒng)抓包,我們看到,該數(shù)據(jù)包被分片了,由于PING命令重復(fù)ping了4次,每次分片后有2個(gè)數(shù)據(jù)包,所以總共抓到了16次。數(shù)據(jù)包如圖2所示。
查看詳細(xì)的數(shù)據(jù)包解碼,第1個(gè)發(fā)出的ICMP數(shù)據(jù)包,如圖3所示。
分析:因?yàn)閜ing的長度是1473字節(jié),IP數(shù)據(jù)包就是1501(20+8+1473)大于了MTU1500的值,所以會分片發(fā)送。捕獲的這個(gè)數(shù)據(jù)包總長度為1500字節(jié),更多分段位置1,表示還有數(shù)據(jù)分段。s,偏移量為0。
需要注意的是IP頭部的總長度字段值(這里是1500字節(jié))并不全是數(shù)據(jù)的凈載荷長度,這里還包括了IP以及ICMP的頭部長度,分別是20字節(jié)和8字節(jié)。另外,IP協(xié)議的頭部總長度并不一定就是MTU值1500字節(jié),這個(gè)值與網(wǎng)絡(luò)環(huán)境、操作系統(tǒng)等因素有關(guān)。
圖 4 第1個(gè)分片包
圖5 接收的分片包
圖4是第一個(gè)發(fā)送出去的分片包。分析:IP字段的標(biāo) 識0x3D7D,與第一個(gè)包相同,說明這是同一個(gè)數(shù)據(jù)包,只是被分片了。偏移量為185,表示相對第一個(gè)包的位置,以便接收主機(jī)根據(jù)偏移量進(jìn)行數(shù)據(jù)重組。
需要注意的是此處分片包并沒有ICMP字段,接收主機(jī)會根據(jù)偏移來重組成完整的ICMP數(shù)據(jù)包。
最后,我們來計(jì)算一下該數(shù)據(jù)包的長度:第一個(gè)數(shù)據(jù)包的總長度為1500字節(jié),減去IP頭部長度20字節(jié),減去ICMP頭部長度8字節(jié),即1500-20-8=1472字節(jié);第二個(gè)數(shù)據(jù)包的總長度為21字節(jié),減去IP頭部長度20字節(jié),即21-20=1字節(jié),兩個(gè)數(shù)據(jù)包的凈載荷 1472+1= 1473,正好是我們發(fā)送的數(shù)據(jù)長度。
以上就是IP分片包的全過程,但細(xì)心的朋友會發(fā)現(xiàn)發(fā)送與接收的數(shù)據(jù)包大小不一樣了。
首先來說一下第1個(gè)發(fā)出的數(shù)據(jù)包大小1518,它實(shí)質(zhì)上是IP數(shù)據(jù)包大小1500字節(jié)加上以太網(wǎng)的幀頭開銷18字節(jié),這個(gè)接收的數(shù)據(jù)包也是1518。
再看第一個(gè)發(fā)出的IP分片大小39字節(jié),它由21字節(jié)的IP數(shù)據(jù)包加上18字節(jié)的以太網(wǎng)的幀頭。但接收到的IP分片大小為64字節(jié),64-20-18=26字節(jié)。也就是說收到的分片數(shù)據(jù)包里有效數(shù)據(jù)是26并不是發(fā)出去的1,通過抓包確實(shí)如此,如圖5。
以上是收到的第1個(gè)數(shù)據(jù)包及IP分片包,IP分片包中額外數(shù)據(jù)顯示字節(jié)數(shù)26,但I(xiàn)P總長度只有21。其實(shí)這也是以太網(wǎng)中有關(guān)數(shù)據(jù)包傳輸大小的限制了,我們更多的時(shí)候只是關(guān)注了MTU即最大傳輸單元,其實(shí)還有一個(gè)最小傳輸值64,這是根據(jù)以太網(wǎng)的特性設(shè)置,為了檢測到網(wǎng)絡(luò)中的沖突數(shù)據(jù)包,規(guī)定最小傳輸數(shù)據(jù)幀的大小為64。
圖 6 發(fā)出去的ICMP數(shù)據(jù)包
圖 7 回顯數(shù)據(jù)包
如果發(fā)送的數(shù)據(jù)不足,MAC子層就會在數(shù)據(jù)字段的后面填充,以滿足數(shù)據(jù)幀長不小于64字節(jié)。但為什么發(fā)出去的數(shù)據(jù)包沒有呢,MAC子層的數(shù)據(jù)網(wǎng)絡(luò)分析軟件沒有捕捉到,但在接收電腦上是可以抓到的。
實(shí)驗(yàn)環(huán)境:內(nèi)網(wǎng)訪問一端電腦的MTU=1480一端電腦的MTU=1500。
對方電腦的MTU 是 1480,實(shí)際可以處理的數(shù)據(jù)應(yīng)是1480-20(IP)-8(ICMP)=1452,所以我們發(fā)送數(shù)據(jù)包大 小 1453。ping 192.168.0.4 -l 1453。
圖6是發(fā)出去的ICMP數(shù)據(jù)包,因?yàn)?453比1472小不需要分片,所以直接發(fā)送,沒有IP分片數(shù)據(jù)包了。
圖7是對方電腦發(fā)來的回顯數(shù)據(jù)包,1453剛好超過1452。但請注意,這里并不是分成第一個(gè)數(shù)據(jù)包1452,第二個(gè)數(shù)據(jù)包1,而是第1個(gè)數(shù)據(jù)包1448。
這是因?yàn)闉榱朔奖愕刂穼ぶ?,分片后的?shù)據(jù)包要是8的整數(shù)部(最后一個(gè)除外),這樣最接近1452被8整除的是1448,所以分片后第一個(gè)數(shù)據(jù)包是1448,第二個(gè)IP分片數(shù)據(jù)包是5。
圖8是ICMP回顯的IP分片數(shù)據(jù)包,其中IP總長底是25,其中包括20字節(jié)的IP信息,所以真正回顯的數(shù)據(jù)是5字節(jié),當(dāng)然為了滿足最小傳輸數(shù)據(jù)長度64,還要填充21字節(jié),所以下面額外數(shù)據(jù)顯示26字節(jié)。
圖 8 回顯的分片包
表1 實(shí)驗(yàn)列表
如表1所示,以上兩個(gè)實(shí)驗(yàn)都是在內(nèi)網(wǎng)測試,關(guān)于MTU值的設(shè)定可以通過很多工具來實(shí)現(xiàn)。雖然在整個(gè)互聯(lián)網(wǎng)中,數(shù)據(jù)包要經(jīng)過很多網(wǎng)絡(luò)設(shè)備,不同網(wǎng)絡(luò)設(shè)備的MTU都不一樣,但是都需要經(jīng)過IP分片再重組最后到達(dá)目的地。
當(dāng)然,在分片數(shù)據(jù)包適應(yīng)了網(wǎng)絡(luò)數(shù)據(jù)傳輸大小限制的同時(shí),也帶來了一些問題:第一,性能消耗。分片和重組會消耗發(fā)送方、接收方的CPU等資源,如果存在大量的分片報(bào)文,可能會造成較為嚴(yán)重的資源消耗。分片對接收方內(nèi)存資源的消耗較多,是因?yàn)榻邮辗揭獮榻邮盏降拿總€(gè)分片報(bào)文分配內(nèi)存空間,以便于最后一個(gè)分片報(bào)文到達(dá)后完成重組。如果某個(gè)分片報(bào)文在網(wǎng)絡(luò)傳輸過程中丟失,接收方將無法完成重組,這時(shí)應(yīng)用進(jìn)程要求重傳的話,那么發(fā)送方必須重傳所有分片報(bào)文而不是僅重傳被丟棄的那部分。這種效率低下的重傳行為會給端系統(tǒng)和網(wǎng)絡(luò)資源帶來額外的消耗。
第二,安全隱患。不向接收方發(fā)送最后一個(gè)分片報(bào)文的惡意報(bào)文,會導(dǎo)致接收方要為所有的分片報(bào)文分配內(nèi)存空間,可接接收方的內(nèi)存得不到及時(shí)的釋放(接收方會啟動一個(gè)分片重組的定時(shí)器,在一定時(shí)間內(nèi),如果無法完成重組,將向發(fā)送方發(fā)送ICMP重組超時(shí)差錯(cuò)報(bào)文)。
只要這種攻擊的分片報(bào)文發(fā)送的足夠多、足夠快,很容易占滿接收方的內(nèi)存,讓接收方因無內(nèi)存資源而不能處理正常業(yè)務(wù),從而達(dá)到DOS的惡性攻擊效果。
由于分片只有第一個(gè)分片報(bào)文具有四層信息而其他分片沒有,這就給路由器和防火墻等中間設(shè)備在訪問控制策略匹配方面帶來了一定麻煩。
如果路由器和防火墻等中間設(shè)備不對分片報(bào)文進(jìn)行安全策略的匹配檢測而直接放行IP分片報(bào)文,則有可能給接收方帶來安全隱患和威脅,因?yàn)楹诳涂梢岳眠@個(gè)特性,繞過路由器、防火墻的安全策略檢查對接收方實(shí)施攻擊。如果路由器、防火墻等中間設(shè)備對這些分片報(bào)文進(jìn)行重組后,再匹配其安全策略,那么又會對這些中間設(shè)備的資源帶來極大的消耗。
特別是在遇到分片攻擊的時(shí)候,這些中間設(shè)備會在第一時(shí)間消耗完所有內(nèi)存資源,最后導(dǎo)致全網(wǎng)中斷的嚴(yán)重后果。所以,分片帶來的安全隱患要及時(shí)防范。