計算機網(wǎng)絡(luò)課程設(shè)計實驗報告-解析IP數(shù)據(jù)包_第1頁
計算機網(wǎng)絡(luò)課程設(shè)計實驗報告-解析IP數(shù)據(jù)包_第2頁
計算機網(wǎng)絡(luò)課程設(shè)計實驗報告-解析IP數(shù)據(jù)包_第3頁
計算機網(wǎng)絡(luò)課程設(shè)計實驗報告-解析IP數(shù)據(jù)包_第4頁
計算機網(wǎng)絡(luò)課程設(shè)計實驗報告-解析IP數(shù)據(jù)包_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機網(wǎng)絡(luò)課程設(shè)計報告題目:解析IP數(shù)據(jù)包問題描述課題內(nèi)容:本設(shè)計的目標是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下:1、捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包;2、解析數(shù)據(jù)包,在標準輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服務類型、總長度、標識、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源IP地址和目的IP地址等內(nèi)容。概要設(shè)計1、本程序主要由三部分構(gòu)成:初始化原始套接字,反復監(jiān)聽捕獲數(shù)據(jù)包和解析數(shù)據(jù)包。2、為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里使用套接字(socket)編程。但是,要注意的是:通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。3、流程圖如下:詳細設(shè)計1、捕獲數(shù)據(jù)包方法目前常用的捕獲數(shù)據(jù)包的方法有原始套接字、LibPcap、WinPcap和JPcap等方法。本次實驗選用套接字方法。套接字是網(wǎng)絡(luò)應用編程接口。應用程序可以使用它進行網(wǎng)絡(luò)通信而不需要知道底層發(fā)生的細節(jié)。有時需要自己生成一些定制的數(shù)據(jù)包或者功能并希望繞開Socket提供的功能,原始套接字(RawSocket)滿足了這樣的要求。原始套接字能夠生成自己的數(shù)據(jù)報文,包括報頭和數(shù)據(jù)報本身的內(nèi)容。通過原始套接字,可以更加自如地控制Windows下的多種協(xié)議,而且能夠?qū)W(wǎng)絡(luò)底層的傳輸機制進行控制。網(wǎng)絡(luò)數(shù)據(jù)包截獲機制一般指通過截獲整個網(wǎng)絡(luò)的所有信息流,根據(jù)信息源主機,目標主機,服務協(xié)議端口等信息,簡單過濾掉不關(guān)心的數(shù)據(jù),再將用戶感興趣的數(shù)據(jù)發(fā)送給更高層的應用程序進行分析。一般數(shù)據(jù)包的傳輸路徑依次為網(wǎng)卡、設(shè)備驅(qū)動層、數(shù)據(jù)鏈路層、IP層、傳輸層、最后到達應用程序。IP數(shù)據(jù)包的捕獲就是將經(jīng)過數(shù)據(jù)鏈路層的以太網(wǎng)幀拷貝出一個備份,傳送給IP數(shù)據(jù)包捕獲程序進行相關(guān)的處理。IP數(shù)據(jù)包的捕獲程序一般由數(shù)據(jù)包捕獲函數(shù)庫和數(shù)據(jù)包分析器組成。數(shù)據(jù)包捕獲函數(shù)庫是一個獨立于操作系統(tǒng)的標準捕獲函數(shù)庫。主要提供一組可用于查找網(wǎng)絡(luò)接口名稱、打開選定的網(wǎng)絡(luò)接口、初始化、設(shè)置包過濾條件、編譯過濾代碼、捕獲數(shù)據(jù)包等功能函數(shù)。對捕獲程序而言,只需要調(diào)用數(shù)據(jù)包捕獲函數(shù)庫的這些函數(shù)就能獲得所期望的IP數(shù)據(jù)包。這種捕獲程序與數(shù)據(jù)包捕獲函數(shù)庫分離的機制,使得編寫的程序具有很好的可移植性。IP數(shù)據(jù)包捕獲程序的核心部分就是數(shù)據(jù)包分析器。數(shù)據(jù)包分析器應具有識別和理解各種協(xié)議格式(IP、TCP、UCP、ICMP協(xié)議)和幀格式的能力,并對捕獲的數(shù)據(jù)進行分析和統(tǒng)計處理。編寫數(shù)據(jù)包捕獲程序的主要工作就是如何實現(xiàn)數(shù)據(jù)包分析器的功能。2、數(shù)據(jù)包捕獲與解析的程序設(shè)計首先對以太網(wǎng)幀頭進行結(jié)構(gòu)體定義,總共有以下13項內(nèi)容:Version、HeadLen、ServiceType、TotalLen、Identifier、Flags、FragOffset、TimeToLive、Protocol、HeadChecksum、SourceAddr、DestinAddr、Options。根據(jù)數(shù)據(jù)包的捕獲機制,分別對以上13個內(nèi)容編寫捕獲的C語言程序,進行一一捕獲,通過開始的運行程序中運行編譯程序后所得到的.exe文件,就可以看到捕獲到的信息。捕獲成功之后,最后將其各個信息進行解析,并寫到一個文件之中。以上各個程序的編寫都是在VisualStdioC++6.0編譯器中完成。3、網(wǎng)卡設(shè)置為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里使用套接字進行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在騅投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關(guān)的數(shù)據(jù)包。要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就需要將網(wǎng)卡設(shè)置為混雜模式。完整程序源代碼:#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#include<fstream>#include<windows.h>#pragmacomment(lib,"ws2_32")//指定連接到網(wǎng)絡(luò)應用和internet#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)typedefstruct_IP_HEADER//定義IP頭{union{BYTEVersion;//版本(前4位)BYTEHdrLen;//IHL(后4位),報頭標長};BYTEServiceType;//服務類型WORDTotalLen;//總長WORDID;//標識union{WORDFlags;//標志(前3位)WORDFragOff;//分段偏移(后13位)};BYTETimeToLive;//生命期BYTEProtocol;//協(xié)議WORDHdrChksum;//頭校驗和DWORDSrcAddr;//源地址DWORDDstAddr;//目的地址BYTEOptions;//選項}IP_HEADER;//逐位解析IP頭中的信息voidgetVersion(BYTEb,BYTE&version){ version=b>>4;//右移4位,獲取版本字段}voidgetIHL(BYTEb,BYTE&result){ result=(b&0x0f)*4;//獲取頭部長度字段}char*parseServiceType_getProcedence(BYTEb){ switch(b>>5)//獲取服務類型字段中優(yōu)先級子域 { case7: return"NetworkControl"; break; case6: return"InternetworkControl"; break; case5: return"CRITIC/ECP"; break; case4: return"FlashOverride"; break; case3: return"Flsah"; break; case2: return"Immediate"; break; case1: return"Priority"; break; case0: return"Routine"; break; default: return"Unknow"; break; }}char*parseServiceType_getTOS(BYTEb){ b=(b>>1)&0x0f;//獲取服務類型字段中的TOS子域 switch(b) { case0: return"Normalservice"; break; case1: return"Minimizemonetarycost"; break; case2: return"Maximizereliability"; break; case4: return"Maximizethroughput"; break; case8: return"Minimizedelay"; break; case15: return"Maximizesecurity"; break; default: return"Unknow"; }}voidgetFlags(WORDw,BYTE&DF,BYTE&MF)//解析標志字段{ DF=(w>>14)&0x01; MF=(w>>13)&0x01;}voidgetFragOff(WORDw,WORD&fragOff)//獲取分段偏移字段{ fragOff=w&0x1fff;}char*getProtocol(BYTEProtocol)//獲取協(xié)議字段共8位{ switch(Protocol)//以下為協(xié)議號說明: { case1: return"ICMP"; case2: return"IGMP"; case4: return"IPinIP"; case6: return"TCP"; case8: return"EGP"; case17: return"UDP"; case41: return"IPv6"; case46: return"RSVP"; case89: return"OSPF"; default: return"UNKNOW"; }}voidipparse(FILE*file,char*buffer){IP_HEADERip=*(IP_HEADER*)buffer;//通過指針把緩沖區(qū)的內(nèi)容強制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)結(jié)構(gòu)fseek(file,0,SEEK_END);BYTEversion;getVersion(ip.Version,version);fprintf(file,"版本號=%d\r\n",version);BYTEheaderLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"報頭標長=%d(BYTE)\r\n",headerLen);fprintf(file,"服務類型=%s,%s\r\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"總長度=%d(BYTE)\r\n",ip.TotalLen);fprintf(file,"標識=%d\r\n",ip.ID);BYTEDF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"標志DF=%d,MF=%d\r\n",DF,MF);WORDfragOff;getFragOff(ip.FragOff,fragOff);fprintf(file,"分段偏移值=%d\r\n",fragOff);fprintf(file,"生存期=%d(hopes)\r\n",ip.TimeToLive);fprintf(file,"協(xié)議=%s\r\n",getProtocol(ip.Protocol));fprintf(file,"頭校驗和=0x%0x\r\n",ip.HdrChksum);fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,"---------------------------------------------\r\n");}Intmain(){ intnRetCode=0; FILE*file; if((file=fopen("history.txt","wb+"))==NULL) { printf("failtoopenfile%s"); return-1; } WSADATAwsData; WSAStartup(MAKEWORD(2,2),&wsData); //建立套接字 SOCKETsock; sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); BOOLflag=TRUE; //設(shè)置IP頭操作選項,用戶可對IP頭處理 setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)); charhostName[128]; gethostname(hostName,100); //獲取本地地址 hostent*pHostIP; pHostIP=gethostbyname(hostName); //填充SOCKADDR_IN結(jié)構(gòu) sockaddr_inaddr_in; addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0]; addr_in.sin_family=AF_INET; addr_in.sin_port=htons(6000); bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));//把socket綁定到本地網(wǎng)卡 DWORDdwValue=1; //設(shè)置SOCK_RAW為SIO_RCVALL,能接收所有IP包 #defineIO_RCVALL_WSAIOW(IOC_VENDOR,1) DWORDdwBufferLen[10]; DWORDdwBufferInLen=1; DWORDdwBytesReturned=0; WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL); //設(shè)置接受數(shù)據(jù)包緩沖區(qū)長度 #defineBUFFER_SIZE65535 charbuffer[BUFFER_SIZE]; //監(jiān)聽網(wǎng)卡printf("開始解析經(jīng)過本機的IP數(shù)據(jù)包:\n"); while(true) { intsize=recv(sock,buffer,BUFFER_SIZE,0);ipparse(stdout,buffer); ipparse(file,bu

溫馨提示

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

評論

0/150

提交評論