版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 課 程 設(shè) 計(jì) 課程名稱 計(jì)算機(jī)網(wǎng)絡(luò) 題目名稱 解析IP數(shù)據(jù)包 學(xué) 院 計(jì)算機(jī)學(xué)院 專業(yè)班級 軟件工程一班 學(xué) 號 學(xué)生姓名 指導(dǎo)教師 2012年4月 3日目錄一、概述4二、課程設(shè)計(jì)要求4三、預(yù)備知識4四、需求分析6五、可行性分析7六、設(shè)計(jì)基本思路7七、方案設(shè)計(jì)8八、程序代碼9九、調(diào)試程序12十、總結(jié)體會14十一、參考資料14一、概述本課程設(shè)計(jì)是結(jié)合計(jì)算機(jī)網(wǎng)絡(luò)課程的教學(xué)目標(biāo),幫助學(xué)生深入理解網(wǎng)絡(luò)的基本工作原理和協(xié)議的設(shè)計(jì)思想,掌握處理網(wǎng)絡(luò)問題的基本方法。要求學(xué)生獨(dú)立完成設(shè)計(jì)題目,培養(yǎng)學(xué)生接受新知識和繼續(xù)學(xué)習(xí)的能力,提高計(jì)算機(jī)網(wǎng)絡(luò)方面的實(shí)踐能力和加深計(jì)算機(jī)網(wǎng)絡(luò)理論知識的理解。1、培養(yǎng)學(xué)生正確的
2、設(shè)計(jì)思想,理論聯(lián)系實(shí)際的工作作風(fēng),嚴(yán)肅認(rèn)真、實(shí)事求是的科學(xué)態(tài)度和勇于探索的創(chuàng)新精神。2、引導(dǎo)學(xué)生將書本上抽象的概念和具體實(shí)現(xiàn)技術(shù)結(jié)合起來,使學(xué)習(xí)深化;鞏固和加深計(jì)算機(jī)網(wǎng)絡(luò)課程中所學(xué)的理論知識和實(shí)際應(yīng)用能力,培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)計(jì)算機(jī)知識,分析和解決工程技術(shù)問題的能力。3、消除學(xué)生對計(jì)算機(jī)網(wǎng)絡(luò)理論知識的神秘感,調(diào)動學(xué)生學(xué)習(xí)的積極性與主動性,進(jìn)而鍛煉解決實(shí)際問題的能力。通過課程設(shè)計(jì)訓(xùn)練,基本掌握分析問題,軟件總體結(jié)構(gòu)設(shè)計(jì),用戶界面的設(shè)計(jì),程序代碼編寫等各方面的基本技能和技巧。4、培養(yǎng)團(tuán)體協(xié)作精神,獲得初步的網(wǎng)絡(luò)編程應(yīng)用經(jīng)驗(yàn),為以后從事生產(chǎn)和科研工作打下一定的基礎(chǔ).二、課程設(shè)計(jì)要求設(shè)計(jì)一個解析IP數(shù)
3、據(jù)包的程序。 捕獲網(wǎng)絡(luò)中數(shù)據(jù)包,并解析數(shù)據(jù)包的內(nèi)容,加強(qiáng)對IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題的理解,從而對IP層的工作原理有一個更為專業(yè)的了解和認(rèn)識。三、預(yù)備知識互聯(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é)議的版本.目前的版
4、本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數(shù)據(jù)包的解析.報(bào)頭標(biāo)長字段為4位,它定義了以4B為一個單位的IP包的報(bào)文長度.報(bào)頭中除了選項(xiàng)字段和填充域字段外,其他各字段是定長的.因此,IP數(shù)據(jù)包的頭長度在2040B之間,是可變的.0 4 8 16 19 24 31版本報(bào)頭標(biāo)長服務(wù)類型總長度標(biāo)識標(biāo)志片偏移生存時(shí)間協(xié)議頭校驗(yàn)和源IP地址目的IP地址選項(xiàng)填充域數(shù)據(jù)部分圖1 IP數(shù)據(jù)包的格式服務(wù)類型字段共8位,用于指示路由器如何處理該數(shù)據(jù)包.該字段長度由4位服務(wù)類型(TOS)子域和3位優(yōu)先級子域組成,1位為保留位,該字段結(jié)構(gòu)如圖2所示.B7 b6
5、b5 b4 b3 b2 b1 b0優(yōu)先級DTRC0圖2 服務(wù)類型字段結(jié)構(gòu)優(yōu)先級共有8種,優(yōu)先級越高表明數(shù)據(jù)包越重要.表1中列出了各種優(yōu)先級所代表的意義.表一 優(yōu)先子域的說明位數(shù)(b7b6b5) 意義網(wǎng)絡(luò)控制網(wǎng)絡(luò)間控制重要(CRITIC/ECP)即時(shí),優(yōu)先011 即時(shí)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,它定義了
6、以字節(jié)為單位的數(shù)據(jù)包的總長度.IP數(shù)據(jù)包的最大長度為65535B.標(biāo)識字段的長度為16位,用于識別IP數(shù)據(jù)包的編號.每批數(shù)據(jù)都要有一個標(biāo)識值,用于讓目的主機(jī)判斷新來的數(shù)據(jù)屬于哪個分組.報(bào)頭中的標(biāo)志字段如圖7-3所示.標(biāo)志字段共3位,最高位是0.禁止分片標(biāo)志DF(do not fragment)字段的值若為1,表示不能對數(shù)據(jù)包分片;若DF值為0,則表明可以分片.分片標(biāo)志MF(more fragment)的值為1,表示接收到的不是最后一個分片;若MF值為0,表示接收到的是最后一個分片.片偏移字段共13位,說明分片在整個數(shù)據(jù)包中的相對位置.片偏移值是以8B為單位來記數(shù)的,因此選擇的分片長度應(yīng)該是8B
7、的整數(shù)倍.生存時(shí)間(TTL)字段為8位,用來設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過程的壽命,通常是用一個數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.協(xié)議字段為8位,表示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號如表7-3所示.序號協(xié)議名稱序號協(xié)議名稱12468ICMPIGMPIP inIPTCPEGP17414689UDPIPV6RSVPOSPFA表7-3 典型的協(xié)議號頭校驗(yàn)和字段為16位,用于存放檢查報(bào)頭錯誤的校驗(yàn)碼。檢驗(yàn)的范圍是整個IP包的報(bào)頭。校驗(yàn)和按如下方法計(jì)算:1)將頭校驗(yàn)和的字段置為0。2)將報(bào)頭部分的所有數(shù)據(jù)以16位為單位進(jìn)行累加,累加方式是求異或。3)將累加的結(jié)果取反碼,就是頭校驗(yàn)和。
8、 當(dāng)收到一個IP包時(shí),要檢查報(bào)頭是否出錯,就把報(bào)頭中的所有數(shù)據(jù)以16位為單位進(jìn)行累加,若累加的結(jié)果為0,則報(bào)文沒有出錯。 地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機(jī)和目的主機(jī)的IP地址。 選項(xiàng)字段的長度范圍為040B,主要用于控制和測試。在使用選項(xiàng)字段的過程中,有可能出現(xiàn)報(bào)頭部分的長度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過填充位來湊齊。四、需求分析在傳輸路徑中,路由器通常連接多個網(wǎng)絡(luò)。不同的網(wǎng)絡(luò)的數(shù)據(jù)鏈路層最大傳輸單元的長度可能不同,因此路由器在接受到數(shù)據(jù)包,并準(zhǔn)備要轉(zhuǎn)發(fā)到目的主機(jī)時(shí),它必須首先決定要使用哪一個接口網(wǎng)絡(luò),要決定該網(wǎng)
9、絡(luò)的數(shù)據(jù)鏈路層最大傳輸單元是否允許該數(shù)據(jù)包通過。根據(jù)數(shù)據(jù)包長度來確定是否需要對數(shù)據(jù)包進(jìn)行分片。如果數(shù)據(jù)包來自一個能夠通過較大數(shù)據(jù)包的局域網(wǎng),又要通過另一個只能通過較小的數(shù)據(jù)包的局域網(wǎng),那么就必須對IP數(shù)據(jù)包進(jìn)行分片。在IP數(shù)據(jù)包分片時(shí),首先要確定片長度。然后將原始IP數(shù)據(jù)包包括報(bào)頭分成第1個片。如果剩下的數(shù)據(jù)仍然超過長度,那么需要進(jìn)行第2個分片數(shù)據(jù)加上原來的報(bào)頭,構(gòu)成第2個片。這樣一直分割到剩下的數(shù)據(jù)小于片長度為止。五、可行性分析(1)經(jīng)濟(jì)可行性適用本計(jì)算機(jī)安全系統(tǒng)可提高計(jì)算機(jī)通信流量分析和管理水平,把大量繁瑣工作簡單化,能夠有效地節(jié)省人力物力,并能夠準(zhǔn)確地進(jìn)行統(tǒng)計(jì)和計(jì)算,避免人工統(tǒng)計(jì)或計(jì)算所
10、帶來的差錯,保證計(jì)算機(jī)通信管理高效而有序地進(jìn)行。(2)技術(shù)可行性本系統(tǒng)前臺采用Microsoft公司的Visual C+6.0作為主要開發(fā)工具;該系統(tǒng)在安全、準(zhǔn)確性和運(yùn)行速度方面都有一定優(yōu)勢。六、設(shè)計(jì)基本思路IP數(shù)據(jù)報(bào)的格式說明IP協(xié)議都具有什么功能。其首部,版本目前廣泛使用的版本號為4;首部長度站4bit;服務(wù)類型占8bit,其中服務(wù)類型TOS子域占4位,優(yōu)先級子域占3位,另一位為保留位;總長度字段為2B,IP數(shù)據(jù)包的最大長度是65535B;標(biāo)識占16bit,它是一個計(jì)數(shù)器,用來產(chǎn)生數(shù)據(jù)報(bào)的標(biāo)識;標(biāo)志占3bit,其中最低為為MF,MF=1時(shí)為后面“還有分片”,MF=0表示這是數(shù)據(jù)報(bào)片中的最后
11、一個,DF=0時(shí),表示允許分片;片偏移以8個字節(jié)為偏移單位;生存時(shí)間字段記為TTL,單位為秒;協(xié)議段占8bit,用于指出次數(shù)據(jù)是使用何種協(xié)議,典型的協(xié)議號有6:TCP,17:UDP,1:ICMP。本程序使用套接字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ū)字段和套接字的類型。WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBuffer
12、InLen)函數(shù)用來把網(wǎng)卡設(shè)置為混雜模式。recv(sock,buffer,65535,0)函數(shù)用來接收經(jīng)過的IP包,其參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)的大小。typedef struct IP_HEADip_head;用來定義IP頭部數(shù)據(jù)。setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)函數(shù)用來獲取本機(jī)IP地址htons()函數(shù)將無符號短整型轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序的數(shù)據(jù)本程序在windows環(huán)境下利用C+語言編寫。七、方案設(shè)計(jì)程序流程框圖: 生成輸出文件創(chuàng)建原始套接字捕獲IP數(shù)據(jù)包解析IP數(shù)據(jù)包結(jié)束開始八、程序代碼#include<i
13、ostream> #include<winsock2.h> #include<ws2tcpip.h> #include<fstream>#include <windows.h> #pragma comment(lib,"ws2_32") /指定連接到網(wǎng)絡(luò)應(yīng)用和internet#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) typedef struct IP_HEAD union /定義聯(lián)合 unsigned char Version; unsigned char HeadLen; ; un
14、signed char ServiceType; unsigned short TotalLen; unsigned short Identifier; union unsigned 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
15、頭部的數(shù)據(jù)結(jié)構(gòu)void main(int argc,char *argv) using namespace std; ofstream outfile("C:logfile.txt",ios:out);if(argc!=2) cout<<endl<<"請以下格式輸入命令行:PackParse packet_sum"<<endl; return; WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0) cout<<endl<<
16、"WSASTartup初始化失敗"<<endl; return; SOCKET sock=socket(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
17、,(char *) &flag,sizeof(flag)=SOCKET_ERROR) cout<<endl<<"setsockopt操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); WSACleanup(); char hostName128;/獲取主機(jī)名 if(gethostname(hostName,100)=SOCKET_ERROR) cout<<endl<<"gethostname操作失敗:"<<WSA
18、GetLastError()<<endl; closesocket(sock); WSACleanup(); hostent *pHostIP; /獲取本地IPif(pHostIP=gethostbyname(hostName)=NULL) cout<<endl<<"gethostbyname操作失敗:"<<WSAGetLastError()<<endl; closesocket(sock); WSACleanup(); sockaddr_in host_addr;/ host_addr.sin_family=AF
19、_INET; host_addr.sin_port=htons(6000); host_addr.sin_addr=*(in_addr *)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 dwBuf
20、ferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen) , &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR) cout<<endl<<"WSAIoctl操作失敗:"<<WSAGetLastError()<<en
21、dl; closesocket(sock); /將網(wǎng)卡設(shè)為混雜模式,以接受所有數(shù)據(jù)WSACleanup(); cout<<endl<<"開始解析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ū)大小,附加標(biāo)志 ip_head ip=*(ip_head *)buffer; c
22、out<<"-"<<endl; cout<<"版本:"<<(ip.Version>>4)<<endl; /獲取頭部長度字段cout<<"頭部長度:"<<(ip.HeadLen &0x0f)*4)<<endl; /獲取頭部長度字段cout<服務(wù)類型:Priority"<<(ip.ServiceType>>5)<<", Service"<<(
23、ip.ServiceType>>1)&0x0f)<<endl; /優(yōu)先級子域和TOS子域cout<<"總長度:"<<ip.TotalLen<<endl;/獲取總長度字段 cout<<"標(biāo)識符:"<<ip.Identifier<<endl;/獲取標(biāo)識字段 cout<<"標(biāo)志位:"<<(ip.Flags>>15)&0x01)<<",DF= "<<(i
24、p.Flags>>14)&0x01)<<",Mf="<<(ip.Flags>>13)&0x01)<<endl; /獲得標(biāo)志字段cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; /獲取分段偏移字段cout<<"生存周期:"<<(int)ip.TimeToLive<<endl; /獲取生存時(shí)間字段cout<<"協(xié)議:Proto
25、col"<<(int)ip.Protocol<<endl; /獲取協(xié)議字段cout<<"頭部校驗(yàn)和:"<<ip.HeadChecksum<<endl; /獲取頭校驗(yàn)和字段cout<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr)<<endl; /獲取源IP地址字段cout<<"目的IP地址:"<<inet_ntoa(*(in_addr *)&ip.
26、DestinAddr)<<endl; /獲取目的IP地址字段outfile<<"-"<<endl; outfile<<"版本:"<<(ip.Version>>4)<<endl; outfile<<"頭部長度:"<<(ip.HeadLen &0x0f)*4)<<endl; outfile<<"服務(wù)類型:Priority"<<(ip.ServiceType>>
27、;5)<<", Service"<<(ip.ServiceType>>1)&0x0f)<<endl; outfile<<"總長度:"<<ip.TotalLen<<endl; outfile<<"標(biāo)識符:"<<ip.Identifier<<endl; outfile<<"標(biāo)志位:"<<(ip.Flags>>15)&0x01)<<&quo
28、t;,DF= "<<(ip.Flags>>14)&0x01)<<",Mf="<<(ip.Flags>>13)&0x01)<<endl; outfile<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl; outfile<<"生存周期:"<<(int)ip.TimeToLive<<endl; outfile<<"協(xié)議:Protocol"<<(int)ip.Protocol<<endl; outfile<<"頭部校驗(yàn)和:"<<ip.HeadChecksum<<endl; outfile<<"原地址:"<<inet_ntoa(*(in_addr *)&ip.SourceAddr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《傳感器與檢測技術(shù)》練習(xí)題集
- 【初中物理】光的折射單元測試(培優(yōu)卷)2024-2025學(xué)年蘇科版物理八年級上冊
- 2023年標(biāo)準(zhǔn)員之基礎(chǔ)知識練習(xí)題(二)及答案
- 唐山-PEP-2024年11版小學(xué)三年級英語第1單元真題
- 2024年07版小學(xué)5年級上冊英語第二單元期末試卷
- 收納箱生產(chǎn)企業(yè)的賬務(wù)處理-記賬實(shí)操
- 中建信息化管理手冊
- 強(qiáng)化研究-團(tuán)結(jié)協(xié)作-共創(chuàng)佳績
- 經(jīng)濟(jì)數(shù)學(xué) 課件 ch01 函數(shù)、極限及其應(yīng)用
- 2024年高考語文二輪復(fù)習(xí):語言的表達(dá)效果類新題型(練習(xí))(解析版)
- 大學(xué)生職業(yè)規(guī)劃-教師職業(yè)規(guī)劃書范文
- 三國演義第三回讀后感100字 三國演義第三回讀后感1000字以上(三篇)
- 雙陽區(qū)巡游出租汽車駕駛員從業(yè)資格考試區(qū)域科目考試題庫
- 口腔修復(fù)學(xué)名解及案例分析題
- 制糖工藝基礎(chǔ)知識及煮糖技術(shù)(上課)
- 企業(yè)法人委托書模板
- FZ/T 64078-2019熔噴法非織造布
- 高三英語一輪復(fù)習(xí)讀后續(xù)寫導(dǎo)學(xué)案
- 如何看懂體檢報(bào)告
- 《民航英語口語》課程標(biāo)準(zhǔn)
- 2023年陜西投資集團(tuán)有限公司校園招聘筆試題庫及答案解析
評論
0/150
提交評論