計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-解析IP數(shù)據(jù)包_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-解析IP數(shù)據(jù)包_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-解析IP數(shù)據(jù)包_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-解析IP數(shù)據(jù)包_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告-解析IP數(shù)據(jù)包_第5頁(yè)
已閱讀5頁(yè),還剩7頁(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)介

計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告題目:解析IP數(shù)據(jù)包問(wèn)題描述課題內(nèi)容:本設(shè)計(jì)的目標(biāo)是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫入日志文件。程序的具體要求如下:1、捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包;2、解析數(shù)據(jù)包,在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP包的版本、頭長(zhǎng)度、服務(wù)類型、總長(zhǎng)度、標(biāo)識(shí)、分段偏移值、生存時(shí)間、上層協(xié)議類型、頭校驗(yàn)和、源IP地址和目的IP地址等內(nèi)容。概要設(shè)計(jì)1、本程序主要由三部分構(gòu)成:初始化原始套接字,反復(fù)監(jiān)聽捕獲數(shù)據(jù)包和解析數(shù)據(jù)包。2、為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,在這里使用套接字(socket)編程。但是,要注意的是:通常情況下,網(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、流程圖如下:詳細(xì)設(shè)計(jì)1、捕獲數(shù)據(jù)包方法目前常用的捕獲數(shù)據(jù)包的方法有原始套接字、LibPcap、WinPcap和JPcap等方法。本次實(shí)驗(yàn)選用套接字方法。套接字是網(wǎng)絡(luò)應(yīng)用編程接口。應(yīng)用程序可以使用它進(jìn)行網(wǎng)絡(luò)通信而不需要知道底層發(fā)生的細(xì)節(jié)。有時(shí)需要自己生成一些定制的數(shù)據(jù)包或者功能并希望繞開Socket提供的功能,原始套接字(RawSocket)滿足了這樣的要求。原始套接字能夠生成自己的數(shù)據(jù)報(bào)文,包括報(bào)頭和數(shù)據(jù)報(bào)本身的內(nèi)容。通過(guò)原始套接字,可以更加自如地控制Windows下的多種協(xié)議,而且能夠?qū)W(wǎng)絡(luò)底層的傳輸機(jī)制進(jìn)行控制。網(wǎng)絡(luò)數(shù)據(jù)包截獲機(jī)制一般指通過(guò)截獲整個(gè)網(wǎng)絡(luò)的所有信息流,根據(jù)信息源主機(jī),目標(biāo)主機(jī),服務(wù)協(xié)議端口等信息,簡(jiǎn)單過(guò)濾掉不關(guān)心的數(shù)據(jù),再將用戶感興趣的數(shù)據(jù)發(fā)送給更高層的應(yīng)用程序進(jìn)行分析。一般數(shù)據(jù)包的傳輸路徑依次為網(wǎng)卡、設(shè)備驅(qū)動(dòng)層、數(shù)據(jù)鏈路層、IP層、傳輸層、最后到達(dá)應(yīng)用程序。IP數(shù)據(jù)包的捕獲就是將經(jīng)過(guò)數(shù)據(jù)鏈路層的以太網(wǎng)幀拷貝出一個(gè)備份,傳送給IP數(shù)據(jù)包捕獲程序進(jìn)行相關(guān)的處理。IP數(shù)據(jù)包的捕獲程序一般由數(shù)據(jù)包捕獲函數(shù)庫(kù)和數(shù)據(jù)包分析器組成。數(shù)據(jù)包捕獲函數(shù)庫(kù)是一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)捕獲函數(shù)庫(kù)。主要提供一組可用于查找網(wǎng)絡(luò)接口名稱、打開選定的網(wǎng)絡(luò)接口、初始化、設(shè)置包過(guò)濾條件、編譯過(guò)濾代碼、捕獲數(shù)據(jù)包等功能函數(shù)。對(duì)捕獲程序而言,只需要調(diào)用數(shù)據(jù)包捕獲函數(shù)庫(kù)的這些函數(shù)就能獲得所期望的IP數(shù)據(jù)包。這種捕獲程序與數(shù)據(jù)包捕獲函數(shù)庫(kù)分離的機(jī)制,使得編寫的程序具有很好的可移植性。IP數(shù)據(jù)包捕獲程序的核心部分就是數(shù)據(jù)包分析器。數(shù)據(jù)包分析器應(yīng)具有識(shí)別和理解各種協(xié)議格式(IP、TCP、UCP、ICMP協(xié)議)和幀格式的能力,并對(duì)捕獲的數(shù)據(jù)進(jìn)行分析和統(tǒng)計(jì)處理。編寫數(shù)據(jù)包捕獲程序的主要工作就是如何實(shí)現(xiàn)數(shù)據(jù)包分析器的功能。2、數(shù)據(jù)包捕獲與解析的程序設(shè)計(jì)首先對(duì)以太網(wǎng)幀頭進(jìn)行結(jié)構(gòu)體定義,總共有以下13項(xiàng)內(nèi)容:Version、HeadLen、ServiceType、TotalLen、Identifier、Flags、FragOffset、TimeToLive、Protocol、HeadChecksum、SourceAddr、DestinAddr、Options。根據(jù)數(shù)據(jù)包的捕獲機(jī)制,分別對(duì)以上13個(gè)內(nèi)容編寫捕獲的C語(yǔ)言程序,進(jìn)行一一捕獲,通過(guò)開始的運(yùn)行程序中運(yùn)行編譯程序后所得到的.exe文件,就可以看到捕獲到的信息。捕獲成功之后,最后將其各個(gè)信息進(jìn)行解析,并寫到一個(gè)文件之中。以上各個(gè)程序的編寫都是在VisualStdioC++6.0編譯器中完成。3、網(wǎng)卡設(shè)置為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,在這里使用套接字進(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è)置為混雜模式。完整程序源代碼:#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#include<fstream>#include<windows.h>#pragmacomment(lib,"ws2_32")//指定連接到網(wǎng)絡(luò)應(yīng)用和internet#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)typedefstruct_IP_HEADER//定義IP頭{union{BYTEVersion;//版本(前4位)BYTEHdrLen;//IHL(后4位),報(bào)頭標(biāo)長(zhǎng)};BYTEServiceType;//服務(wù)類型WORDTotalLen;//總長(zhǎng)WORDID;//標(biāo)識(shí)union{WORDFlags;//標(biāo)志(前3位)WORDFragOff;//分段偏移(后13位)};BYTETimeToLive;//生命期BYTEProtocol;//協(xié)議WORDHdrChksum;//頭校驗(yàn)和DWORDSrcAddr;//源地址DWORDDstAddr;//目的地址BYTEOptions;//選項(xiàng)}IP_HEADER;//逐位解析IP頭中的信息voidgetVersion(BYTEb,BYTE&version){ version=b>>4;//右移4位,獲取版本字段}voidgetIHL(BYTEb,BYTE&result){ result=(b&0x0f)*4;//獲取頭部長(zhǎng)度字段}char*parseServiceType_getProcedence(BYTEb){ switch(b>>5)//獲取服務(wù)類型字段中優(yōu)先級(jí)子域 { 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;//獲取服務(wù)類型字段中的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)//解析標(biāo)志字段{ DF=(w>>14)&0x01; MF=(w>>13)&0x01;}voidgetFragOff(WORDw,WORD&fragOff)//獲取分段偏移字段{ fragOff=w&0x1fff;}char*getProtocol(BYTEProtocol)//獲取協(xié)議字段共8位{ switch(Protocol)//以下為協(xié)議號(hào)說(shuō)明: { 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;//通過(guò)指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)結(jié)構(gòu)fseek(file,0,SEEK_END);BYTEversion;getVersion(ip.Version,version);fprintf(file,"版本號(hào)=%d\r\n",version);BYTEheaderLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"報(bào)頭標(biāo)長(zhǎng)=%d(BYTE)\r\n",headerLen);fprintf(file,"服務(wù)類型=%s,%s\r\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"總長(zhǎng)度=%d(BYTE)\r\n",ip.TotalLen);fprintf(file,"標(biāo)識(shí)=%d\r\n",ip.ID);BYTEDF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"標(biāo)志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,"頭校驗(yàn)和=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頭操作選項(xiàng),用戶可對(duì)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ū)長(zhǎng)度 #defineBUFFER_SIZE65535 charbuffer[BUFFER_SIZE]; //監(jiān)聽網(wǎng)卡printf("開始解析經(jīng)過(guò)本機(jī)的IP數(shù)據(jù)包:\n"); while(true) { intsize=recv(sock,buffer,BUFFER_SIZE,0);ipparse(stdout,buffer); ipparse(file,bu

溫馨提示

  • 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)論