(精選)實驗三IP數(shù)據(jù)包的解析_第1頁
(精選)實驗三IP數(shù)據(jù)包的解析_第2頁
(精選)實驗三IP數(shù)據(jù)包的解析_第3頁
(精選)實驗三IP數(shù)據(jù)包的解析_第4頁
(精選)實驗三IP數(shù)據(jù)包的解析_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

6、WORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項IP_HEADER;3.5 IP包的解析:解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數(shù)的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。3.6捕獲處理:1.加載 Winsock;2.創(chuàng)建一個接收原始IP包的socket連接;3.綁定到一個接口;4.進行WSAIoctl設置,接收所有的IP數(shù)據(jù)包。代碼如下:/設置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.接著設定一個線程進行捕獲:(1)創(chuàng)建一個接收IP包的鏈表頭;(2)設置一個標識,為真,則不斷進行IP包的捕獲;(3)建

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

9、 2、對照IP數(shù)據(jù)包的首部,說明“標識”的作用及DF、MF、分段偏移值三者的關系?六、源程序代碼:#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位),報頭

10、標長 ; BYTE ServiceType; /服務類型 WORD TotalLen; /總長 WORD ID; /標識 union WORD Flags; /標志(前3位) WORD FragOff; /分段偏移(后13位) ; BYTE TimeToLive; /生命期 BYTE Protocol; /協(xié)議 WORD HdrChksum; /頭校驗和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項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; /獲取頭部長度字段char * parseServiceType_getProcedence(BYTE b)switch(b>>5) /獲取服務類型字段中優(yōu)先級子域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; /獲取服務類型字段中的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) /解析標志字段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é)議號說明: 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; /通過指針把緩沖區(qū)的內(nèi)容強制轉化為IP_HEADER數(shù)據(jù)結構 fseek(file,0,SEEK_END); BYTE version; getVersion(ip.Version,version); fprintf(file,"版本號=%drn",version); BYTE headerL

17、en; getIHL(ip.HdrLen,headerLen); fprintf(file,"報頭標長=%d(BYTE)rn",headerLen); fprintf(file,"服務類型=%s,%srn", parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType); fprintf(file,"總長度=%d(BYTE)rn",ip.TotalLen); fprintf(file,"標識=%drn"

18、,ip.ID); BYTE DF,MF; getFlags(ip.Flags,DF,MF); fprintf(file,"標志 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,"頭校驗和=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;/設置IP頭操作選項,用戶可對IP頭處理setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);char hostName128;gethostname(hostName,100);/獲取本地地址hostent * pHostIP;pHostIP=gethostbyname(hostName);/填充SOCKADDR_IN結構sockaddr_in addr_in;addr_in.sin_addr=*(i

溫馨提示

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

評論

0/150

提交評論