




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)四、解析 IP 分組一、實(shí)驗(yàn)?zāi)康?、IP 分組是網(wǎng)絡(luò)層傳輸?shù)幕締卧?,通過(guò)接受和解析 IP 分組,了解 IP 分 組基本結(jié)構(gòu),與 IP 協(xié)議基本功能;2、輸出TCP報(bào)文數(shù)據(jù),以16進(jìn)制輸出,建立TCP連接,分析TCP的三次握 手。二、實(shí)驗(yàn)過(guò)程(1)實(shí)驗(yàn)流程開(kāi)始構(gòu)造程序運(yùn)行環(huán)境,桿開(kāi)輸出文件創(chuàng)建原蛤套接字,并初始化捕獲IP傾解析IP分組井輸出(DOSi文件)< Ctrl+c 一結(jié)束(2)實(shí)驗(yàn)原理:想要抓取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對(duì)網(wǎng)卡進(jìn)行編程,我們使用套接字(socket) 進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地 址相匹配的數(shù)據(jù)包或是以廣播形式出
2、發(fā)的數(shù)據(jù)包。對(duì)于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在驗(yàn)證投遞地址并非自身地址之后將不引起響應(yīng),也就是說(shuō)應(yīng)用程序無(wú)法收取與自己無(wú)關(guān)的數(shù)據(jù)包。我們要想獲取流經(jīng)網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就需要將網(wǎng)卡設(shè)置為混雜模式。本程序主要由三部分構(gòu)成:初始化原始套接字,反復(fù)監(jiān)聽(tīng)捕獲數(shù)據(jù)包和解析 數(shù)據(jù)包。1)使用原始套接字套接字分為三種,即流套接字(Stream Socket )、數(shù)據(jù)報(bào)套接字(Datagram Socket)和原始套接字(RawSocket )。要進(jìn)行IP數(shù)據(jù)包的接受與發(fā)送,應(yīng)使用原始套接字在WSASocce函數(shù)中,第一個(gè)參數(shù)指定通信發(fā)生的區(qū)字段,AF_INET是
3、針對(duì)Internet 的,允許在遠(yuǎn)程主機(jī)之間通信。第二個(gè)參數(shù)是套接字的類型, AF_INET 地址族下,有 SOCK_STRE、MOCK_DGRAMOCK_RAW種套接字類型。在這里, 我們?cè)O(shè)置為SOCK_R AWS示我們聲明的是一個(gè)原始套接字類型。第三個(gè)參數(shù)依 賴于第二個(gè)參數(shù),用于指定套接字所用的特定協(xié)議,這里使用 IP 協(xié)議。第四個(gè) 參數(shù)為 WSAPROTOCOL_lNF,O該位可以置空,永遠(yuǎn)置0。第六個(gè)參數(shù)是標(biāo)志位, WSA_FLAG_OVERRLAP表EM以使用發(fā)送接收超時(shí)設(shè)置,本課程設(shè)計(jì)也可以把 這個(gè)標(biāo)志位設(shè)置為NULL因?yàn)楸驹O(shè)計(jì)不用考慮超時(shí)情況。創(chuàng)建原始套接字后, IP 頭就會(huì)包含
4、在接收的數(shù)據(jù)中。然后,我們可以設(shè)置 IP頭操作選項(xiàng),調(diào)用sotscockpot函數(shù)。其中flag 設(shè)置為TRUE并設(shè)定IP_HDRINCL選項(xiàng),表明用戶可以親自對(duì)IP頭進(jìn)行處理。之后,完成對(duì) socket 的初始化工作。填寫 sockaddr_in 的內(nèi)容時(shí),其地址值應(yīng)填寫為本機(jī) IP 地址可以通過(guò) gethostbyname() 函數(shù)獲??;端口號(hào)可以隨便填寫,但不能與系統(tǒng)沖突;協(xié)議族 應(yīng)填寫為AF_INET注意,sockaddr_in結(jié)構(gòu)的值必須是以網(wǎng)絡(luò)字節(jié)順序表示的 值,而不能直接使用本機(jī)字節(jié)順序的值,使用 htoms() 函數(shù)可以將無(wú)符號(hào)短整型 的主機(jī)數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)的順序的數(shù)據(jù)。最后
5、使用bind ()函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后, 需要 WSAIoctl() 函數(shù)把網(wǎng)卡設(shè)置為混雜模式, 使網(wǎng)卡能夠接收 所有網(wǎng)絡(luò)數(shù)據(jù), 如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配, 那么 接收到的數(shù)據(jù)就拷貝到套接字中。因此,網(wǎng)卡就可以接收所有經(jīng)過(guò)的 IP 包。2)接收數(shù)據(jù)包在程序中可使用RECV()函數(shù)接收經(jīng)過(guò)的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè) 參數(shù)接收操作所用的套接字描述符; 第二個(gè)參數(shù)接收到緩沖區(qū)的地址; 第二個(gè)參 數(shù)接收緩沖區(qū)的地址; 第三個(gè)參數(shù)接收緩沖區(qū)的大小, 也就是所要接收的字節(jié)數(shù); 第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對(duì)所發(fā)送的數(shù)據(jù)沒(méi)特殊要求,直接設(shè)為0。因
6、為IP數(shù)據(jù)包的最大長(zhǎng)度是65536B,因此緩沖區(qū)的大小不能小于 65535B設(shè)置緩 沖區(qū)后,可利用循環(huán)來(lái)反復(fù)監(jiān)聽(tīng)接收 IP 包,用 recv() 函數(shù)接收。然后定義 IP 頭部的數(shù)據(jù)結(jié)構(gòu)。 程序需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu)表示 IP 頭部這時(shí) 我們只考慮 IP 頭部結(jié)構(gòu),不考慮數(shù)據(jù)部分。 在捕獲 IP 數(shù)據(jù)包后, 可以通過(guò)指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADE數(shù)據(jù)結(jié)構(gòu)。3)解析 IP 數(shù)據(jù)包解析IP數(shù)據(jù)包的字段有兩種策略。針對(duì)長(zhǎng)度為8位、16位和32位的字段(或 子字段)時(shí),可以利用IP_HEADER勺成員指教獲取。要解析長(zhǎng)度不是9位倍數(shù)的 字段(或子字段)時(shí),可以利用C語(yǔ)言中的位移以及與、或操
7、作完成。下面給出 了通過(guò)IP_HEADER軍析IP頭各個(gè)字段的代碼。(3) IP 源代碼#include "winsock2.h"#include "ws2tcpip.h"#include "iostream"#include "stdio.h"#pragma comment(lib,"ws2_32.lib")using namespace std;static const int NumOfData = 8;typedef struct _IP_HEADERunionBYTE Version;
8、/ 版本BYTE HdrLen;/IHL;BYTE ServiceType;/ 服務(wù)類型WORD TotalLen;/ 總長(zhǎng)WORD ID;/ 標(biāo)識(shí)unionWORD 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)DWORD DataNumOfData;IP_HEADER;/逐位解析 IP 頭中的信息void getVersion(BYTE b,BYT
9、E &version) version=b>>4;void getIHL(BYTE b,BYTE &result)result=(b & 0x0f)*4;char *parseServiceType_getProcedence(BYTE b)switch(b>>5)case 7:return "Network Control"break;case 6:return "Internet work Control"break;case 5:return "CRITIC/ECP"break;c
10、ase 4:return "Flash Override"break;case 3:return "Flash"break;case 2:return "Immediate"break;case 1:return "Priority"break;case 0:return "Routine"break;default:return "Unknown"char *parseServiceType_getTOS(BYTE b) b=(b>>1)&0x0f; s
11、witch(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 delay"break;case 15:return "Maximize securit
12、y"break;default:return "Unknown"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 *getProtocol(BYTE Protocol)switch(Protocol)case 1:return "ICMP"case 2:return
13、 "IGMP"case 4:return "IP in IP"case 6:return "TCP"case 8:return "BGP"case 17:return "UDP"case 41:return "RSVP"case 89:return "OSPF"default:return "UNKNOWN"void ipparse(FILE *file,char *buffer)int k,j;IP_HEADER ip=*(IP_HE
14、ADER *)buffer;fseek(file,0,SEEK_END);for(k=0;k<5;k+)for(j=0;j<20;j+)",(unsignedfprintf(file,"%x%xchar)buffer20*k+j)>>4,(buffer20*k+j&0x0f);fprintf(file,"n");/解析版本信息BYTE version;getVersion(ip.Version,version);fprintf(file," 版本 =%drn",version);/解析 IP 長(zhǎng)度BYT
15、E headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file," 頭長(zhǎng)度 =%d(BYTE)rn",headerLen);/解析服務(wù)類型fprintf(file," 服 務(wù) 類 型=%s,%srn",parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType);/解析數(shù)據(jù)包長(zhǎng)度 fprintf(file," 數(shù)據(jù)報(bào)長(zhǎng)度 =%d(BYTE)rn",ip.TotalLen);/解析數(shù)
16、據(jù)包 IDfprintf(file," 數(shù)據(jù)報(bào) ID=%drn",ip.ID);/解析標(biāo)志位BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file," 分段標(biāo)志 DF=%d,MF=%drn",DF,MF);/解析分段偏移WORD fragOff; getFragOff(ip.FragOff,fragOff); fprintf(file," 分段偏移值 =%drn",fragOff);/解析生存期fprintf(file," 生存期 =%drn",ip.TimeToLive)
17、;/解析協(xié)議fprintf(file," 協(xié)議 =%srn",getProtocol(ip.Protocol);/解析頭校驗(yàn)和 fprintf(file," 頭校驗(yàn)和 =0x%0xrn",ip.HdrChksum);/解析 IP 地址fprintf(file," 源 IP 地 址 =%srn",inet_ntoa(*(in_addr *)&ip.DstAddr);/解析目的 IP 地址fprintf(file," 目 的 IP 地 址 =%srn",inet_ntoa(*(in_addr *)&ip
18、.DstAddr);/解析數(shù)據(jù)包前 32 字節(jié) for (int i = 0; i < NumOfData; +i) fprintf(file," 數(shù)據(jù)報(bào)第 %d 字節(jié) :%xrn",4 * i,ip.Datai); fprintf(file," rn");int main(int argc,char *argv)if(argc!=2) printf("usage error!n"); return -1;FILE *file; if(file=fopen(argv1,"wb+")=NULL) printf(
19、"fail to open file %s",argv1); return -1;WSADATA wsData; /初始化失敗,程序退出 if(WSAStartup(MAKEWORD( 2, 2 ),&wsData)!=0)printf("WSAStartup failedn"); return -1;SOCKET sock;/ 建立原始 socketif(sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=INV ALID_SO CKET ) printf("create socket failed!n&
20、quot;); return -1;BOOL flag=TRUE;/設(shè)置 IP 頭操作選項(xiàng),其中 flag 設(shè)置為 true, 用戶可以親自對(duì) IP 頭進(jìn)行處理if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)=SOCKET_ERROR) printf("setsockopt failed!n"); return -1;char hostName128;if(gethostname(hostName,100)=SOCKET_ERROR) printf("gethostname
21、 failedn"); return -1;/獲取本地 IP 地址 hostent *pHostIP; if(pHostIP=gethostbyname(hostName)=NULL) printf("gethostbyname failedn"); return -1;/地充 SOCKADDR_IN 結(jié)構(gòu) 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
22、);/把原始 socket 綁定到本地網(wǎng)卡上 if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in)=SOCKET_ER ROR) printf("bind failed"); return -1;DWORD dwValue=1;/設(shè)置 SOCK_RAW 為 SIO_RCV ALL, 以便接收所有的 IP 包 #define IO_RCV ALL _WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;if(
23、WSAIoctl(sock,IO_RCV ALL,&dwBufferInLen,sizeof(dwBufferInLen ),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR) printf("ioctlsocket failedn"); cout<<GetLastError()<<endl; return -1;/設(shè)置接收數(shù)據(jù)包的緩沖區(qū)長(zhǎng)度#define BUFFER_SIZE 65535char bufferBUFFER_SI
24、ZE;/監(jiān)聽(tīng)網(wǎng)卡printf(" 開(kāi)始解析經(jīng)過(guò)本機(jī)的 IP 數(shù)據(jù)包 n");while(true)int size=recv(sock,buffer,BUFFER_SIZE,0); if(size>0)ipparse(stdout,buffer); ipparse(file,buffer);fclose(file);return 0;(4)實(shí)驗(yàn)結(jié)果與分析將 IP 分組按 16 進(jìn)制形式輸出:卄 P4F4T子0 4 82 2 2陽(yáng)1R00353300 Ibl西IG234本工4度-20<BVTE>SRout ine.,8433316133f56430朋9831
25、3665oa 0 b 2 a a 1 3 3 0 0 0 4 9 0 c 5 3 3 39- e 6 4 f le3 3 55 b 8 1 9 e a 3 6 36 d 6 4* 4 0 e 3 3 6 01988 d 3 3 30 f 1 & 2 e S 3 6 6 b f 7 5 s0 f 3 3 38- f 1 3 0aS&832383508 4b 00 00 陰3062 6264 61e, Noi'na 1 0<BYTE>:31353S31 =36383631 :37313b34fgID=3972分段標(biāo)志DF=0,MF=HfhiSL-Tcr上校驗(yàn)和=0xl9eS:98clfS33 :eeabeddS嘛IPjffi址=1夕2 J罰川-75 自的 IP 地 it=192_lt8.8.75:6B8f彈建紅壬節(jié)汐31353831363836313?313b34曙很笫8字節(jié):Fff fl050xiS? 2 0字節(jié)誥%居;瑾24寧卩:轄及第沏字節(jié)=IP數(shù)據(jù)報(bào)分析:版本為4, “45”中的“ 4”,占4位;頭部長(zhǎng)度為20字節(jié),“45”中的“ 5”是包頭長(zhǎng)度為 5行,即5個(gè)32 位,5*32=20*8,故包頭長(zhǎng)度有20個(gè)字節(jié);服務(wù)類型為正常服務(wù),占8位,依據(jù)“ 00” ,用來(lái)獲得更好
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保設(shè)施運(yùn)維合同樣本
- 專項(xiàng)信托外匯固定資產(chǎn)貸款合作合同
- 玫瑰貸記卡動(dòng)產(chǎn)質(zhì)押合同協(xié)議
- 員工合同解除合同書
- 贍養(yǎng)義務(wù)履行合同范文
- 聯(lián)合購(gòu)房按揭貸款合同
- 精簡(jiǎn)版商業(yè)租賃合同范本
- 租賃合同季度范本:機(jī)械設(shè)備篇
- 南湖區(qū):合同科技創(chuàng)新與合作新機(jī)遇
- 出租車股份合作合同條款
- 干式變壓器培訓(xùn)課件
- 2023年上海中考語(yǔ)文試卷(附答案)
- 理發(fā)店業(yè)務(wù)轉(zhuǎn)讓協(xié)議書范本
- 2024年江蘇省中學(xué)生生物學(xué)奧林匹克初賽理論試題
- 環(huán)境年度報(bào)告
- 生產(chǎn)流水線的規(guī)劃方案
- 小針刀療法教學(xué)課件
- 打造寫生基地方案
- 寫作:廣告詞-【中職專用】高二語(yǔ)文高效課堂(高教版2023·職業(yè)模塊)
- 爆發(fā)性心肌炎護(hù)理查房課件
- 銷售人員人才畫像
評(píng)論
0/150
提交評(píng)論