試驗(yàn)四IP包的分片和重組_第1頁
試驗(yàn)四IP包的分片和重組_第2頁
試驗(yàn)四IP包的分片和重組_第3頁
試驗(yàn)四IP包的分片和重組_第4頁
試驗(yàn)四IP包的分片和重組_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、實(shí)驗(yàn)四 IP包的分片和重組實(shí)驗(yàn)?zāi)康耐ㄟ^實(shí)驗(yàn)掌握IP數(shù)據(jù)包的分片和重組的方法。實(shí)驗(yàn)內(nèi)容對一個(gè)較長的IP分組進(jìn)行分片,然后再將所有的分片重新組裝成一個(gè)IP分組。實(shí)驗(yàn)要求(1) 從數(shù)據(jù)包文件如“packet.pkt”中讀取分組,并輸入一個(gè)整數(shù)值作為MTU。首先計(jì)算分組頭校驗(yàn)和,判斷分組接收是否正確,然后檢查分組長度是否超過MTU。如果長度超過MTU,則檢查DF位:若DF位為1,打印出錯(cuò)信息;否則對IP包進(jìn)行分片,生成各分片的文件,如Fragment1.pkt、Fragment2.pkt等。(2) 讀取上一步得到的各分片文件,首先計(jì)算頭校驗(yàn),檢查分片是否正確;然后將各個(gè)分片組裝成一個(gè)完整的分組,并保存

2、在一個(gè)數(shù)據(jù)包文件如“MergedPkt.pkt”中;比較MergePkt.pkt與原始的packet.pkt的數(shù)據(jù)部分內(nèi)容,以檢驗(yàn)分組分片和重組是否成功。嘗試不按順序讀入各個(gè)片段,驗(yàn)證重組程序是否仍然能夠正確重組分組。實(shí)驗(yàn)提示(1) IP數(shù)據(jù)包的格式為:與數(shù)據(jù)報(bào)的分片與重組有關(guān)的字段是:總長度、標(biāo)識(shí)、標(biāo)志、分片偏移、TTL、16位首部校驗(yàn)和。總長度:總長度以字節(jié)為單位,指該IP數(shù)據(jù)報(bào)的總大小,包括首部的20字節(jié)以及實(shí)際的來自應(yīng)用層的數(shù)據(jù)。判斷一個(gè)數(shù)據(jù)包是否要進(jìn)行分片,就是將收到的數(shù)據(jù)報(bào)的總長度與MTU進(jìn)行比較。如果總長度大于MTU,就需要進(jìn)行分片。標(biāo)識(shí):這個(gè)16位的字段標(biāo)識(shí)從源主機(jī)發(fā)出的數(shù)據(jù)報(bào)

3、。當(dāng)數(shù)據(jù)報(bào)離開源主機(jī)時(shí),這個(gè)標(biāo)識(shí)與源IP地址唯一地定義了這個(gè)數(shù)據(jù)報(bào)。為了保證唯一性,IP協(xié)議使用了一個(gè)計(jì)數(shù)器來標(biāo)識(shí)數(shù)據(jù)報(bào)。當(dāng)IP協(xié)議發(fā)送數(shù)據(jù)報(bào)時(shí),就把這個(gè)計(jì)數(shù)器的當(dāng)前值復(fù)制到標(biāo)識(shí)字段中,并把這個(gè)計(jì)數(shù)器的值加1。當(dāng)數(shù)據(jù)報(bào)被分片時(shí),標(biāo)識(shí)字段的值就被復(fù)制到所有的分片中,即同一個(gè)數(shù)據(jù)報(bào)的所有分片具有相同的標(biāo)識(shí)。這個(gè)標(biāo)識(shí)主要是用于在分片組裝的時(shí)候?qū)γ總€(gè)分片屬于哪個(gè)數(shù)據(jù)報(bào)進(jìn)行判斷。本次實(shí)驗(yàn)只考慮對同一個(gè)數(shù)據(jù)報(bào)進(jìn)行分片,并把這些分片重新組裝,因此不需要做這個(gè)判斷,只要直接把標(biāo)識(shí)拷貝到各分片中即可。標(biāo)志:這是一個(gè)3位的字段,如下圖所示:第一個(gè)比特保留為以后用;第二個(gè)比特是不分片(Do not fragment

4、)位。若這個(gè)值是1,機(jī)器就不能把該數(shù)據(jù)報(bào)進(jìn)行分片。若無法把這個(gè)數(shù)據(jù)報(bào)通過任何可用的物理網(wǎng)絡(luò)進(jìn)行轉(zhuǎn)發(fā),就丟棄這個(gè)數(shù)據(jù)報(bào),并向源主機(jī)發(fā)送ICMP差錯(cuò)報(bào)文。若這個(gè)值為0,則在需要的時(shí)候可把這個(gè)數(shù)據(jù)報(bào)進(jìn)行分片。第三個(gè)比特是還有分片(More fragment),若這個(gè)值是1,則表示這個(gè)數(shù)據(jù)報(bào)不是最后的分片,這個(gè)分片后面還有更多的分片。若這個(gè)值是0,則表示這已是最后的或者是唯一的分片。分片偏移:這個(gè)13位的字段表示這個(gè)分片在整個(gè)數(shù)據(jù)報(bào)中的相對位置。是在原始數(shù)據(jù)報(bào)中的數(shù)據(jù)偏移量,以8字節(jié)為度量單位。這樣做是因?yàn)榉制谱侄沃挥?3bit長,它不能表示超過8191的字節(jié)數(shù)。而IP數(shù)據(jù)報(bào)最大的長度為65535

5、字節(jié),因此按8字節(jié)為單位可以用13位來表示更多的字節(jié)。把數(shù)據(jù)報(bào)進(jìn)行分片的主機(jī)或路由器必須選擇每個(gè)分片的長度,使得這個(gè)長度可以被8整除。如下圖所示,一個(gè)具有4000字節(jié)的數(shù)據(jù)報(bào),當(dāng)MTU=1420字節(jié)的時(shí)候,被劃分為3個(gè)分片,每個(gè)分片長度為1400字節(jié),1400字節(jié)是可以被8整除的。為減少分片的數(shù)量,每個(gè)分片的長度應(yīng)盡可能大。為用片偏移表示片段的起始位置,除最后一個(gè)分片外,其它分片的長度(數(shù)據(jù)部分,不包括IP頭)應(yīng)能被8整除。如MTU=505的時(shí)候,除去20字節(jié)IP頭,可以傳輸?shù)淖畲髷?shù)據(jù)段長度為485字節(jié),但可被8整除及不不超過485的最大整數(shù)為480,需要按480來進(jìn)行分片。TTL:在分片的時(shí)

6、候需要對原數(shù)據(jù)報(bào)的TTL進(jìn)行減1操作,組裝的時(shí)候不需要此操作。首部檢驗(yàn)和:對于每一個(gè)分片,設(shè)置好各自的總長度、標(biāo)識(shí)、標(biāo)志、片偏移、TTL之后,需要重新對該IP報(bào)頭重新計(jì)算校驗(yàn)和。(2) IP數(shù)據(jù)報(bào)頭的C語言定義可以用類似如下的數(shù)據(jù)結(jié)構(gòu):typedef struct tagIPHDRunsigned char VIHL;/Version and IHLunsigned char TOS;/Type Of Serviceshort TotalLen;/Total Lengthshort ID;/IDentificationshort FlagOff;/Flags and Fragment Offs

7、etunsigned char TTL;/Time To Liveunsigned char Protocol;/Protocolunsigned short Checksum;/Checksumunsigned long SrcAddr;/Source Addressunsigned long DstAddr;/Destination AddressIPHDR,*PIPHDR;對各個(gè)域進(jìn)行操作時(shí)要注意網(wǎng)絡(luò)字節(jié)序與主機(jī)字節(jié)序的不同。對于8位的域,如TOS、TTL等不存這個(gè)問題。但對于16位的域,如總長度TotalLen,從二進(jìn)制文件中讀出來的TotalLen域從左到右為0000 0000 00

8、10 0100(即0x0024),即38,但如果直接unsigned short length=IPhead.TotalLen時(shí)這個(gè)值不等于38。這主要是由于多字節(jié)數(shù)字在內(nèi)存中存儲(chǔ)方式不同造成的,即大尾端小尾端的問題。解決此問題可以用ntohs函數(shù)來解決,即unsigned short length=ntohs(IPhead.TotalLen),時(shí)length就等于38了。在操作16位的總長度和16位的首部校驗(yàn)和的時(shí)候需要注意這一點(diǎn),不然使用位運(yùn)算的時(shí)候會(huì)出錯(cuò)。同樣對于32位源地址/目的地址也有這樣的問題,但本次實(shí)驗(yàn)不涉及IP地址的操作。(3) 給定的數(shù)據(jù)文件如packet.pkt是二進(jìn)制文件

9、,不能用普通的文本瀏覽器瀏覽,可以使用如UltraEdit或WinHex等二進(jìn)制瀏覽器打開,其中不帶選項(xiàng)的分組頭為20字節(jié),如圖所示:即IP頭為45 00 65 1A 37 A4 00 00 7F 06 EC 30D3 56 92 89 D2 2D 7A FB各個(gè)域?qū)懗啥M(jìn)制形式對應(yīng)到IP頭的各個(gè)域即可。在程序中打開IP數(shù)據(jù)報(bào)文件的時(shí)候需要以二進(jìn)制的方式打開,可以使用fstream的文件流來進(jìn)行文件讀取操作。#include ifstream SrcFileName(argv2,ios:in|ios:binary);IPHDR IPHead;Int IPHeadSize=20;SrcPkt.r

10、ead(char *)&IPHead,IPHeadSize)則從文件名為argv2所表示的字符串的文件中讀取了20個(gè)字節(jié)的內(nèi)容填充到了IPHead的各個(gè)域中。同樣,二進(jìn)制寫入到文件中也可以使用fstream流。如ofstream fragment(filename,ios:out|ios:binary);fragment.write(char *)buf,IPHeadSize+nLastFragmentSize);則可以將buf指針指示的一塊大小為IPHeadSize+nLastFragmentSize字節(jié)的數(shù)據(jù)寫入到文件filename所指示的文件中,F(xiàn)ilename是一個(gè)字符串,表示文件名

11、。(4) 在編程過程中需要使用htons和ntohs函數(shù),這需要包含Winsock庫,具體操作為:1)在頭文件中添加#include 2)在VC+ 6.0中選擇“工程”“設(shè)置”“工程設(shè)置”“Link” “對象/庫模塊”中加入“ws2_32.lib”。(5)、將片段組織成IP分組時(shí),先拷貝原始的IP報(bào)頭,再對其中的相關(guān)域進(jìn)行修改,包括:總長度(新的數(shù)據(jù)包長度),MF(最后一個(gè)片段的MF=0),片偏移,TTL(減1),頭校驗(yàn)設(shè)為0,然后進(jìn)行校驗(yàn),把最終校驗(yàn)結(jié)果填到Checksum域中。注意片偏移是以8字節(jié)為單位計(jì)算的。(6) 計(jì)算頭校驗(yàn)時(shí),首先將頭校驗(yàn)字段置為0,然后將報(bào)頭中所有16位字進(jìn)行二進(jìn)制

12、反碼求和,其結(jié)果即為頭校驗(yàn)。收到報(bào)文進(jìn)行校驗(yàn)時(shí),將報(bào)頭中所有16位字進(jìn)行二進(jìn)制反碼求和,如果結(jié)果正確,和為全1(取反為0)。校驗(yàn)和的計(jì)算請參看附錄B。(7) 對片段進(jìn)行重組時(shí),根據(jù)MF判斷是否收到最后一個(gè)片段,根據(jù)最后一個(gè)片段的偏移值和片段長度計(jì)算出原始數(shù)據(jù)報(bào)的總長度,根據(jù)已經(jīng)收到的各個(gè)片段的長度之和判斷是否所有的片段都已經(jīng)到達(dá),如果全部到達(dá)就可以開始重組??梢詫⑹盏降乃衅伟凑掌浦档拇笮【S護(hù)在一個(gè)有序的鏈表中,最后一次合并。為簡單起見,假定片段都是屬于同一個(gè)報(bào)文的,因此可不對源地址和分組標(biāo)識(shí)進(jìn)行檢查,且只需維護(hù)一個(gè)片段鏈表。(8) 在Intel環(huán)境下,對多字節(jié)數(shù)據(jù)如unsigned sh

13、ort進(jìn)行操作時(shí)注意網(wǎng)絡(luò)主機(jī)字節(jié)序的轉(zhuǎn)換。(9) 請用C或C+語言編寫。實(shí)驗(yàn)要求(1)、完成一個(gè)分片程序,輸入為一個(gè)以二進(jìn)制形式存儲(chǔ)的數(shù)據(jù)包文件,如packet1.pkt,以及MTU如MTU=500,要求輸出是否允許分片、是否需要分片,如果分片則需要生成各個(gè)片段,分別存儲(chǔ)在類似fragmetn0.pkt、fragment1.pkt、fragment2.pkt的二進(jìn)制文件中。輸入?yún)?shù)為:數(shù)據(jù)包文件名、MTU的值。(2)、完成一個(gè)組裝程序,輸入為(1)步中生成的各片段文件名,要求生成組裝完成后的數(shù)據(jù)包二進(jìn)制文件,如MergedPkt.pkt,并提取出最終組裝得到的IP包中的數(shù)據(jù)(即剝掉20字節(jié)的I

14、P頭),以二進(jìn)制形式存儲(chǔ)在Original.dat文件中。實(shí)驗(yàn)指導(dǎo)建議兩個(gè)同學(xué)一組完成本次實(shí)驗(yàn),一人編寫分片程序,一人編寫重組程序。本實(shí)驗(yàn)的助教為赫衛(wèi)卿,有問題請發(fā)信到deane。本實(shí)驗(yàn)報(bào)告及源代碼的提交截止日期為12月23日,請使用文件名:“學(xué)號(hào)A+學(xué)號(hào)B+實(shí)驗(yàn)4.rar”,如“PB05210001+PB05210004+實(shí)驗(yàn)4.rar”發(fā)送到deane。實(shí)驗(yàn)報(bào)告中請給出程序的使用方法。附錄A 一個(gè)示例同學(xué)們可從課程主頁上下載第四次實(shí)驗(yàn)示例.rar文件,解壓之后里面有3個(gè)可執(zhí)行程序。1、GenPkt.exe該程序主要用于生成本次實(shí)驗(yàn)所需的輸入文件。其使用過程如下:其中IPHeader.con

15、f是對IP報(bào)頭的一些配置信息,內(nèi)容為Version 4HeadLength 5TOS 0Identification 14244DoNotFragment 0MoreFragment 0Offset 0TTL 127Protocol 17SrcAddr 211.86.146.137DstAddr 210.45.122.251可以根據(jù)需要修改相應(yīng)的值來獲得不同的數(shù)據(jù)報(bào)。1.jpg是用來填充IP數(shù)據(jù)部分的文件,可以是文本文件,二進(jìn)制可執(zhí)行文件,圖片等等,在最后進(jìn)行組裝正確性驗(yàn)證的時(shí)候,需要比較該文件與最后組裝完成后獲得的文件是否一致。packet.pkt則是生成的二進(jìn)制文件,包括一個(gè)20字節(jié)的IP

16、頭,然后接著的數(shù)據(jù)就是來自1.jpg里的二進(jìn)制拷貝。2、Fragment.exe用來根據(jù)MTU對數(shù)據(jù)報(bào)進(jìn)行分片。其使用方法為:packet.pkt為第一步中生成的數(shù)據(jù)報(bào)文件,5000為MTU(字節(jié)數(shù)),分片程序根據(jù)總長度與MTU的比較來決定是否需要分片,同時(shí)需要檢查D位是否允許分片。如果允許分片且需要分片,則產(chǎn)生分片,本例中產(chǎn)生了6個(gè)分片。3、MergeFragment.exe,該程序?yàn)楹喜⒎制F涫褂梅椒椋浩漭斎霝樯弦徊街猩傻母鱾€(gè)分片的數(shù)據(jù)文件,可以不按生成分片的順序合并。組裝完成之后會(huì)生成兩個(gè)文件,MergedPkt.pkt和Original.dat,MergedPkt.pkt中存放合

17、并之后生成的數(shù)據(jù)報(bào),Original.dat中以二進(jìn)制形式存放著在(1)中“1.jpg”中的內(nèi)容,如果把Original.dat改名為Original.jpg,則兩幅圖片應(yīng)該是一樣的。實(shí)驗(yàn)中同學(xué)們可以使用GenPkt.exe來生成本次實(shí)驗(yàn)所需的數(shù)據(jù)報(bào)原始數(shù)據(jù),要求同學(xué)們完成Fragment.exe和MergeFragment.exe的功能。各步驟所生成的各類文件命名規(guī)則可以自定,但都需要以下幾個(gè)文件:各分片文件,如fragment0.pkt。最終組裝而成的文件,如MergedPkt.pkt從組裝而成的文件中提取出來的數(shù)據(jù)單獨(dú)存成一個(gè)文件,如Original.dat附錄B:校驗(yàn)和的計(jì)算這個(gè)附錄給出在二進(jìn)制記法中如何進(jìn)行校驗(yàn)和的計(jì)算。B.1二進(jìn)制記法B.1.1部分和首先,我們計(jì)算如圖B-1所示的部分和。我們把每一列相加,如果有進(jìn)位,就加到下一列。注意以下幾點(diǎn):圖B-1 二進(jìn)制記法的部分和l 當(dāng)我們加第1列(最右邊一列)的時(shí)候,我們得到7。在二進(jìn)制中,數(shù)7是111。我們保留最右邊的1,把其余的位進(jìn)到第2列和第3列。l 當(dāng)我們加第2列時(shí),我們計(jì)入從第1列來的進(jìn)位。結(jié)果是8,它是二進(jìn)制的1000。我們保留第一個(gè)位(最右邊的),把其余1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論