




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告題目:解析IP數(shù)據(jù)包問題描述課題內(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包的版本、頭長度、服務(wù)類型、總長度、標(biāo)識、分段偏移值、生存時(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ù)包,必須對網(wǎng)卡進(jìn)行編程,在這里使用套接字(socket)編程。但是,要注意的是:通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在投遞地址并非自身地址之后將不引起響應(yīng),也就是說應(yīng)用程序無法收取與自己無關(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)容。通過原始套接字,可以更加自如地控制Windows下的多種協(xié)議,而且能夠?qū)W(wǎng)絡(luò)底層的傳輸機(jī)制進(jìn)行控制。網(wǎng)絡(luò)數(shù)據(jù)包截獲機(jī)制一般指通過截獲整個網(wǎng)絡(luò)的所有信息流,根據(jù)信息源主機(jī),目標(biāo)主機(jī),服務(wù)協(xié)議端口等信息,簡單過濾掉不關(guān)心的數(shù)據(jù),再將用戶感興趣的數(shù)據(jù)發(fā)送給更高層的應(yīng)用程序進(jìn)行分析。一般數(shù)據(jù)包的傳輸路徑依次為網(wǎng)卡、設(shè)備驅(qū)動層、數(shù)據(jù)鏈路層、IP層、傳輸層、最后到達(dá)應(yīng)用程序。IP數(shù)據(jù)包的捕獲就是將經(jīng)過數(shù)據(jù)鏈路層的以太網(wǎng)幀拷貝出一個備份,傳送給IP數(shù)據(jù)包捕獲程序進(jìn)行相關(guān)的處理。IP數(shù)據(jù)包的捕獲程序一般由數(shù)據(jù)包捕獲函數(shù)庫和數(shù)據(jù)包分析器組成。數(shù)據(jù)包捕獲函數(shù)庫是一個獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)捕獲函數(shù)庫。主要提供一組可用于查找網(wǎng)絡(luò)接口名稱、打開選定的網(wǎng)絡(luò)接口、初始化、設(shè)置包過濾條件、編譯過濾代碼、捕獲數(shù)據(jù)包等功能函數(shù)。對捕獲程序而言,只需要調(diào)用數(shù)據(jù)包捕獲函數(shù)庫的這些函數(shù)就能獲得所期望的IP數(shù)據(jù)包。這種捕獲程序與數(shù)據(jù)包捕獲函數(shù)庫分離的機(jī)制,使得編寫的程序具有很好的可移植性。IP數(shù)據(jù)包捕獲程序的核心部分就是數(shù)據(jù)包分析器。數(shù)據(jù)包分析器應(yīng)具有識別和理解各種協(xié)議格式(IP、TCP、UCP、ICMP協(xié)議)和幀格式的能力,并對捕獲的數(shù)據(jù)進(jìn)行分析和統(tǒng)計(jì)處理。編寫數(shù)據(jù)包捕獲程序的主要工作就是如何實(shí)現(xiàn)數(shù)據(jù)包分析器的功能。2、數(shù)據(jù)包捕獲與解析的程序設(shè)計(jì)首先對以太網(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ī)制,分別對以上13個內(nèi)容編寫捕獲的C語言程序,進(jìn)行一一捕獲,通過開始的運(yùn)行程序中運(yùn)行編譯程序后所得到的.exe文件,就可以看到捕獲到的信息。捕獲成功之后,最后將其各個信息進(jìn)行解析,并寫到一個文件之中。以上各個程序的編寫都是在VisualStdioC++6.0編譯器中完成。3、網(wǎng)卡設(shè)置為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進(jìn)行編程,在這里使用套接字進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在騅投遞地址并非自身地址之后將不引起響應(yīng),也就是說應(yīng)用程序無法收取與自己無關(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)長};BYTEServiceType;//服務(wù)類型WORDTotalLen;//總長WORDID;//標(biāo)識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;//獲取頭部長度字段}char*parseServiceType_getProcedence(BYTEb){ switch(b>>5)//獲取服務(wù)類型字段中優(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;//獲取服務(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é)議號說明: { 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)容強(qiáng)制轉(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,"報(bào)頭標(biāo)長=%d(BYTE)\r\n",headerLen);fprintf(file,"服務(wù)類型=%s,%s\r\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"總長度=%d(BYTE)\r\n",ip.TotalLen);fprintf(file,"標(biāo)識=%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),用戶可對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)過本機(jī)的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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60335-2-74:2021+AMD1:2024 CSV EN Household and similar electrical appliances - Safety - Part 2-74: Particular requirements for portable immersion heaters
- 【正版授權(quán)】 IEC 60076-11:2004 EN-D Power transformers - Part 11: Dry-type transformers
- 個人如何做家庭教育
- 電子行業(yè)非標(biāo)產(chǎn)線
- 2025年少年宮活動方案
- 出鏡記者與主持人實(shí)務(wù) 課件 第五章 現(xiàn)場隨機(jī)采訪
- 湘教版開花和結(jié)果
- 校園元旦晚會活動方案策劃書2025年
- 幼兒園自理能力主題教育課件
- 伺服系統(tǒng)與工業(yè)機(jī)器人課件第11章 工業(yè)機(jī)器人系統(tǒng)
- DB34∕T 3791-2021 智慧藥房驗(yàn)收規(guī)范
- 公司章程與內(nèi)部管理規(guī)則制度
- 20以內(nèi)加減法口算練習(xí)題帶括號填空135
- 百位數(shù)加減法練習(xí)題連加
- 地下綜合管廊工程機(jī)電安裝工程施工方案
- 高速公路路網(wǎng)數(shù)字底座研究與建設(shè)
- 藥學(xué)專業(yè)崗位分析報(bào)告范文
- 七年級道法上冊 第一單元 少年有夢 單元測試卷(人教版 2024年秋)
- DL-T586-2008電力設(shè)備監(jiān)造技術(shù)導(dǎo)則
- JT-T-1246-2019公路與鐵路兩用橋梁技術(shù)要求
- 河南省南陽市唐河縣2023-2024學(xué)年八年級下學(xué)期期末數(shù)學(xué)試題
評論
0/150
提交評論