解析IP數(shù)據(jù)包剖析_第1頁
解析IP數(shù)據(jù)包剖析_第2頁
解析IP數(shù)據(jù)包剖析_第3頁
解析IP數(shù)據(jù)包剖析_第4頁
解析IP數(shù)據(jù)包剖析_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 解析IP數(shù)據(jù)包任務(wù)目的:設(shè)計一個解析IP數(shù)據(jù)包的程序,并根據(jù)這個程序,說明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題,從而IP層的工作原理有更好的理解和認識。任務(wù)要求:本實驗的目標是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,見個結(jié)果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下: 以命令行形式運行:ipparselogfile,其中ipparse是程序名,而logfile則代表記錄結(jié)果的日志文件。 在標準輸出、和日志文件中寫入捕獲的IP包的版本、頭長度、服務(wù)類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標識、分段標志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源IP地址和目的IP地址等內(nèi)容。 當程序接收

2、到鍵盤輸入Ctrl+C時退出。設(shè)計相關(guān)知識:互聯(lián)網(wǎng)絡(luò)層是TCP/IP協(xié)議參考模型中的關(guān)鍵部分.IP協(xié)議把傳輸層送來的消息組裝成IP數(shù)據(jù)包,并把IP數(shù)據(jù)包傳送給數(shù)據(jù)鏈層.IP協(xié)議在TCP/IP協(xié)議族中處于核心地位,IP協(xié)議制定了統(tǒng)一的IP數(shù)據(jù)包格式,以消除個通信子網(wǎng)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對IP包的格式有一定了解,圖1給出了IP協(xié)議的數(shù)據(jù)包格式.IP數(shù)據(jù)包的第一個字段是版本字段,其度是4位,表示所使用的IP協(xié)議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數(shù)據(jù)包的解析.報頭標

3、長字段為4位,它定義了以4B為一個單位的IP包的報文長度.報頭中除了選項字段和填充域字段外,其他各字段是定長的.因此,IP數(shù)據(jù)包的頭長度在2040B之間,是可變的.0 4 8 16 19 24 31版本報頭標長服務(wù)類型總長度標識標志片偏移生存時間協(xié)議頭校驗和源IP地址目的IP地址選項填充域數(shù)據(jù)部分圖1 IP數(shù)據(jù)包的格式服務(wù)類型字段共8位,用于指示路由器如何處理該數(shù)據(jù)包.該字段長度由4位服務(wù)類型(TOS)子域和3位優(yōu)先級子域組成,1位為保留位,該字段結(jié)構(gòu)如圖2所示. B7 b6 b5 b4 b3 b2 b1 b0優(yōu)先級DTRC0圖2 服務(wù)類型字段結(jié)構(gòu)優(yōu)先級共有8種,優(yōu)先級越高表明數(shù)據(jù)包越重要.表

4、1中列出了各種優(yōu)先級所代表的意義.表一 優(yōu)先子域的說明位數(shù)(b7b6b5) 意義111 網(wǎng)絡(luò)控制110 網(wǎng)絡(luò)間控制101 重要(CRITIC/ECP)100 即時,優(yōu)先011 即時010 立刻001 優(yōu)先000 普通在4位服務(wù)類型子域中b4,b3,b2,b1分別表示D(延遲),T(吞吐量),R(可靠性)與C(成本).表2列出了服務(wù)器類型自域的構(gòu)成.位數(shù)( b4b3b2b1)意義 1111 安全級最高 1000 延遲最小 0100 吞吐量最大 0001 金錢成本最小 0000 普通服務(wù)總長度字段為2B,它定義了以字節(jié)為單位的數(shù)據(jù)包的總長度.IP數(shù)據(jù)包的最大長度為65535B.標識字段的長度為16

5、位,用于識別IP數(shù)據(jù)包的編號.每批數(shù)據(jù)都要有一個標識值,用于讓目的主機判斷新來的數(shù)據(jù)屬于哪個分組.報頭中的標志字段如圖7-3所示.標志字段共3位,最高位是0.禁止分片標志DF(do not fragment)字段的值若為1,表示不能對數(shù)據(jù)包分片;若DF值為0,則表明可以分片.分片標志MF(more fragment)的值為1,表示接收到的不是最后一個分片;若MF值為0,表示接收到的是最后一個分片.片偏移字段共13位,說明分片在整個數(shù)據(jù)包中的相對位置.片偏移值是以8B為單位來記數(shù)的,因此選擇的分片長度應該是8B的整數(shù)倍.生存時間(TTL)字段為8位,用來設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過程的壽命,通常

6、是用一個數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.協(xié)議字段為8位,表示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號如表二所示.序號協(xié)議名稱序號協(xié)議名稱12468ICMPIGMPIP inIPTCPEGP17414689UDPIPV6RSVPOSPFA表二 典型的協(xié)議號頭校驗和字段為16位,用于存放檢查報頭錯誤的校驗碼。檢驗的范圍是整個IP包的報頭。校驗和按如下方法計算:1)將頭校驗和的字段置為0。2)將報頭部分的所有數(shù)據(jù)以16位為單位進行累加,累加方式是求異或。3)將累加的結(jié)果取反碼,就是頭校驗和。 當收到一個IP包時,要檢查報頭是否出錯,就把報頭中的所有數(shù)據(jù)以16位為單位進行累加,若累加的

7、結(jié)果為0,則報文沒有出錯。 地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機和目的主機的IP地址。 選項字段的長度范圍為040B,主要用于控制和測試。在使用選項字段的過程中,有可能出現(xiàn)報頭部分的長度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過填充位來湊齊。任務(wù)設(shè)計分析:為了獲取網(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ò)接口在驗

8、證投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取流經(jīng)網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就需要將網(wǎng)卡設(shè)置為混雜模式。本程序主要由三部分構(gòu)成:初始化原始套接字,反復監(jiān)聽捕獲數(shù)據(jù)包和解析數(shù)據(jù)包。下面就結(jié)合核心代碼對程序的具體實現(xiàn)進行講解,同時使程序流程更加清晰,去掉了錯誤檢查等保護性代碼。程序流程圖:具體程序代碼:#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#include<fstream>#include <windows.h>/#

9、include <winsock.h>#pragma comment(lib,"ws2_32") /指定連接到網(wǎng)絡(luò)應用和internet#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) typedef struct IP_HEAD union /定義聯(lián)合 unsigned char Version; unsigned char HeadLen; ; unsigned char ServiceType; unsigned short TotalLen; unsigned short Identifier; union unsigned

10、 short Flags; unsigned short FragOffset; ; unsigned char TimeToLive; unsigned char Protocol; unsigned short HeadChecksum; unsigned int SourceAddr; unsigned int DestinAddr; unsigned char Options; ip_head; /定義IP頭部的數(shù)據(jù)結(jié)構(gòu)void main(int argc,char *argv) using namespace std; ofstream outfile("e:logfile

11、.txt",ios:out);if(argc!=2) cout<<endl<<"請以下格式輸入命令行:PackParse packet_sum"<<endl; /packet_sum 為要分析IP包的個數(shù)。return; WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0) cout<<endl<<"WSASTartup初始化失敗"<<endl; return; SOCKET sock=socket(

12、AF_INET,SOCK_RAW,IPPROTO_IP); /三個參分別為通信發(fā)生的區(qū)字段,套接字的類型,與IP協(xié)議if(sock=INVALID_SOCKET) cout<<endl<<"創(chuàng)建Socket失敗!"<<endl; closesocket(sock); WSACleanup(); BOOL flag=TRUE; if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *) &flag,sizeof(flag)=SOCKET_ERROR) cout<<endl<&

13、lt;"setsockopt操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); WSACleanup(); char hostName128;/獲取主機名if(gethostname(hostName,100)=SOCKET_ERROR) cout<<endl<<"gethostname操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); WSACleanup(); hostent

14、*pHostIP; /獲取本地IPif(pHostIP=gethostbyname(hostName)=NULL) cout<<endl<<"gethostbyname操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); WSACleanup(); sockaddr_in host_addr;/ host_addr.sin_family=AF_INET; host_addr.sin_port=htons(6000); host_addr.sin_addr=*(in_addr *

15、)pHostIP->h_addr_list0; if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr)=SOCKET_ERROR) cout<<endl<<"bind操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); /綁定網(wǎng)卡WSACleanup(); DWORD dwBufferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl

16、(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen) , &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR) cout<<endl<<"WSAIoctl操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); /將網(wǎng)卡設(shè)為混雜模式,以接受所有數(shù)據(jù)WSACleanup(); cout<<en

17、dl<<"開始解析IP包:"<<endl; char buffer65535; /設(shè)置緩沖區(qū)int packsum=atoi(argv1); /字符串轉(zhuǎn)換為整形for(int i=0;i<packsum;i+) if(recv(sock,buffer,65535,0)>0) /四個參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)大小,附加標志 ip_head ip=*(ip_head *)buffer; cout<<"-"<<endl; cout<<"版本:"<

18、<(ip.Version>>4)<<endl; /獲取頭部長度字段cout<<"頭部長度:"<<(ip.HeadLen&0x0f)*4)<<endl; /獲取頭部長度字段cout<<"服務(wù)類型:Priority"<<(ip.ServiceType>>5)<<", Service"<<(ip.ServiceType>>1)&0x0f)<<endl; /優(yōu)先級子域和TOS子域

19、cout<<"總長度:"<<ip.TotalLen<<endl;/獲取總長度字段cout<<"標識符:"<<ip.Identifier<<endl;/獲取標識字段cout<<"標志位:"<<(ip.Flags>>15)&0x01)<<",DF= "<<(ip.Flags>>14)&0x01)<<",Mf="<<(i

20、p.Flags>>13)&0x01)<<endl; /獲得標志字段cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; /獲取分段偏移字段cout<<"生存周期:"<<(int)ip.TimeToLive<<endl; /獲取生存時間字段cout<<"協(xié)議:Protocol"<<(int)ip.Protocol<<endl; /獲取協(xié)議字段cout<

21、<"頭部校驗和:"<<ip.HeadChecksum<<endl; /獲取頭校驗和字段cout<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl; /獲取源IP地址字段cout<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.DestinAddr)<<endl; /獲取目的IP地址字段outfile<<"-&quo

22、t;<<endl; outfile<<"版本:"<<(ip.Version>>4)<<endl; outfile<<"頭部長度:"<<(ip.HeadLen&0x0f)*4)<<endl; outfile<<"服務(wù)類型:Priority"<<(ip.ServiceType>>5)<<", Service"<<(ip.ServiceType>>

23、1)&0x0f)<<endl; outfile<<"總長度:"<<ip.TotalLen<<endl; outfile<<"標識符:"<<ip.Identifier<<endl; outfile<<"標志位:"<<(ip.Flags>>15)&0x01)<<",DF= "<<(ip.Flags>>14)&0x01)<<",Mf="<<(ip.Flags>>13)&0x01)<<endl; outfile<<"片偏移:"<

溫馨提示

  • 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

提交評論