(完整word版)計算機課程設計_IP數(shù)據(jù)包解析_第1頁
(完整word版)計算機課程設計_IP數(shù)據(jù)包解析_第2頁
(完整word版)計算機課程設計_IP數(shù)據(jù)包解析_第3頁
(完整word版)計算機課程設計_IP數(shù)據(jù)包解析_第4頁
(完整word版)計算機課程設計_IP數(shù)據(jù)包解析_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、成都信息工程學院解析 IP 數(shù)據(jù)包1. 課程設計目的本章課程設計的目的就是設計一個解析 IP 數(shù)據(jù)包的程序, 并根據(jù)這個程序, 說明 IP 數(shù)據(jù)包的結(jié)構(gòu)及 IP 協(xié)議的相關(guān)問題,從而對 IP 層的工作原理有更好的理解和認識。2. 課程設計要求本設計的目標是捕獲網(wǎng)絡中的 IP 數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下:1)以命令行形式運行: ipparse logfile ,其中 ipparse 是程序名 , 而 logfile 則代表記錄結(jié)果的日志文件。2)在標準輸出和日志文件中寫入捕獲的IP 包的版本、頭長度、服務類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標識

2、、分段標志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源 IP 地址和目的 IP 地址等內(nèi)容。3)當程序接收到鍵盤輸入Ctrl+C時退出1成都信息工程學院目錄目錄21、課程設計目的32、課程設計要求33、相關(guān)知識34、課程設計分析74.1網(wǎng)卡設置74.2使用套接字8接收數(shù)據(jù)包84.3定義 IP 頭部的數(shù)據(jù)結(jié)構(gòu)84.4 IP包的解析104.5協(xié)議的定義104.6 捕獲處理105、運行結(jié)果116、總結(jié)117、課程設計參考資料.128、源程序代碼122成都信息工程學院1、課程設計目的本課程設計的目的就是設計一個解析IP 數(shù)據(jù)包的程序,并根據(jù)這個程序,說明 IP 數(shù)據(jù)包的結(jié)構(gòu)及IP 協(xié)議的相關(guān)問題

3、,從而對IP 層的工作原理有更好的理解和認識。2、課程設計要求本設計的目標是捕獲網(wǎng)絡中的IP 數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下:1)以命令行形式運行: ipparse logfile,其中 ipparse 是程序名 ,而 logfile則代表記錄結(jié)果的日志文件。2 )在標準輸出和日志文件中寫入捕獲的IP 包的版本、頭長度、服務類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標識、分段標志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源 IP 地址和目的 IP 地址等內(nèi)容。3)當程序接收到鍵盤輸入Ctrl+C 時退出。3、相關(guān)知識互聯(lián)網(wǎng)絡層是TCP/IP 協(xié)議

4、參考模型中的關(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)中的差3成都信息工程學院異 , 從而為信息發(fā)送方和接收方提供了透明的傳輸通道. 編制本程序前 , 首先要對IP 包的格式有一定了解 , 圖 1 給出了 IP 協(xié)議的數(shù)據(jù)包格式 .IP 數(shù)據(jù)包的第一個字段是版本字段, 其度是 4 位, 表示所使用的 IP 協(xié)議的版本 . 目前的版本是IPV4, 版本字段的值是4, 下一代版本是 IPV6, 版本字段值是 6.本程序主要針對版本是

5、IPV4 的數(shù)據(jù)包的解析 .報頭標長字段為 4 位, 它定義了以 4B為一個單位的 IP 包的報文長度 . 報頭中除了選項字段和填充域字段外, 其他各字段是定長的. 因此 ,IP數(shù)據(jù)包的頭長度在 20 40B 之間 , 是可變的 .04816192431版本報頭標長服務類型總長度標識標志片偏移生存時間協(xié)議頭校驗和源IP地址目的 IP 地址選項填充域數(shù)據(jù)部分圖 1 IP數(shù)據(jù)包的格式服務類型字段共 8 位, 用于指示路由器如何處理該數(shù)據(jù)包. 該字段長度由 4 位服務類型 (TOS)子域和 3 位優(yōu)先級子域組成 ,1 位為保留位 , 該字段結(jié)構(gòu)如圖2 所示 .B7 b6b5b4b3b2b1b0優(yōu)先級

6、DTRC04成都信息工程學院圖 2服務類型字段結(jié)構(gòu)優(yōu)先級共有 8 種, 優(yōu)先級越高表明數(shù)據(jù)包越重要. 表 1 中列出了各種優(yōu)先級所代表的意義 .表一優(yōu)先子域的說明位數(shù) (b7b6b5)意義111網(wǎng)絡控制110網(wǎng)絡間控制101重要 (CRITIC/ECP)100即時, 優(yōu)先011即時010立刻001優(yōu)先000普通在 4 位服務類型子域中 b4,b3,b2,b1 分別表示 D(延遲 ),T( 吞吐量 ),R( 可靠性 )與 C(成本 ). 表 2 列出了服務器類型自域的構(gòu)成 .位數(shù) ( b4b3b2b1)意義1111安全級最高1000延遲最小0100吞吐量最大0001金錢成本最小0000普通服務5

7、成都信息工程學院總長度字段為2B, 它定義了以字節(jié)為單位的數(shù)據(jù)包的總長度.IP數(shù)據(jù)包的最大長度為 65535B.標識字段的長度為16 位, 用于識別 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, 表示接收到的是最后一個分片

8、.片偏移字段共 13 位, 說明分片在整個數(shù)據(jù)包中的相對位置. 片偏移值是以 8B為單位來記數(shù)的 , 因此選擇的分片長度應該是8B 的整數(shù)倍 .生存時間 (TTL) 字段為 8 位, 用來設置數(shù)據(jù)包在互聯(lián)網(wǎng)絡的傳輸過程的壽命,通常是用一個數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.協(xié)議字段為 8 位 , 表示使用此 IP 數(shù)據(jù)包的高層協(xié)議類型 , 常用的協(xié)議號如表3所示 .序號協(xié)議名稱序號協(xié)議名稱1ICMP17UDP2IGMP41IPV64IP inIP46RSVP6TCP89OSPFA8EGP6成都信息工程學院表 3典型的協(xié)議號頭校驗和字段為16 位,用于存放檢查報頭錯誤的校驗碼。檢驗的范圍

9、是整個IP 包的報頭。校驗和按如下方法計算:1)將頭校驗和的字段置為0。2)將報頭部分的所有數(shù)據(jù)以16 位為單位進行累加,累加方式是求異或。3)將累加的結(jié)果取反碼,就是頭校驗和。當收到一個 IP 包時,要檢查報頭是否出錯,就把報頭中的所有數(shù)據(jù)以16 位為單位進行累加,若累加的結(jié)果為0,則報文沒有出錯。地址字段包括源地址和目的地址。源地址和目的地址的長度都是32 位,分別表示發(fā)送數(shù)據(jù)包的源主機和目的主機的IP 地址。選項字段的長度范圍為040B,主要用于控制和測試。在使用選項字段的過程中,有可能出現(xiàn)報頭部分的長度不是32 位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過填充位來湊齊。4、課程設計分

10、析4.1 網(wǎng)卡設置為了獲取網(wǎng)絡中的IP 數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里使用套接字(socket)進行編程。但是,在通常情況下, 網(wǎng)絡通信的套接字程序只能響應與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡接口, 但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡接口在騅投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡設備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設置為混雜模式。7成都信息工程學院4.2 使用套接字套接字分為三種,即流套接字 (Stream socket) 、數(shù)據(jù)報套接字 (Datagram Socket) 和原始

11、套接字 (Raw Socket) 。要進行 IP 層數(shù)據(jù)包的接收和發(fā)送,應使用原始套接字。創(chuàng)建原始套接字的代碼如下:Socket sock;sock =socket(AF_INET,SOCK_RAW,IPPROTO_IP);本設計不用考慮超時情況。創(chuàng)建套接后, IP 頭就會包含在接收數(shù)據(jù)包中。 然后,我可以設置 IP 頭操作選項,調(diào)用 setsockopt函數(shù)。其中 flag設置為 true, 并設定 IP-HDRINCL選項,表明用戶可以親自對IP 頭進行處理。最后使用bind() 函數(shù)將 socket 綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用WSAIoctl() 函數(shù)把網(wǎng)卡設置為混雜模式,使網(wǎng)卡

12、能夠接收所有的網(wǎng)絡數(shù)據(jù)。如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收的數(shù)據(jù)就拷貝到套接字中,因此,網(wǎng)卡就可以接收所有經(jīng)過的IP包。接收數(shù)據(jù)包在程序中可使用 recv() 函數(shù)接收經(jīng)過的 IP 包。該函數(shù)有四個參數(shù),第一個參數(shù)接收操作所用的套接字描述符; 第二個參數(shù)接收緩沖區(qū)的地址; 第三個參數(shù)接收緩沖區(qū)的大小, 也就是所要接收的字節(jié)數(shù); 第四個參數(shù)是一個附加標志, 如果對所發(fā)送的數(shù)據(jù)沒特殊要求, 直接設為 0。因為 IP 數(shù)據(jù)包的最大長度是 65535B,因此緩沖區(qū)的大小不能小于 65535B。設置緩沖區(qū)后,可利用循環(huán)來反復監(jiān)聽接收 IP 包,用 recv() 函數(shù)實現(xiàn)接收功能

13、。4.3 定義 IP 頭部的數(shù)據(jù)結(jié)構(gòu)8成都信息工程學院程序需要定義一個數(shù)據(jù)結(jié)構(gòu)表示IP 頭部。其代碼如下:/*定義 IP 頭部數(shù)據(jù)結(jié)構(gòu) */typedef struct _IP_HEADERunionBYTE Version; /版本(前 4 位)BYTE HdrLen; /報頭標長(后四位), IP 頭長度;BYTE ServiceType; /服務類型WORD TotalLen; / 總長度WORD ID; / 標識unionWORD Flags;WORD FragOff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;

14、DWORD DstAddr;BYTE Options;9成都信息工程學院IP_HEADER;4.4 IP包的解析解析 IP 包的字段有兩種策略。針對長度為 8 位、 16 位和 32 位的字段 ( 或子字段 ) 時,可以利用 IP-HEADER的成員直接獲取。要解析長度不是 8 位倍數(shù)的字段 ( 或子字段 ) 時,可以利用 C 語言中的移位以人、及與、或操作完成。4.5 協(xié)議的定義( 包含相應的頭文件 #include #include):DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的 IP 包*/dwProtocol=IPPROTO_IP; /* 協(xié)議類型

15、為 IP*/4.6 捕獲處理1. 加載 Winsock ;2. 創(chuàng)建一個接收原始 IP 包的 socket 連接;3. 綁定到一個接口;4. 進行 WSAIoctl 設置,接收所有的 IP 數(shù)據(jù)包。代碼如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL) = SOCKET_ERROR)5. 接著設定一個線程進行捕獲:( 1)創(chuàng)建一個接收 IP 包的鏈表頭;( 2)設置一個標識,為真,則不斷進行 IP 包的捕獲;( 3)建立一個新的結(jié)點,將捕獲的

16、數(shù)據(jù)包加入到該結(jié)點;10成都信息工程學院( 4)如果鏈表的長度達到指定的長度, 創(chuàng)建一個線程對該鏈表的 IP 包進行解析;再設置一個在 IP 數(shù)據(jù)包鏈表不足給定的長度, 而又中止 IP 捕獲時,對鏈表的處理;( 5)為下一個 IP 包鏈表創(chuàng)建一個鏈表頭。6. 建立一個進行 IP 包解析并顯示的線程,進行解析 IP 數(shù)據(jù)包,然后顯示 IP 數(shù)據(jù)包。5、運行結(jié)果截獲 IP 數(shù)據(jù)包程序運行結(jié)果如下:6、總結(jié)這次計算機網(wǎng)絡課程設計是解析IP 數(shù)據(jù)包,通過這次上機充分應用了所學的計算機網(wǎng)絡和C 語言的知識,并上網(wǎng)搜索一部分相當資料, 粗略設計出該程序。11成都信息工程學院通過本次課程設計, 充分運用了所

17、學的計算機網(wǎng)絡知識, 設計出了如何解析 IP 數(shù)據(jù)包,從而更加深刻的了解到了 IP 數(shù)據(jù)包的結(jié)構(gòu)及 IP 協(xié)議的相關(guān)問題,從而對 IP 層的工作原理有更好的理解和認識。在課程設計的過程也碰到的不少問題。 該程序也存在著不少的缺陷, 比如并不是所有的數(shù)據(jù)包都能捕獲, 如:IP 數(shù)據(jù)包以外的數(shù)據(jù)包都抓不到; 只支持 ICMP、IGMP、TCP、 UDP這些協(xié)議。7、課程設計參考資料1計算機網(wǎng)絡 ( 第 5 版 ) 主編:謝希仁出版社:電子工業(yè)出版社出版時間: 2009 年 11 月2 數(shù)據(jù)通信與網(wǎng)絡(第四版) 吳時霖周正康吳永輝 譯8、源程序代碼#include "winsock2.h&

18、quot;#include "ws2tcpip.h"#include "iostream.h"#include "stdio.h"#pragma comment(lib, "ws2_32.lib")#define IO_RCV ALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535/*定義 IP 頭部數(shù)據(jù)結(jié)構(gòu)*/typedef struct _IP_HEADERunionBYTE Version; / 版本(前4 位)BYTE HdrLen; / 報頭標長(后四位) ,

19、IP 頭長度;BYTE ServiceType; / 服務類型WORD TotalLen; / 總長度WORD ID; / 標識unionWORD Flags;WORD FragOff;12成都信息工程學院;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER;/逐位解析IP 頭中的信息,獲取版本號void getVersion(BYTE b,BYTE &version)version = b>>4;void getIHL(BYTE b,

20、BYTE &result)result = (b & 0x0f) *4;/解析服務類型char * parseServiceType_getProcedence(BYTE b)switch(b>>5)case 7:return "Network Control"case 6:return "Internet work Control"case 5:return "CRITIC/ECP"case 4:return "Flash Override"case 3:return "Fa

21、lsh"case 2:return "Immediate"case 1:return "Priority"case 0:return "Routine"default:return "Unknown"13成都信息工程學院char * parseServiceType_getTOS(BYTE b)b=(b>>1)&0x0f;switch(b)case 0:return "Normal service"case 1:return "Minimize monet

22、ary cost"case 2:return "Maximize reliability"case 4:return "Maximize throughput"case 8:return "Minimize delay"case 15:return "Maximize security"default:return "Unknown"/*獲取禁止分片標志和分片標志*/void getFlags(WORD w,BYTE &DF, BYTE &MF)DF=(w>>

23、;14)&0x01;MF=(w>>13)&0x01;/*獲取分片偏移量*/void getFragoff(WORD w,WORD &fragoff)fragoff=w&0x1ffff;/獲取協(xié)議char * getProtocol(BYTE Protocol)switch (Protocol)case 1:return "ICMP"case 2:return "IGMP"case 3:return "GGP"case 4:return "IP in IP "case 6:

24、14成都信息工程學院return "TCP"case 8:return "EGP"case 17:return "UDP"case 41:return "IPv6"case 46:return "OSPF"default:return "UNKNOWN"/*解析 IP 數(shù)據(jù)包*/void ipparse(FILE * file,char *buffer)IP_HEADER ip = *(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYT

25、E version;getVersion(ip.Version,version);fprintf(file," 版本 =IPV%drn",version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file," 頭長度 =%d(BYTE)rn",headerLen);fprintf(file," 服務類型 =%s,%srn",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.Se

26、rviceType);fprintf(file," 數(shù)據(jù)報長度 =%d(BYTE)rn",ip.TotalLen);fprintf(file," 數(shù)據(jù)報 ID=%drn",ip.ID);/* DF 表示禁止分片標志,MF 表示分片標記*/BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file," 分段標志DF=%d,MF=%drn",DF,MF);WORD fragOff;getFragoff(ip.FragOff,fragOff);fprintf(file," 分段偏移值 =%dr

27、n",fragOff);fprintf(file," 生存期 =%d(hops)rn",ip.TimeToLive);fprintf(file," 協(xié)議 =%srn",getProtocol(ip.Protocol);fprintf(file," 頭校驗和 =0x%0xrn",ip.HdrChksum);fprintf(file," 源 IP 地址 =%srn",inet_ntoa(*(in_addr*)&ip.SrcAddr);fprintf(file," 目的 IP 地址 =%srn

28、",inet_ntoa(*(in_addr*)&ip.DstAddr);fprintf(file,"_rn");15成都信息工程學院/*程序入口*/int main(int argc,char *argv)/* cmd 參數(shù)*/if(argc!=2)printf("usage error!n");return -1;FILE *file;/* 以讀寫的方式建立一個文本文件logfile.txt */if(file=fopen(argv1,"w+")=NULL)printf("fail to open fil

29、e %s","logfile.txt");return -1;WSAData wsData;/* 啟動 2.2 版本的 Socket,并將 Socket 版本信息保存到wsData 中 */if(WSAStartup(MAKEWORD(2,2),&wsData)!=0)printf("WSA startup failed!n");return -1;fprintf(file,"Socket初始化 .rn");fprintf(file,"=rn");fprintf(file," 描述: %

30、srn",wsData.szDescription);fprintf(file," 狀態(tài): %srn",wsData.szSystemStatus);fprintf(file,"=rn");SOCKET sock;/* 創(chuàng)建原始套接字*/if(sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=INV ALID_SOCKET) printf("Can not create socket!n");return -1;BOOL flag=true;/* 設置 IP 頭操作選項*/if(setsock

31、opt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag)=SOCKET_E RROR)printf("setsockopt failed!n");return -1;char hostName128;/* 獲取本地主機名*/16成都信息工程學院if(gethostname(hostName,100)=SOCKET_ERROR)printf("gethostname failed!n");return -1;hostent *pHostIP;/* 根據(jù)主機名獲取主機信息*/if(pHostIP=gethostbyname(hostName)=NULL)printf("gethostbyname faile

溫馨提示

  • 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

提交評論