接收并解析IP分組資料_第1頁
接收并解析IP分組資料_第2頁
接收并解析IP分組資料_第3頁
接收并解析IP分組資料_第4頁
接收并解析IP分組資料_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 題目:接收并解析IP分組姓名: 學號: 班號: 時間:2016/10/23計算機學院時間:目 錄摘 要1 目的12 要求13相關知識14實現原理及流程圖錯誤!未定義書簽。5程序代碼96運行結果與分析97參考文獻15題目:接收并解析IP分組1、 目的IP分組是網絡層傳輸的基本單元,通過接收和解析IP分組,了解IP分組基本結構與IP協(xié)議基本功能2、要求(1)以命令行方式運行:DOSParseIP log_file;以命令方式顯示,并保存文件。 其中,ParseIP為程序名,log_file為文件名(2)輸出內容:IP分組首部每個字段,以及數據用ASCII碼顯示。(3)當程序收到輸入“CTRL+C

2、”時退出。3、相關知識 互聯(lián)網絡層是TCP/IP協(xié)議參考模型中的關鍵部分。IP協(xié)議把傳輸層送來的消息組裝成IP數據包,并把IP數據包傳遞給數據鏈路層。 IP協(xié)議的數據包格式如下: 1. IP數據報首部的固定部分中的各字段 版本:占4位,指IP協(xié)議的版本。通信雙方使用的IP協(xié)議版本必須一致。日前廣泛使用的 IP協(xié)議版本號為 4 (即 IPv4)。IPv6 目前還處于起步階段。 首部長度:占 4 位,可表示的最大十進制數值是 15。請注意,這個字段所表示數的單位是32位字 ( 1 個32位字長是4 字節(jié)),因此,當 IP 的首部長度為 1111 時 (即十進制的 15),首部長度就達到 60字節(jié)。

3、當 IP 分組的首部長度不是4字節(jié)的整數倍時,必須利用最后的填充字段加以填充。因此數據部分永遠在 4字節(jié)的整數倍開始,這樣在實現 IP協(xié)議時較為方便。首部長度限制為 60字節(jié)的缺點是有時可能不夠用。這樣做的目的是希望用戶盡量減少開銷。最常用的首部長度就是 20 字節(jié) (即首部長度為 0101),這時不使用任何選項。 服務:占 8 位,用來獲得更好的服務。這個字段在舊標準中叫做服務類型,但實際上一直沒有被使用過。1998年IETF把這個字段改名為區(qū)分服務 DS (DifferentiatedServices)。只有在使用區(qū)分服務時,這個字段才起作用。 總長度:總長度指首都及數據之和的長度,單位為

4、字節(jié)。因為總長度字段為 16位,所以數據報的最大長度為 216-1=65 535字節(jié)。 在IP層下面的每一種數據鏈路層都有自己的幀格式,其中包括幀格式中的數據字段的最大長度,即最大傳送單元 MTU (Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此數據報的總長度 (即首部加上數據部分)一定不能超過下面的數據鏈路層的MTU值。 標識 (Identification):占 16位。IP軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加 1,并將此值賦給標識字段。但這個“標識”并不是序號,因為 IP是無連接的服務,數據報不存在按序接收的問題。當數據報由于長度超

5、過網絡的 MTU 而必須分片時,這個標識字段的值就被復制到所有的數據報的標識字段中。相同的標識字段的值使分片后的各數據報片最后能正確地重裝成為原來的數據報。 標志 (Flag):占3 位,但目前只有2位有意義。 標志字段中的最低位記為 MF (More Fragment)。MF=1即表示后面“還有分片”的數據報。MF=0表示這已是若干數據報片中的最后一個。標志字段中間的一位記為 DF(Dont Fragment),意思是“不能分片”。只有當 DF=0時才允許分片。 片偏移:占 13位。較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對用戶數據字段的起點,該片從何處開始。片偏移以 8個

6、字節(jié)為偏移單位。這就是說,每個分片的長度一定是 8字節(jié) (64位)的整數倍。 生存時間:占 8位,生存時間字段常用的英文縮寫是TTL (Time To Live),其表明數據報在網絡中的壽命。由發(fā)出數據報的源點設置這個字段。其目的是防止無法交付的數據報無限制地在因特網中兜圍子,因而白白消耗網絡資源。最初的設計是以秒作為 TTL的單位。每經過一個路由器時,就把TTL減去數據報在路由器消耗掉的一段時間。若數據報在路由器消耗的時間小于 1 秒,就把TTL值減 1。當 TTL值為 0時,就丟棄這個數據報。 協(xié)議:占 8 位,協(xié)議字段指出此數據報攜帶的數據是使用何種協(xié)議,以便使目的主機的IP層知道應將數

7、據部分上交給哪個處理過程。 首部檢驗和:占 16位。這個字段只檢驗數據報的首部,但不包括數據部分。這是因為數據報每經過一個路由器,都要重新計算一下首都檢驗和 (一些字段,如生存時間、標志、片偏移等都可能發(fā)生變化)。不檢驗數據部分可減少計算的工作量。 源地址:占32位。 目的地址:占 32位。 2. IP數據報首部的可變部分 IP首都的可變部分就是一個可選字段。選項字段用來支持排錯、測量以及安全等措施,內容很豐富。此字段的長度可變,從 1 個字節(jié)到40個字節(jié)不等,取決于所選擇的項目。某些選項只需要 1 個字節(jié),它只包括 1 個字節(jié)的選項代碼。但還有些選項需要多個字節(jié),這些選項一個個拼接起來,中間

8、不需要有分隔符,最后用全0 的填充字段補齊成為 4字節(jié)的整數倍。 增加首都的可變部分是為了增加 IP 數據報的功能,但這同時也使得 IP 數據報的首部長度成為可變的。這就增加了每一個路由器處理數據報的開銷。實際上這些選項很少被使用。新的 IPv6就將 IP數據報的首部長度做成固定的。4、實現原理及流程圖實現原理:為了獲取網絡中的IP數據包,必須對網卡進行編程,在這里我們使用套接字(socket)進行編程。本程序主要由三部分構成:初始化原始套接字,反復監(jiān)聽捕獲數據包和解析數據包。1. 使用原始套接字/初始化Socket環(huán)境WSADATA wsData;if (WSAStartup(MAKEWOR

9、D(2, 2), &wsData) != 0)printf(WSAStartup failed!);return;/建立初始SocketSOCKET sock;if (sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP) = INVALID_SOCKET)printf(Create socket failed!);return;/設置IP頭部操作選項,flag設置為trueBOOL flag = true;if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag) = SOC

10、KET_ERROR)printf(Setsockopt failed!);return;/獲取本地主機名char hostName128;if (gethostname(hostName, 100) = SOCKET_ERROR)printf(Gethostname failed!);return;/獲取本地主機IP地址hostent* pHostIP;if (pHostIP = gethostbyname(hostName) = NULL)printf(Gethostbyname failed!);return;/填充SOCKADDR_IN結構sockaddr_in addr_in;addr

11、_in.sin_addr = *(in_addr*)pHostIP-h_addr_list0;addr_in.sin_family = AF_INET;addr_in.sin_port = htons(6000);/把原始Socket綁定到本地網卡if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in) = SOCKET_ERROR)printf(Bind failed!);return;/設置SOCK_RAW為SIO_RCVALL,接受所有的IP包DWORD dwValue = 1;DWORD dwBufferLen10;DWORD dwBuff

12、erInLen = 1;DWORD dwBytesReturned = 0;if (WSAIoctl(sock, IO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL) = SOCKET_ERROR)printf(Ioctlsocket failed!);return;2. 接收數據包/監(jiān)聽經過本機的IP包char bufferBUFFER_SIZE;printf(Listening on local host.n);wh

13、ile (true)int size = recv(sock, buffer, BUFFER_SIZE, 0);if (size 0)ipparse(stdout, buffer);ipparse(file, buffer);fclose(file);return;3. 定義IP頭部的數據結構/定義IP首部數據結構typedef struct _IP_HEADERunionBYTE Version;/版本號(前4比特位)BYTE HdrLen; /IP首部長度(后4比特位);BYTE ServiceType;/服務類型WORD TotalLen; /總長度WORD ID; /標識unionWO

14、RD Flags; /標志(前3比特位)WORD FragOff; /分片偏移(后13比特位);BYTE TimeToLive; /生命期BYTE Protocol; /協(xié)議類型WORD HdrChksum; /16比特位校驗和DWORD SrcAddr; /32位比特源IP地址DWORD DstAddr; /32位比特目的IP地址BYTE Options; /選項IP_HEADER;4. IP包的解析/解析IP包的版本信息void getVersion(BYTE b, BYTE &version)version = b 4;/解析IP包的頭部長度void getIHL(BYTE b, BYT

15、E &length)length = (b&0x0f) * 4;/解析IP包的服務類型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;case 4:return Flash Override;break;case 3:return Flash;break;case 2:return Immediate;break;c

16、ase 1:return Priority;break;case 0:return Routine;break;default:return Unknown;/解析IP包的服務級別char* parseServiceType_getTOS(BYTE b)b = (b 1) & 0x0f;switch (b)case 0:return Normal service;break;case 1:return Minimize monetary cost;break;case 2:return Maximize reliability;break;case 4:return Maximize thro

17、ughput;break;case 8:return Minimize delay;break;case 15:return Maximize security;break;default:return Unknown;/解析IP包的標志位void getFlags(WORD w, BYTE &DF, BYTE &MF)DF = (w 14) & 0x01;MF = (w 13) & 0x01;/解析IP包的分段偏移void getFragOff(WORD w, WORD &fragOff)fragOff = w & 0x1fff;/解析IP包的協(xié)議類型char* getProtocol(BYTE Protocol)switch (Protocol)case 1:return ICMP;case 2:return IGMP;case 4:return IP in IP;case 6:return TCP;case 8:return TCP;case 17:return EGP;case 41:return UDP;case 46:return RSV

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論