




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課設名稱:IP數據包解析班 級:學 號:姓 名:指導老師:目錄 TOC o 1-3 h z u HYPERLINK l _Toc327820939 1.課程設計目的 PAGEREF _Toc327820939 h 1 HYPERLINK l _Toc327820940 2.課程設計要求 PAGEREF _Toc327820940 h 1 HYPERLINK l _Toc327820941 3.程序設計分析 PAGEREF _Toc327820941 h 1 HYPERLINK l _Toc327820942 3.1 網卡設置 PAGEREF _Toc327820942 h 1 HYPERLIN
2、K l _Toc327820943 3.2 使用套接字 PAGEREF _Toc327820943 h 2 HYPERLINK l _Toc327820944 3.2.2 接收數據包 PAGEREF _Toc327820944 h 2 HYPERLINK l _Toc327820945 3.3 定義IP頭部的數據結構 PAGEREF _Toc327820945 h 3 HYPERLINK l _Toc327820946 3.4 IP包的解析 PAGEREF _Toc327820946 h 3 HYPERLINK l _Toc327820947 3.5 協議的定義 PAGEREF _Toc327
3、820947 h 4 HYPERLINK l _Toc327820948 3.6捕獲處理 PAGEREF _Toc327820948 h 4 HYPERLINK l _Toc327820949 4.運行結果 PAGEREF _Toc327820949 h 5 HYPERLINK l _Toc327820951 5.總結 PAGEREF _Toc327820951 h 5 HYPERLINK l _Toc327820953 6.源程序代碼 PAGEREF _Toc327820953 h 61.課程設計目的 本課程設計的目的就是設計一個捕獲并解析IP數據包的程序,并根據這個程序,說明IP數據包的結
4、構及IP協議的相關問題,從而對IP層的工作原理有更好的理解和認識。2.課程設計要求 本設計的目標是捕獲網絡中的IP數據包,解析數據包的內容,將結果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下:1)以命令行形式運行:ipparse logfile,其中ipparse是程序名, 而logfile則代表記錄結果的日志文件。 2)在標準輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服務類型、數據包總長度、數據包標識、分段標志、分段偏移值、生存時間、上層協議類型、頭校驗和、源IP地址和目的IP地址等內容。3)當程序接收到鍵盤輸入Ctrl+C時退出3.程序設計分析3.1 網卡設置 為了獲取網
5、絡中的IP數據包,必須對網卡進行編程,在這里使用套接字(socket)進行編程。但是,在通常情況下,網絡通信的套接字程序只能響應與自己硬件地址相匹配的數據包或是以廣播形式發出的數據包。對于其他形式的數據包,如已到達網絡接口,但卻不是發送到此地址的數據包,網絡接口在騅投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關的數據包。我們要想獲取網絡設備的所有數據包,就是需要將網卡設置為混雜模式。3.2 使用套接字 套接字分為三種,即流套接字(Stream socket)、數據報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進行IP層數據包的接收和
6、發送,應使用原始套接字。創建原始套接字的代碼如下: Socket sock: Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped):本設計不用考慮超時情況。創建套接后,IP頭就會包含在接收數據包中。然后,我可以設置IP頭操作選項,調用setsockopt函數。其中flag設置為true,并設定IP-HDRINCL選項,表明用戶可以親自對IP頭進行處理。最后使用bind()函數將socket綁定到本地網卡上。綁定網卡后,需用WSAIoctl()函數把網卡設置為混雜模式,使網卡能夠接收所有的網絡數據。如果接收的
7、數據包中的協議類型和定義的原始套接字匹配,那么接收的數據就拷貝到套接字中,因此,網卡就可以接收所有經過的IP包。3.2.2 接收數據包 在程序中可使用recv()函數接收經過的IP包。該函數有四個參數,第一個參數接收操作所用的套接字描述符;第二個參數接收緩沖區的地址;第三個參數接收緩沖區的大小,也就是所要接收的字節數;第四個參數是一個附加標志,如果對所發送的數據沒特殊要求,直接設為0。因為IP數據包的最大長度是65535B,因此緩沖區的大小不能小于65535B。設置緩沖區后,可利用循環來反復監聽接收IP包,用recv()函數實現接收功能。3.3 定義IP頭部的數據結構程序需要定義一個數據結構表
8、示IP頭部。其代碼如下:struct IP_HEADERunsigned short ip_version, /*IP的版本號 */ip_hdr_len; /*IP包頭的長度*/ip_tos; /*IP包的服務類型*/ip_total_len; /*IP包的總長度*/ip_id; /*IP包的分段標識*/ip_flags; /*IP包的分段標志*/ip_frag_offset; /*IP包的分段偏移*/ip_ttl; /*IP包的生存時間*/ip_proto; /*IP包的高層協議*/ip_hdr_chksum; /*IP包的校驗和*/struct IPADDRESS ip_src_addr;
9、 /*IP包的源IP地址*/ip_dest_addr; /*IP包的目的IP地址*/ipheader;3.4 IP包的解析 解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。3.5 協議的定義(包含相應的頭文件#include #include):DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/dwProtocol=IPPROTO_IP; /*協議類型為IP*/3.6捕獲處理1.加載 Win
10、sock;2.創建一個接收原始IP包的socket連接;3.綁定到一個接口;4.進行WSAIoctl設置,接收所有的IP數據包。代碼如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),NULL, 0, &dwBytesRet, NULL, NULL) = SOCKET_ERROR)5.接著設定一個線程進行捕獲:(1)創建一個接收IP包的鏈表頭;(2)設置一個標識,為真,則不斷進行IP包的捕獲;(3)建立一個新的結點,將捕獲的數據包加入到該結點;(4)如果鏈表的長度達到指定的長度,創建一個線程對該鏈表的IP包進行解析;再設置一個
11、在IP數據包鏈表不足給定的長度,而又中止IP捕獲時,對鏈表的處理;(5)為下一個IP包鏈表創建一個鏈表頭。6.建立一個進行IP包解析并顯示的線程,進行解析IP數據包,然后顯示IP數據包。4.運行結果截獲IP數據包程序運行結果如下:5.總結 在本次課程設計中,通過多次上機的實踐,充分利用所學的計算機網絡以及socket編程與C語言編程的知識,并上網搜索一部分相當資料,粗略設計出該程序。 通過本次課程設計,充分運用了所學的計算機網絡知識,設計出了如何解析IP數據包,從而更加深刻的了解到了IP數據包的結構及IP協議的相關問題,從而對IP層的工作原理有更好的理解和認識。 在課程設計的過程也碰到的不少問
12、題。例如:對IP數據包的結構不了解、IP層工作原理也不熟悉、C語言編程基礎差等一系列問題。讓我認識到了自己的很大不足,在以后的學習過程中還將努力提高。6.源程序代碼#include winsock2.h#include ws2tcpip.h#include iostream.h#include stdio.h#pragma comment(lib, ws2_32.lib)#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535/* 定義IP頭部數據結構 */typedef struct _IP_HEADERunionBYT
13、E Version; /版本(前4位)BYTE HdrLen; /報頭標長(后四位),IP頭長度;BYTE ServiceType; /服務類型WORD TotalLen; /總長度WORD ID; /標識unionWORD Flags;WORD FragOff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER;/逐位解析IP頭中的信息,獲取版本號void getVersion(BYTE b,BYTE &version)version = b4;void
14、 getIHL(BYTE b,BYTE &result)result = (b & 0 x0f) *4;/解析服務類型char * parseServiceType_getProcedence(BYTE b)switch(b5)case 7:return Network Control;case 6:return Internet work Control;case 5:return CRITIC/ECP;case 4:return Flash Override;case 3:return Falsh;case 2:return Immediate;case 1:return Priority
15、;case 0:return Routine;default:return Unknown;char * parseServiceType_getTOS(BYTE b)b=(b1)&0 x0f;switch(b)case 0:return Normal service; case 1:return Minimize monetary cost;case 2:return Maximize reliability;case 4:return Maximize throughput;case 8:return Minimize delay;case 15:return Maximize secur
16、ity;default:return Unknown;/* 獲取禁止分片標志和分片標志 */void getFlags(WORD w,BYTE &DF, BYTE &MF)DF=(w14)&0 x01;MF=(w13)&0 x01;/* 獲取分片偏移量 */void getFragoff(WORD w,WORD &fragoff)fragoff=w&0 x1ffff;/獲取協議char * getProtocol(BYTE Protocol)switch (Protocol)case 1: return ICMP;case 2:return IGMP;case 3:return GGP;cas
17、e 4:return IP in IP ;case 6:return TCP;case 8:return EGP;case 17:return UDP;case 41:return IPv6;case 46:return OSPF;default:return UNKNOWN;/* 解析IP數據包 */void ipparse(FILE * file,char *buffer)IP_HEADER ip = *(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf
18、(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.ServiceType);fprintf(file,數據報長度=%d(BYTE)rn,ip.TotalLen);fprintf(file,數據報ID=%drn,ip.ID);/* DF
19、表示禁止分片標志,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,分段偏移值=%drn,fragOff);fprintf(file,生存期=%d(hops)rn,ip.TimeToLive);fprintf(file,協議=%srn,getProtocol(ip.Protocol);fprintf(file,頭校驗和=0 x%0 xrn,ip.HdrChksu
20、m);fprintf(file,源IP地址=%srn,inet_ntoa(*(in_addr*)&ip.SrcAddr);fprintf(file,目的IP地址=%srn,inet_ntoa(*(in_addr*)&ip.DstAddr);fprintf(file,_rn);/* 程序入口 */int main(int argc,char *argv)/* cmd參數 */if(argc!=2)printf(usage error!n);return -1;FILE *file;/* 以讀寫的方式建立一個文本文件logfile.txt */if(file=fopen(argv1,w+)=NUL
21、L)printf(fail to open file %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,描述:%srn,wsData.szDescription);fprintf(file,狀態:%srn,w
22、sData.szSystemStatus);fprintf(file,=rn);SOCKET sock;/* 創建原始套接字 */if(sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=INVALID_SOCKET)printf(Can not create socket!n);return -1;BOOL flag=true;/* 設置IP頭操作選項 */if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag)=SOCKET_ERROR)printf(setsockopt failed
23、!n);return -1;char hostName128;/* 獲取本地主機名 */if(gethostname(hostName,100)=SOCKET_ERROR)printf(gethostname failed!n);return -1;hostent *pHostIP;/* 根據主機名獲取主機信息 */if(pHostIP=gethostbyname(hostName)=NULL)printf(gethostbyname failed!n);return -1;printf(Hostname: %srn,pHostIP-h_name);printf(IPAddress: %srn,inet_ntoa(*(struct in_addr *)pHostIP-h_addr);/* 封裝IP地址信息 */sockad
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北京市事業單位招聘考試教師招聘考試小學數學案例分析試卷
- 2025年互聯網婚戀項目規劃申請報告
- 一件心愛物品的誕生記物作文(14篇)
- 2025年高處作業特種作業操作證考試試卷(高空作業安全操作培訓課程實施要點篇)
- 生物制藥工藝與質量控制試題集及解析
- 2025年生態循環農業技術模式在農業科技創新與產業融合報告
- 現代農業科技開發與利用協議
- 基因檢測技術在遺傳性血液疾病診斷中的準確性研究報告001
- 醫療健康行業從業資格證明(5篇)
- 電商平臺入駐商戶協議條款修訂版
- AI智能在小學音樂課堂中的應用研究
- 智能制造全過程造價咨詢服務方案
- UL489標準中文版-2019斷路器UL標準中文版
- 新能源汽車技術 SL03維修手冊(第4章)-電氣-4.2.2~4.2.12電器集成
- 《安全生產培訓機構基本條件AQ 8011-2023》知識培訓
- 《鍛造技術培訓》課件
- 《冷干機原理及維修》課件
- 醫藥產品經理職業規劃
- 汽車保險與理賠課件 8.2汽車水災事故的預防與施救
- 采購磁鐵物料合同模板
- 2024年重新寫撫養協議書模板
評論
0/150
提交評論