實(shí)驗(yàn)三IP數(shù)據(jù)包的解析_第1頁(yè)
實(shí)驗(yàn)三IP數(shù)據(jù)包的解析_第2頁(yè)
實(shí)驗(yàn)三IP數(shù)據(jù)包的解析_第3頁(yè)
實(shí)驗(yàn)三IP數(shù)據(jù)包的解析_第4頁(yè)
實(shí)驗(yàn)三IP數(shù)據(jù)包的解析_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、實(shí)驗(yàn)三 IP包的解析一實(shí)驗(yàn)?zāi)康?本次課程設(shè)計(jì)的目的是設(shè)計(jì)一個(gè)解析IP數(shù)據(jù)包的程序,并根據(jù)分析結(jié)果說(shuō)明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問(wèn)題,對(duì)IP層的工作原理有更好的理解和認(rèn)識(shí)。二、實(shí)驗(yàn)要求:1整個(gè)課程設(shè)計(jì)的各個(gè)環(huán)節(jié)都要自己動(dòng)手。2編寫(xiě)程序,獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫(xiě)入日志文件。具體要求如下:(1)程序編譯后生成的exe文件以“學(xué)號(hào)+IP”為名,輸出結(jié)果至屏幕的同時(shí),將結(jié)果寫(xiě)入“學(xué)號(hào)+IP”的日志文件中;(2)程序的輸出內(nèi)容應(yīng)包括IP包的版本、頭長(zhǎng)度、服務(wù)類型、數(shù)據(jù)包長(zhǎng)度等IP數(shù)據(jù)包格式中的相應(yīng)字段;(3)鍵盤(pán)輸入CTRL+C時(shí)退出。3對(duì)課程設(shè)計(jì)進(jìn)行總結(jié),撰寫(xiě)課

2、程設(shè)計(jì)報(bào)告。三、實(shí)驗(yàn)分析:3.1網(wǎng)卡設(shè)置:為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,在這里使用套接字(socket)進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對(duì)于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在投遞地址并非自身地址之后將不引起響應(yīng),也就是說(shuō)應(yīng)用程序無(wú)法收取與自己無(wú)關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。3.2使用套接字: 套接字分為三種,即流套接字(Stream socket)、數(shù)據(jù)報(bào)套接字(Datagram Socket)和原始套接字(

3、Raw Socket)。要進(jìn)行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:Socket sock:Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped):本設(shè)計(jì)不用考慮超時(shí)情況。創(chuàng)建套接后,IP頭就會(huì)包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項(xiàng),調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定IP-HDRINCL選項(xiàng),表明用戶可以親自對(duì)IP頭進(jìn)行處理。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜

4、模式,使網(wǎng)卡能夠接收所有的網(wǎng)絡(luò)數(shù)據(jù)。如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收的數(shù)據(jù)就拷貝到套接字中,因此,網(wǎng)卡就可以接收所有經(jīng)過(guò)的IP包。3.3接收數(shù)據(jù)包: 在程序中可使用recv()函數(shù)接收經(jīng)過(guò)的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè)參數(shù)接收操作所用的套接字描述符;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對(duì)所發(fā)送的數(shù)據(jù)沒(méi)特殊要求,直接設(shè)為0。因?yàn)镮P數(shù)據(jù)包的最大長(zhǎng)度是65535B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來(lái)反復(fù)監(jiān)聽(tīng)接收IP包,用recv()函數(shù)實(shí)現(xiàn)接收功能。3.4定義IP

5、頭部的數(shù)據(jù)結(jié)構(gòu):程序需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)表示IP頭部。其代碼如下:typedef struct _IP_HEADER /定義IP頭 union BYTE Version; /版本(前4位) BYTE HdrLen; /IHL(后4位),報(bào)頭標(biāo)長(zhǎng) ; BYTE ServiceType; /服務(wù)類型 WORD TotalLen; /總長(zhǎng) WORD ID; /標(biāo)識(shí) union WORD Flags; /標(biāo)志(前3位) WORD FragOff; /分段偏移(后13位) ; BYTE TimeToLive; /生命期 BYTE Protocol; /協(xié)議 WORD HdrChksum; /頭校驗(yàn)和 D

6、WORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項(xiàng)IP_HEADER;3.5 IP包的解析:解析IP包的字段有兩種策略。針對(duì)長(zhǎng)度為8位、16位和32位的字段(或子字段)時(shí),可以利用IP-HEADER的成員直接獲取。要解析長(zhǎng)度不是8位倍數(shù)的字段(或子字段)時(shí),可以利用C語(yǔ)言中的移位以人、及與、或操作完成。3.6捕獲處理:1.加載 Winsock;2.創(chuàng)建一個(gè)接收原始IP包的socket連接;3.綁定到一個(gè)接口;4.進(jìn)行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。代碼如下:/設(shè)置SOCK_RAW為SIO_RCVALL,能接收所有IP包

7、#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);5.接著設(shè)定一個(gè)線程進(jìn)行捕獲:(1)創(chuàng)建一個(gè)接收IP包的鏈表頭;(2)設(shè)置一個(gè)標(biāo)識(shí),為真,則不斷進(jìn)行IP包的捕獲;(3)建

8、立一個(gè)新的結(jié)點(diǎn),將捕獲的數(shù)據(jù)包加入到該結(jié)點(diǎn);(4)如果鏈表的長(zhǎng)度達(dá)到指定的長(zhǎng)度,創(chuàng)建一個(gè)線程對(duì)該鏈表的IP包進(jìn)行解析;再設(shè)置一個(gè)在IP數(shù)據(jù)包鏈表不足給定的長(zhǎng)度,而又中止IP捕獲時(shí),對(duì)鏈表的處理;(5)為下一個(gè)IP包鏈表創(chuàng)建一個(gè)鏈表頭。6.建立一個(gè)進(jìn)行IP包解析并顯示的線程,進(jìn)行解析IP數(shù)據(jù)包,然后顯示IP數(shù)據(jù)包。3.7程序流程圖:開(kāi)始構(gòu)造程序運(yùn)行環(huán)境,生成輸出文件創(chuàng)建原始套接字,并初始化捕獲IP數(shù)據(jù)包解析IP包輸出IP包信息退出? N YEND四、運(yùn)行結(jié)果:截獲IP數(shù)據(jù)包程序運(yùn)行結(jié)果如下:五、實(shí)驗(yàn)總結(jié): 注:在實(shí)驗(yàn)中對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行截屏。1、要求對(duì)實(shí)驗(yàn)過(guò)程中截屏的數(shù)據(jù)進(jìn)行分析和說(shuō)明,分析其原因?

9、 2、對(duì)照IP數(shù)據(jù)包的首部,說(shuō)明“標(biāo)識(shí)”的作用及DF、MF、分段偏移值三者的關(guān)系?六、源程序代碼:#include "winsock2.h"#include "ws2tcpip.h"#include "iostream.h"#include "stdio.h"#pragma comment(lib,"ws2_32.lib")typedef struct _IP_HEADER /定義IP頭 union BYTE Version; /版本(前4位) BYTE HdrLen; /IHL(后4位),報(bào)頭

10、標(biāo)長(zhǎng) ; BYTE ServiceType; /服務(wù)類型 WORD TotalLen; /總長(zhǎng) WORD ID; /標(biāo)識(shí) union WORD Flags; /標(biāo)志(前3位) WORD FragOff; /分段偏移(后13位) ; BYTE TimeToLive; /生命期 BYTE Protocol; /協(xié)議 WORD HdrChksum; /頭校驗(yàn)和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項(xiàng)IP_HEADER;/逐位解析IP頭中的信息void getVersion(BYTE b, BYTE & versio

11、n)version=b>>4; /右移4位,獲取版本字段 void getIHL(BYTE b,BYTE & result)result=(b&0x0f)*4; /獲取頭部長(zhǎng)度字段char * parseServiceType_getProcedence(BYTE b)switch(b>>5) /獲取服務(wù)類型字段中優(yōu)先級(jí)子域case 7: return "Network Control" break;case 6:return "Internet work Control" break;case 5:return

12、"CRITIC/ECP" break;case 4:return "Flash Override" break;case 3:return "Flsah" break;case 2:return "Immediate" break;case 1:return "Priority" break;case 0:return "Routine" break;default:return "Unknow"break;char * parseServiceType_

13、getTOS(BYTE b)b=(b>>1)&0x0f; /獲取服務(wù)類型字段中的TOS子域switch(b) case 0:return "Normal service" break;case 1:return "Minimize monetary cost" break;case 2:return "Maximize reliability" break;case 4:return "Maximize throughput" break;case 8:return "Minimize

14、 delay" break;case 15:return "Maximize security" break; default:return "Unknow" void getFlags(WORD w,BYTE & DF,BYTE & MF) /解析標(biāo)志字段DF=(w>>14)&0x01;MF=(w>>13)&0x01;void getFragOff(WORD w,WORD & fragOff) /獲取分段偏移字段 fragOff=w&0x1fff;char * getPr

15、otocol(BYTE Protocol) /獲取協(xié)議字段共8位switch(Protocol) /以下為協(xié)議號(hào)說(shuō)明: case 1:return "ICMP" case 2:return "IGMP"case 4: return "IP in IP"case 6:return "TCP"case 8:return "EGP"case 17:return "UDP" case 41:return "IPv6"case 46:return "RSV

16、P"case 89:return "OSPF"default:return "UNKNOW"void ipparse(FILE* file,char* buffer) IP_HEADER ip=*(IP_HEADER*)buffer; /通過(guò)指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)結(jié)構(gòu) fseek(file,0,SEEK_END); BYTE version; getVersion(ip.Version,version); fprintf(file,"版本號(hào)=%drn",version); BYTE headerL

17、en; getIHL(ip.HdrLen,headerLen); fprintf(file,"報(bào)頭標(biāo)長(zhǎng)=%d(BYTE)rn",headerLen); fprintf(file,"服務(wù)類型=%s,%srn", parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType); fprintf(file,"總長(zhǎng)度=%d(BYTE)rn",ip.TotalLen); fprintf(file,"標(biāo)識(shí)=%drn"

18、,ip.ID); BYTE DF,MF; getFlags(ip.Flags,DF,MF); fprintf(file,"標(biāo)志 DF=%d,MF=%drn",DF,MF); WORD fragOff; getFragOff(ip.FragOff,fragOff); fprintf(file,"分段偏移值=%drn",fragOff); fprintf(file,"生存期=%d(hopes)rn",ip.TimeToLive); fprintf(file,"協(xié)議=%srn",getProtocol(ip.Protoc

19、ol); fprintf(file,"頭校驗(yàn)和=0x%0xrn",ip.HdrChksum); fprintf(file,"源IP地址=%srn",inet_ntoa(*(in_addr*)&ip.SrcAddr); fprintf(file,"目的IP地址=%srn",inet_ntoa(*(in_addr*)&ip.DstAddr); fprintf(file,"-rn");main()int nRetCode = 0;/ initialize MFC and print and error o

20、n failure/*if (!AfxWinInit(:GetModuleHandle(NULL), NULL, :GetCommandLine(), 0)/ TODO: change error code to suit your needscerr << _T("Fatal Error: MFC initialization failed") << endl;nRetCode = 1;else*/ TODO: code your application's behavior here.FILE * file;if(file=fopen(&

21、quot;history.txt","wb+")=NULL)printf("fail to open file %s");return -1;WSADATA wsData;WSAStartup(MAKEWORD(2,2),&wsData);/建立套接字SOCKET sock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);BOOL flag=TRUE;/設(shè)置IP頭操作選項(xiàng),用戶可對(duì)IP頭處理setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);char hostName128;gethostname(hostName,100);/獲取本地地址hostent * pHostIP;pHostIP=gethostbyname(hostName);/填充SOCKADDR_IN結(jié)構(gòu)sockaddr_in addr_

溫馨提示

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

評(píng)論

0/150

提交評(píng)論