版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一.課程設(shè)計(jì)應(yīng)達(dá)到的目的(1)使學(xué)生掌握網(wǎng)絡(luò)通信協(xié)議的基本工作原理; (2)培養(yǎng)學(xué)生基本掌握網(wǎng)絡(luò)編程的基本思路和方法; (3)能提高學(xué)生對所學(xué)計(jì)算機(jī)網(wǎng)絡(luò)理論知識(shí)的理解能力;(4)能提高和挖掘?qū)W生對所學(xué)知識(shí)的實(shí)際應(yīng)用能力和創(chuàng)新能力;(5)提高學(xué)生的科技論文寫作能力。 二.課程設(shè)計(jì)題目及要求IP數(shù)據(jù)包捕獲與解析的設(shè)計(jì)。設(shè)計(jì)任務(wù):(1)掌握IP數(shù)據(jù)包的工作原理與報(bào)頭設(shè)計(jì)的相關(guān)字段(2)理解IP包的版本、頭長度、服務(wù)類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標(biāo)識(shí)、分段標(biāo)志、分段偏移量、生存時(shí)間、上層協(xié)議類型、頭校驗(yàn)合、源IP地址和目的IP地址等內(nèi)容。設(shè)計(jì)內(nèi)容:根據(jù)IP數(shù)據(jù)包的標(biāo)準(zhǔn)格式,編寫程序捕獲IP數(shù)據(jù)包并進(jìn)行解析
2、,并將解析后各IP包的頭部與數(shù)據(jù)字段寫入輸出文件。數(shù)據(jù)字段的值從捕獲的文件中獲取。為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,可以采用Winsock的數(shù)據(jù)庫查詢函數(shù)gethostname()和gethostbyname()解決 ,捕獲IP數(shù)據(jù)包并解析IP地址等內(nèi)容。三.課程設(shè)計(jì)思想IP數(shù)據(jù)報(bào)的格式說明:IP數(shù)據(jù)包格式包含了標(biāo)頭固定部分,標(biāo)頭可變部分和數(shù)據(jù)區(qū)三部分。IP數(shù)據(jù)報(bào)標(biāo)頭部分固定為20個(gè)字節(jié),其中包含了12個(gè)參數(shù)域,各參數(shù)域隱含著網(wǎng)間協(xié)議的傳輸機(jī)制。IP具體的標(biāo)頭格式如圖1所示。各參數(shù)域的具體含義如下:1) 版本號:長度4位,表示所使用的IP協(xié)議的版本。IPv4版本號字段值為4;IPV6版本號字段號的值
3、為6.2) 標(biāo)頭長:長度4位,定義了一個(gè)以4B為一個(gè)單位的IP包的報(bào)頭長度3) 服務(wù)類型:共8位,高3位組成優(yōu)先級子域,隨后4位組成服務(wù)類型子域。4) 數(shù)據(jù)報(bào)總長度:總長度為2B(即6位)。定義了以字節(jié)為單位的數(shù)據(jù)報(bào)的總長度。5) 重裝標(biāo)識(shí):長度16位,用于識(shí)別IP數(shù)據(jù)報(bào)的編號,讓目的主機(jī)判斷新來的數(shù)據(jù)屬于哪個(gè)分組。6) 分片標(biāo)識(shí):共3位,最高位為0;DF禁止分片標(biāo)識(shí)。DF=0,可以分片;DF=1,不能分片。MF:分片標(biāo)識(shí)。MF=0,表示接的是最后一個(gè)分片;MF=1,不是最后一個(gè)分片。7) 片偏移值:共13位,說明分片在整個(gè)數(shù)據(jù)報(bào)中的相對位置。8) 生存周期:8位,用來設(shè)置數(shù)據(jù)數(shù)據(jù)報(bào)在整個(gè)網(wǎng)絡(luò)
4、傳輸過程中的壽命。常以一個(gè)數(shù)據(jù)報(bào)可以經(jīng)過的最多的路由器跳步數(shù)來控制。9) 協(xié)議類型:共8位,表示該IP數(shù)據(jù)報(bào)的高層協(xié)議類型。10) 標(biāo)頭校驗(yàn)和:共16位,用于存放檢查報(bào)頭錯(cuò)誤的校驗(yàn)碼。11) 源、宿主機(jī)地址:共32位,分別表示發(fā)送和接受數(shù)據(jù)報(bào)的源主機(jī)和宿主機(jī)的IP地址。12) 選項(xiàng)數(shù)據(jù)域:0-40B,用于控制和測試。IP數(shù)據(jù)包的格式為: IP數(shù)據(jù)包的C+定義:typedef struct _IPunionBYTE Version; / 版本BYTE HdrLen;/IHT;BYTE ServiceType; / 服務(wù)類型WORD TotalLen; / 總長WORD ID; / 標(biāo)識(shí)union
5、 WORD Flags; / 標(biāo)志W(wǎng)ORD FragOff; / 分段偏移;BYTE TimeToLive; / 生命期BYTE Protocol; / 協(xié)議WORD HdrChksum; / 頭校驗(yàn)和DWORD SrcAddr; / 源地址DWORD DstAddr; / 目的地址BYTE Options; / 選項(xiàng) IP;套接字的使用:本程序使用套接字socket編程,將網(wǎng)卡設(shè)為能夠接受流經(jīng)網(wǎng)卡的所有類型的數(shù)據(jù)包。首先,初始化套接字,然后監(jiān)聽數(shù)據(jù)包,解析數(shù)據(jù)包。SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用來創(chuàng)建套接字,其參數(shù)為通信發(fā)生的區(qū)
6、字段和套接字的類型。WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函數(shù)用來把網(wǎng)卡設(shè)置為混雜模式。recv(sock,buffer,65535,0)函數(shù)用來接收經(jīng)過的IP包,其參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)的大小。四.課程設(shè)計(jì)流程圖NoYes開始構(gòu)造程序運(yùn)行文件,生成輸出文件創(chuàng)建并初始化原始套接字設(shè)置網(wǎng)卡混雜模式監(jiān)聽網(wǎng)卡捕獲和解析IP數(shù)據(jù)報(bào)輸出解析信息,并存入文檔結(jié)束是否達(dá)到需要次數(shù)五部分程序設(shè)計(jì)的分析1、使用原始套接字 要進(jìn)行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼
7、如下: SOCKET sock;sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 在WSASoccket函數(shù)中,第一個(gè)參數(shù)指定通信發(fā)生的區(qū)字段,AF_INET是針對Internet的,允許在遠(yuǎn)程主機(jī)之間通信。第二個(gè)參數(shù)是套接字的類型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三種套接字類型。在這里,設(shè)置為SOCK_RAW,表示聲明的是一個(gè)原始套接字類型。第三個(gè)參數(shù)依賴于第二個(gè)參數(shù),用于指定套接字所有的特定協(xié)議,這里使用IP協(xié)議。第四個(gè)參數(shù)為WSAPRO
8、TOCOL_INFO位,該位可以置空。第五個(gè)參數(shù)保留,永遠(yuǎn)置0。第六個(gè)參數(shù)是標(biāo)志位,WSA_FLAG_OVERLAPPED表明可以使用發(fā)送接收超時(shí)設(shè)置。創(chuàng)建原始套接字后,IP頭就會(huì)包含在接收的數(shù)據(jù)中。然后,可以設(shè)置IP頭操作選項(xiàng),調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定IP_HDRINCL選項(xiàng),表明用戶可以親自對IP頭進(jìn)行處理。BOOL flag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag);之后,使用如下代碼完成對socket的初始化工作:/*獲取主機(jī)名*/char h
9、ostName128;gethostname(hostName,100);/*獲取本地IP地址*/hostent * pHostIP;pHostIP = gethostbyname(hostName);/*填充SOCKADDR_IN結(jié)構(gòu)的內(nèi)容*/sockaddr_in addr_in;addr_in.sin_addr = *(in_addr *)pHostIP->h_addr_list0;addr_in.sin_family = AF_INET;addr_in.sin_port = htons(6000);/*綁定socket*/bind(sock,(PSOCKADDR)&add
10、r_in,sizeof(addr_in);填寫sockaddr_in的內(nèi)容時(shí),其地址值應(yīng)填寫為本機(jī)IP地址,本機(jī)IP地址可以通過gethostbyname()函數(shù)獲??;端口號可以隨便填寫,但不能與系統(tǒng)沖突;協(xié)議族應(yīng)填為AF_INET。使用htons()函數(shù)可以將無符號短整型的主機(jī)數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序的數(shù)據(jù)。最后使用bind(0函數(shù)將socket綁定到本機(jī)網(wǎng)卡上。 綁定網(wǎng)卡后,需要用WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有網(wǎng)絡(luò)數(shù)據(jù),其關(guān)鍵代碼如下:#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWO
11、RD dwBufferInLen = 1;DWORD dwBytesReturned = 0;WSAIoct1(SnifferSocket, IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收到的數(shù)據(jù)就拷貝到套接字中。因此,網(wǎng)卡就可以接收所有經(jīng)過的IP包。2、接收數(shù)據(jù)包在程序中可使用recv()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè)參數(shù)接收
12、操作所用的套接字描述符;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求,直接設(shè)為0。因?yàn)镮P數(shù)據(jù)包的最大長度是65535B,因此,緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來反復(fù)監(jiān)聽接收IP包,用RECV()函數(shù)實(shí)現(xiàn)接收功能的代碼如下:#define BUFFER_SIZE 65535char bufferBUFFER_SIZE; /設(shè)置緩沖區(qū)while(true)recv(sock,buffer,BUFFER_SIZE,0); /接收數(shù)據(jù)包 /*然后是解析接收的IP包*/3、定義IP頭部的
13、數(shù)據(jù)結(jié)構(gòu)程序需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)表示IP頭部。這個(gè)數(shù)據(jù)結(jié)構(gòu)應(yīng)該和IP數(shù)據(jù)包的格式吻合,其代碼如下:typedef struct _IP_HEADER /定義IP頭unionBYTE Version; /版本(前4位)BYTE HdrLen; /報(bào)頭標(biāo)長(后4位),IP頭的長度;BYTE ServiceType; /服務(wù)類型WORD TotalLen; /總長度WORD ID; /標(biāo)識(shí)unionWORD Flags; /標(biāo)志(前3位)WORD FragOff; /分段偏移(后13位);BYTE TimeToLive; /生命期BYTE Protocol; /協(xié)議WORD HdrChksum; /
14、頭校驗(yàn)和DWORD SrcAddr; /源地址DWORD DstAddr; /目的地址BYTE Options; /選項(xiàng) IP_HEADER;這里只考慮IP頭部結(jié)構(gòu),不考慮數(shù)據(jù)部分。在捕獲IP數(shù)據(jù)包后,可以通過指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADER的數(shù)據(jù)結(jié)構(gòu)。IP_HEADER ip=*(IP_HEADER*)buffer;4、IP包的解析通過IP_HEADER解析IP頭各個(gè)字段的代碼:/*獲取版本字段*/ip.Version>>4;/*獲取頭部長度字段*/ip.HdrLen & 0x0f;/*獲取服務(wù)類型字段中的優(yōu)先級子域*/ip.ServiceType>&
15、gt;5;/*獲取服務(wù)類型字段中的TOS子域*/(ip.ServiceType>>1)&0x0f;/*獲取總長度字段*/ip.TotalLen;/*獲取標(biāo)識(shí)字段*/ip.ID;/*解析標(biāo)志字段*/DF = (ip.Flags>>14) & 0x01;MF = (ip.Flags>>13) & 0x01;/*獲取分段偏移字段*/ip.FragOff & 0x1fff;/*獲取生存時(shí)間字段*/ip.TimeToLive;/*獲取協(xié)議字段*/ip.Protocol;/*獲取頭校驗(yàn)和字段*/ip.HdrChksum;/*解析源IP地址
16、字段*/inet_ntoa(*(in_addr*)&ip.SrcAddr);/*解析目的IP地址字段*/inet_ntoa(*(in_addr*)&ip.DstAddr); 六IP數(shù)據(jù)包解析代碼如下:#include <stdio.h>#include <iostream.h>#include <Winsock2.h>#include <ws2tcpip.h>#pragma comment (lib,"Ws2_32.lib")#define BUFFER_SIZE 65535#define IO_RCVALL
17、_WSAIOW(IOC_VENDOR,1)typedef struct _IP_HEADER /定義IP頭unionBYTE Version; /版本(前4位) BYTE HdrLen; /報(bào)頭標(biāo)長(后4位),IP頭長度;BYTE ServiceType; /服務(wù)類型WORD TotalLen; /數(shù)據(jù)報(bào)總長WORD ID; /標(biāo)識(shí)unionWORD Flags; /標(biāo)識(shí)(前3位)WORD FragOff; /分段偏移(后13位);BYTE TimeToLive; /生存周期BYTE Protocol; /協(xié)議WORD HdrChksum; /頭校驗(yàn)和DWORD SrcAddr; /源地址DW
18、ORD DstAddr; /目地地址BYTE Options; /選項(xiàng)IP_HEADER;char * parseServiceType_getProcedence(BYTE b)switch(b>>5)/獲取服務(wù)類型字段中優(yōu)先級子域case 7: return "Network Control"/網(wǎng)絡(luò)控制break;case 6:return "Internet work Control" /網(wǎng)絡(luò)控制break;case 5:return "CRITIC/ECP" break;case 4:return "Fl
19、ash Override"/最優(yōu)先信號break;case 3:return "Flsah" break;case 2:return "Immediate" break;case 1:return "Priority"/協(xié)議break;case 0:return "Routine"/路由break;default:return "Unknow"break;char * parseServiceType_getTOS(BYTE b)b=(b>>1)&0x0f;/獲取服
20、務(wù)類型字段中的TOS子域switch(b) case 0:return "Normal service" /正常運(yùn)行break;case 1:return "Minimize monetary cost" /成本break;case 2:return "Maximize reliability" /可靠性break;case 4:return "Maximize throughput" /吞吐量break;case 8:return "Minimize delay" /延遲break;case
21、15:return "Maximize security" /安全性break; default:return "Unknow" char * getProtocol(BYTE Protocol) /獲取協(xié)議字段共8位switch(Protocol) /以下為協(xié)議號說明: case 1:return "ICMP" /Internet控制報(bào)文協(xié)議case 2:return "IGMP" /Internet組管理協(xié)議case 4: return "IP in IP"/移動(dòng)IP數(shù)據(jù)封裝和隧道case
22、6:return "TCP"/傳輸控制協(xié)議case 8:return "EGP"/外部網(wǎng)關(guān)協(xié)議case 17:return "UDP"/用戶數(shù)據(jù)報(bào)文協(xié)議case 41:return "IPv6"case 46:return "RSVP"/資源預(yù)留協(xié)議case 89:return "OSPF"/Open Shortest Path First 開發(fā)式最短路徑優(yōu)先default:return "UNKNOW"void ipparse(FILE* file,ch
23、ar* buffer)IP_HEADER ip=*(IP_HEADER*)buffer; /通過指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)結(jié)構(gòu)fseek(file,0,SEEK_END);fprintf(file,"版本號=%drn",ip.Version>>4);fprintf(file,"報(bào)頭標(biāo)長= %d (BYTE)rn",(ip.HdrLen & 0x0f)*4);fprintf(file,"服務(wù)器類型 = %s,%srn",parseServiceType_getProcedence(ip.Ser
24、viceType),parseServiceType_getTOS(ip.ServiceType);fprintf(file,"總長度 = %d(BYTE)rn",ip.TotalLen);fprintf(file,"標(biāo)識(shí) = %drn",ip.ID);fprintf(file,"標(biāo)志位 DF=%d , MF=%drn",(ip.Flags>>14)&0x01),(ip.Flags>>13)&0x01);fprintf(file,"分段偏移值 = %drn",(ip.Frag
25、Off&0x1fff);fprintf(file,"生存期 = %d (hops)rn",ip.TimeToLive);fprintf(file,"協(xié)議 = %srn",getProtocol(ip.Protocol);fprintf(file,"頭校驗(yàn)和 = 0x%0xrn",ip.HdrChksum);fprintf(file,"源IP地址 = %srn",inet_ntoa(*(in_addr*)&ip.SrcAddr);fprintf(file,"目的IP地址 = %srn&quo
26、t;,inet_ntoa(*(in_addr*)&ip.DstAddr);fprintf(file,"-rn");int main()FILE * file;if(file=fopen("history.txt","wb+")=NULL)printf("fail to open file %s");return -1;WORD rv;WSADATA WSAData; /定義了能夠儲(chǔ)存WSAStarup調(diào)用返回值的結(jié)構(gòu)rv=MAKEWORD(2,2); /Winsock2版本W(wǎng)SAStartup(rv,&am
27、p;WSAData);SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); /創(chuàng)建套接字,sock為套接字描述符BOOL flag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag);/任意類型、任意狀態(tài)套接口的設(shè)置選項(xiàng)值char hostName128;gethostname(hostName,100); /獲取主機(jī)名hostent * pHostIP;/獲取本地IP地址pHostIP = gethostbyname(hostName);sockaddr_
28、in addr_in;addr_in.sin_addr=*(in_addr *)pHostIP->h_addr_list0;addr_in.sin_family = AF_INET;addr_in.sin_port = htons(6000); /將無符號短整型主機(jī)數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序數(shù)據(jù)bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in);DWORD dwBufferLen10; /設(shè)置網(wǎng)卡為混雜模式DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(sock, IO_RCVALL,&dwBufferInLen,sizeof(d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國移動(dòng)河北公司校園實(shí)習(xí)生招聘440人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國電力貴州工程限公司招聘667人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國廣核集團(tuán)聯(lián)合培養(yǎng)招聘(黑龍江)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國出口信用保險(xiǎn)公司校園招聘100人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國中鐵華南區(qū)域總部(中鐵南方)畢業(yè)生招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年福建寧德霞浦縣事業(yè)單位招考緊缺急需人才20高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年廣東省深圳市龍華區(qū)事業(yè)單位考試筆試高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年安徽黃山市黟縣事業(yè)單位招聘31人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年四川遂寧市安居區(qū)部分事業(yè)單位考試招聘29人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025下半年四川省廣元市朝天區(qū)委組織部人力資源和社會(huì)保障局招聘20人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 揚(yáng)塵防治(治理)監(jiān)理實(shí)施細(xì)則(范本)
- 五金耗材材料項(xiàng)目投標(biāo)方案(技術(shù)方案)
- 讀書分享《終身成長》課件
- GB/T 44843-2024在用自動(dòng)扶梯和自動(dòng)人行道安全評估規(guī)范
- 廣東省廣州市2023-2024學(xué)年六年級上學(xué)期語文期末試卷(含答案)
- 宮頸癌護(hù)理查房-5
- 中職無人機(jī)應(yīng)用技術(shù)跨行業(yè)人才培養(yǎng)方案
- 律師事務(wù)所整體轉(zhuǎn)讓協(xié)議書范文
- 照明設(shè)備課件教學(xué)課件
- 高級管理招聘面試題與參考回答2024年
- 2023-2024學(xué)年全國初中七年級下地理人教版期中考試試卷(含答案解析)
評論
0/150
提交評論