計(jì)算機(jī)網(wǎng)絡(luò)課程論文_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)課程論文_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)課程論文_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)課程論文_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)課程論文_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、青 島 農(nóng) 業(yè) 大 學(xué)理學(xué)與信息科學(xué)學(xué)院計(jì)算機(jī)網(wǎng)絡(luò)綜合設(shè)計(jì)報(bào)告論 文 題 目 IP數(shù)據(jù)報(bào)解析 學(xué)生專業(yè)班級(jí) * * 學(xué)生姓名(學(xué)號(hào)) 指 導(dǎo) 教 師 王燕 完 成 時(shí) 間 2012年12月20日 實(shí) 習(xí)(設(shè)計(jì))地點(diǎn) 信息樓機(jī)房 2012 年 12 月 20 日一、實(shí)習(xí)題目編寫計(jì)算機(jī)程序,從IP數(shù)據(jù)報(bào)中解析源地址和目的地址,判斷其地址是否合法,如果合法將它們以點(diǎn)分十進(jìn)制表示輸出并給出其子網(wǎng)號(hào)及數(shù)據(jù)報(bào)中的協(xié)議名稱。二、原理概述IP地址就是給每個(gè)連接在Internet上的主機(jī)分配的一個(gè)32bit地址。按照TCP/IP協(xié)議規(guī)定,IP地址用二進(jìn)制來表示,每個(gè)IP地址長32bit,比特?fù)Q算成字節(jié),就是4個(gè)

2、字節(jié)。例如一個(gè)采用二進(jìn)制形式的IP地址是“00001010000000000000000000000001”,這么長的地址,人們處理起來也太費(fèi)勁了。為了方便人們的使用,IP地址經(jīng)常被寫成十進(jìn)制的形式,中間使用符號(hào)“.”分開不同的字節(jié)。于是,上面的IP地址可以表示為“”。將IP地址分成了網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩部分,設(shè)計(jì)者就必須決定每部分包含多少位。網(wǎng)絡(luò)號(hào)的位數(shù)直接決定了可以分配的網(wǎng)絡(luò)數(shù)(計(jì)算方法2網(wǎng)絡(luò)號(hào)位數(shù));主機(jī)號(hào)的位數(shù)則決定了網(wǎng)絡(luò)中最大的主機(jī)數(shù)(計(jì)算方法2主機(jī)號(hào)位數(shù)-2)。IP地址的長度為32位,用點(diǎn)分十進(jìn)制表示,格式為x.x.x.x,每個(gè)x表示8位,每個(gè)x的值為0255。根據(jù)不同

3、的取值范圍,IP地址可以分為五類,IP地址中的前五位用于標(biāo)識(shí)IP地址的類別,具體的分類規(guī)則如下:一個(gè)A類IP地址是指, 在IP地址的四段號(hào)碼中,第一段號(hào)碼為網(wǎng)絡(luò)號(hào)碼,剩下的三段號(hào)碼為本地計(jì)算機(jī)的號(hào)碼。如果用二進(jìn)制表示IP地址的話,A類IP地址就由1字節(jié)的網(wǎng)絡(luò)地址和3字節(jié)主機(jī)地址組成,網(wǎng)絡(luò)地址的最高位必須是“0”。A類IP地址中網(wǎng)絡(luò)的標(biāo)識(shí)長度為7位,主機(jī)標(biāo)識(shí)的長度為24位,A類網(wǎng)絡(luò)地址數(shù)量較少,可以用于主機(jī)數(shù)達(dá)1600多萬臺(tái)的大型網(wǎng)絡(luò)。A類IP地址 地址范圍-54。 一個(gè)B類IP地址是指,在IP地址的四段號(hào)碼中,前兩段號(hào)碼為網(wǎng)絡(luò)號(hào)碼,。如果用二進(jìn)制表示IP

4、地址的話,B類IP地址就由2字節(jié)的網(wǎng)絡(luò)地址和2字節(jié)主機(jī)地址組成,網(wǎng)絡(luò)地址的最高位必須是“10”。B類IP地址中網(wǎng)絡(luò)的標(biāo)識(shí)長度為14位,主機(jī)標(biāo)識(shí)的長度為16位,B類網(wǎng)絡(luò)地址適用于中等規(guī)模的網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)所能容納的計(jì)算機(jī)數(shù)為6萬多臺(tái)。B類IP地址地址范圍-54。一個(gè)C類IP地址是指,在IP地址的四段號(hào)碼中,前三段號(hào)碼為網(wǎng)絡(luò)號(hào)碼,剩下的一段號(hào)碼為本地計(jì)算機(jī)的號(hào)碼。如果用二進(jìn)制表示IP地址的話,C類IP地址就由3字節(jié)的網(wǎng)絡(luò)地址和1字節(jié)主機(jī)地址組成,網(wǎng)絡(luò)地址的最高位必須是“110”。C類IP地址中網(wǎng)絡(luò)的標(biāo)識(shí)長度為21位,主機(jī)標(biāo)識(shí)的長度為8位,C類網(wǎng)絡(luò)地址數(shù)量較

5、多,適用于小規(guī)模的局域網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)最多只能包含254臺(tái)計(jì)算機(jī)。C類IP地址范圍-54。D類地址(前4位是1110)用于多播(一對(duì)多通信)。E類地址(前4位是1111)保留為以后用。五類IP地址的結(jié)構(gòu)如下所示:0網(wǎng)絡(luò)號(hào)(7位)主機(jī)號(hào)(24位)10網(wǎng)絡(luò)號(hào)(14位)主機(jī)號(hào)(16位)110網(wǎng)絡(luò)號(hào)(21位)主機(jī)號(hào)(8位)1110組播地址(28)11110保留用于課程設(shè)計(jì)和將來使用子網(wǎng)劃分定義:Internet組織機(jī)構(gòu)定義了五種IP地址,有A、B、C三類地址。A類網(wǎng)絡(luò)有126個(gè),每個(gè)A類網(wǎng)絡(luò)可能有16777214臺(tái)主機(jī),它們處于同一廣播域。而在同一廣播域中有這

6、么多結(jié)點(diǎn)是不可能的,網(wǎng)絡(luò)會(huì)因?yàn)閺V播通信而飽和,結(jié)果造成16777214個(gè)地址大部分沒有分配出去??梢园鸦陬惖腎P網(wǎng)絡(luò)進(jìn)一步分成更小的網(wǎng)絡(luò),每個(gè)子網(wǎng)由路由器界定并分配一個(gè)新的子網(wǎng)網(wǎng)絡(luò)地址,子網(wǎng)地址是借用基于類的網(wǎng)絡(luò)地址的主機(jī)部分創(chuàng)建的。劃分子網(wǎng)后,通過使用掩碼,把子網(wǎng)隱藏起來,使得從外部看網(wǎng)絡(luò)沒有變化,這就是子網(wǎng)掩碼。劃分子網(wǎng)的方法是從網(wǎng)絡(luò)的主機(jī)號(hào)借用若干位作為子網(wǎng)號(hào)subnet-id,當(dāng)然主機(jī)號(hào)也就相應(yīng)減少了同樣的位數(shù)。IP地址=<網(wǎng)絡(luò)號(hào)>,<子網(wǎng)號(hào)>,<主機(jī)號(hào)>凡是從其他網(wǎng)絡(luò)發(fā)送給本單位某個(gè)主機(jī)的IP數(shù)據(jù)報(bào),仍然是根據(jù)IP數(shù)據(jù)報(bào)的目的網(wǎng)絡(luò)號(hào)找到連接在本單

7、位網(wǎng)絡(luò)上的路由器。但此路由器在收到IP數(shù)據(jù)報(bào)后,再按目的網(wǎng)絡(luò)號(hào)和子網(wǎng)號(hào)找到目的子網(wǎng),IP數(shù)據(jù)報(bào)交付給目的主機(jī)。三、設(shè)計(jì)方案要求捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,并解析,要求先進(jìn)行IP數(shù)據(jù)包的捕獲,先捕獲再分析,這就要求用到套接字。套接字編程要求先創(chuàng)建原始套接字,創(chuàng)建原始套接字后,IP頭就會(huì)包含在接收的數(shù)據(jù)中,然后對(duì)IP頭進(jìn)行操作,接著獲取主機(jī)名和獲取IP地址,并SOCKADDR_IN的結(jié)構(gòu)內(nèi)容進(jìn)行填充,再綁定socket到本地網(wǎng)卡上,這就完成了IP數(shù)據(jù)包得捕獲。捕獲后,接收數(shù)據(jù)包,并進(jìn)行分析,最后得到結(jié)果。驗(yàn)證ip地址合法性流程圖:YN開始結(jié)束用正則表達(dá)式判斷是否合法輸入的Ip地址驗(yàn)證子網(wǎng)掩碼合法性流程

8、圖YN開始結(jié)束用條件和循環(huán)表達(dá)式判斷是否合法輸入子網(wǎng)掩碼得出子網(wǎng)號(hào)的流程主體設(shè)計(jì)流程本程序主要由三部分構(gòu)成:初始化原始套接字,捕獲數(shù)據(jù)包和解析數(shù)據(jù)包。下面就結(jié)合核心代碼對(duì)程序的具體實(shí)現(xiàn)進(jìn)行講解,同時(shí)使程序流程更加清晰,去掉了錯(cuò)誤檢查等保護(hù)性代碼。1. 使用原始套接字套接字分為三種,即流套接字(Stream Socket)、數(shù)據(jù)報(bào)套接字(Datagram Socket)和原始套接字(Raw Socket)。要進(jìn)行IP數(shù)據(jù)包的接受與發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:SOCKET sock;Sock=WSASoccet(AF_INET,SOCK_RAW,IPPROTO_IP,NULL

9、,0,WSA_FLAG_OVERRLAPPED);在WSASoccet函數(shù)中,第一個(gè)參數(shù)指定通信發(fā)生的區(qū)字段,AF_INET是針對(duì)Internet的,允許在遠(yuǎn)程主機(jī)之間通信。第二個(gè)參數(shù)是套接字的類型,AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三種套接字類型。在這里,我們?cè)O(shè)置為SOCK_RAW,表示我們聲明的是一個(gè)原始套接字類型。第三個(gè)參數(shù)依賴于第二個(gè)參數(shù),用于指定套接字所用的特定協(xié)議,這里使用IP協(xié)議。第四個(gè)參數(shù)為WSAPROTOCOL_INFO位,該位可以置空,永遠(yuǎn)置0。第六個(gè)參數(shù)是標(biāo)志位,WSA_FLAG_OVERRLAPPED表明可以使用發(fā)送

10、接收超時(shí)設(shè)置,本課程設(shè)計(jì)也可以把這個(gè)標(biāo)志位設(shè)置為NULL,因?yàn)楸驹O(shè)計(jì)不用考慮超時(shí)情況。創(chuàng)建原始套接字后,IP頭就會(huì)包含在接收的數(shù)據(jù)中。然后,我們可以設(shè)置IP頭操作選項(xiàng),調(diào)用sotscockpot函數(shù)。其中flag設(shè)置為TRUE,并設(shè)定IP_HDRINCL選項(xiàng),表明用戶可以親自對(duì)IP頭進(jìn)行處理。BOOL flag=true;setsockopt (sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);之后,使用如下代碼完成對(duì)socket的初始化工作:獲取主機(jī)名:char hostname128;gethostname(hostname,

11、 100);獲取IP地址:hostent *pHostIP;pHostIP=gethostbyname(hostname);填充SOCKADDR_IN的結(jié)構(gòu)內(nèi)容:sockaddr_in addr_in;addr_in.sin_addr= *(in_addr*)pHostIP->h_addr_list0;addr_in.sin_family=AF_TNET;addr-in.sin_port=htons(6000);綁定socket: bind(sock, (POSCKADDR)&addr_in,sizeof(addr_in); 填寫sockaddr_in的內(nèi)容時(shí),其地址值應(yīng)填寫為本

12、機(jī)IP地址可以通過gethostbyname()函數(shù)獲??;端口號(hào)可以隨便填寫,但不能與系統(tǒng)沖突;協(xié)議族應(yīng)填寫為AF_INET。注意,sockaddr_in 結(jié)構(gòu)的值必須是以網(wǎng)絡(luò)字節(jié)順序表示的值,而不能直接使用本機(jī)字節(jié)順序的值,使用htoms()函數(shù)可以將無符號(hào)短整型的主機(jī)數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)的順序的數(shù)據(jù)。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。 綁定網(wǎng)卡后,需要WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有網(wǎng)絡(luò)數(shù)據(jù),其關(guān)鍵代碼如下:#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen10;DWORD d

13、wBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(SnifferSocket,IO-RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,Sizeof(dwBufferLen),&dwByteReturned,NULL,NULL); 如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收到的數(shù)據(jù)就拷貝到套接字中。因此,網(wǎng)卡就可以接收所有經(jīng)過的IP包。2.接收數(shù)據(jù)包 在程序中可使用RECV()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個(gè)參數(shù),第一個(gè)參數(shù)接收操作所用的套接字

14、描述符;第二個(gè)參數(shù)接收到緩沖區(qū)的地址;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對(duì)所發(fā)送的數(shù)據(jù)沒特殊要求,直接設(shè)為0。因?yàn)镮P數(shù)據(jù)包的最大長度是65536B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來反復(fù)監(jiān)聽接收IP包,用recv()函數(shù)接收功能的代碼如下:#dedine BUFFER_SIZE 65535Char bufferBUFFER_SIZE; /設(shè)置緩沖區(qū)While(true)recv(sock,buffer,BUFFER_SIZE,0); /j接收數(shù)據(jù)包3.定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一

15、個(gè)數(shù)據(jù)結(jié)構(gòu)表示IP頭部。這個(gè)數(shù)據(jù)結(jié)構(gòu)應(yīng)該和圖7-1吻合,其代碼如下:typedef struct _IP_HEADER /定義IP頭unionBYTE Version; /版本前4位BYTE HdrLen; /報(bào)頭標(biāo)長(后四位),IP頭長度;BYTE ServiceType;/服務(wù)類型WORD TotalLen; /總長度WORD ID; /標(biāo)識(shí)union WORD Flags; /標(biāo)志W(wǎng)ord FragOff; /分段偏移;BYTE TimeToLive; /生命期BYTE Protiocol; /協(xié)議WORD HdrChksum; /頭校驗(yàn)和DWORD SrcAddr; /源地址DWORD

16、 DstAddr: /目的地址IP_HEADER;這是我們只考慮IP頭部結(jié)構(gòu),不考慮數(shù)據(jù)部分。在捕獲IP數(shù)據(jù)包后,可以通過指針把緩沖區(qū)的內(nèi)容強(qiáng)制轉(zhuǎn)化為IP_HEADER數(shù)據(jù)結(jié)構(gòu)。IP_HEADER ip = *( IP_HEADER *)buffer;4.IP包的解析解析IP包的字段有兩種策略。針對(duì)長度為8位、16位和32位的字段 (或子字段)時(shí),可以利用IP_HEADER的成員指教獲取。要解析長度不是9位倍數(shù)的字段(或子字段)時(shí),可以利用C語言中的位移以及與、或操作完成。下面給出了通過IP_HEADER解析IP頭各個(gè)字段的代碼。獲取版本字段:ip.Version>>4;獲取頭部長

17、度字段:ip.HdrLen & 0x0f;獲取服務(wù)類型字段中的優(yōu)先級(jí)子域:ip.ServiceType>>5;獲取服務(wù)類型字段中的TOS子域:( IP.sERVICEtYPE>>1)&0X0F;獲取總長度字段:ip.TotalLEN;獲取標(biāo)識(shí)字段:ip.ID;解析標(biāo)識(shí)字段:DF=(ip.Flags>>14) &0x01;MF=(ip.Flags>>13) &0X01;獲取分段偏移字段:ip.FragOff &0x1fff;獲取生存時(shí)間字段:ip.TimeToLive;獲取協(xié)議字段:ip.Protocol;獲

18、取頭校驗(yàn)和字段:ip.HdrChksum;解析源IP地址字段:inet_ntoa(*(in_addr*)&ip.SrcAddr;解析目的的IP地址字段:inet_ntoa(*(in_addr*)&ip.DstAddr);四、程序編寫#include <stdio.h>#include <math.h>void main()int m,i,j,ip4,ym4,ymm48,ipp48,t,zw4,l;int ok4=0,0,0,0;printf("請(qǐng)輸入一個(gè)IP地址:n"); loop: scanf("%d.%d.%d.%d&q

19、uot;,&ip0,&ip1,&ip2,&ip3);if(ip0>=0&&ip0<224)&&(ip1>=0&&ip1<256)&&(ip2>=0&&ip2<256)&&(ip3>=0&&ip3<256) if(ip0=0&&ip1=0&&ip2=0&&ip3=0)/把地址為全零的IP地址除去 m=0; elseif(ip0=127)/將去

20、除 m=0; else if(ip1=255&&ip2=255&&ip3=255)/將主機(jī)號(hào)為全1的去除 m=0;else if(ip1=0&&ip2=0&&ip3=0)/將主機(jī)號(hào)為全0的去除 m=0; else m=1;else m=0;switch(m)/用m的值判斷ip地址是否合法,m=0時(shí)不合法,m=1時(shí)合法case 0:printf("此地址不合法!n");printf("重新輸入請(qǐng)按ENTER,否則請(qǐng)按其他任意鍵!n");scanf("%d",&l);

21、if(l=1)goto loop;else if(l!=1)break; case 1:/判斷地址的類型if(ip0>0&&ip0<127) printf("此地址為合法的A類地址!n");else if(ip0>127&&ip0<192)printf("此地址為合法的B類地址!n");else printf("此地址為合法的C類地址!n");/判斷地址的類型 /以下程序?qū)崿F(xiàn)ip地址點(diǎn)分十進(jìn)制到二進(jìn)制的轉(zhuǎn)化 for(i=0;i<4;i+)for(j=7;j>=0;j-)ippij=ipi%2;ipi=ipi/2; printf("n請(qǐng)輸入子網(wǎng)掩碼:n"); /將十進(jìn)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論