優(yōu)秀課設(shè)-IP大數(shù)據(jù)包解析匯報_第1頁
優(yōu)秀課設(shè)-IP大數(shù)據(jù)包解析匯報_第2頁
優(yōu)秀課設(shè)-IP大數(shù)據(jù)包解析匯報_第3頁
優(yōu)秀課設(shè)-IP大數(shù)據(jù)包解析匯報_第4頁
優(yōu)秀課設(shè)-IP大數(shù)據(jù)包解析匯報_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

實用文案課程設(shè)計——解析 IP數(shù)據(jù)包長沙理工大學(xué)目錄1、課程設(shè)計目的....................................................22、課程設(shè)計要求....................................................23、程序設(shè)計分析.....................................................23.1網(wǎng)卡設(shè)置.....................................................23.2.1使用套接字.................................................33.2.2接收數(shù)據(jù)包.................................................33.3定義IP頭部的數(shù)據(jù)結(jié)構(gòu)........................................43.4IP包的解析..................................................43.5協(xié)議的定義...................................................53.6捕獲處理.....................................................54、運行結(jié)果........................................................65、總結(jié)............................................................66、課程設(shè)計參考資料................................................77、源程序代碼......................................................7標準文檔實用文案1、課程設(shè)計目的本章課程設(shè)計的目的就是設(shè)計一個解析 IP數(shù)據(jù)包的程序,并根據(jù)這個程序,明確課程設(shè)計的目的和重要性, 認真領(lǐng)會課程設(shè)計的題目, 讀懂課程設(shè)計指導(dǎo)書的要求, 學(xué)會設(shè)計的基本方法與步驟, 學(xué)會如何運用前修知識與收集、 歸納相關(guān)資料解決具體問題的方法。嚴格要求自己,要獨立思考,按時、獨立完成能力拓展訓(xùn)練任務(wù)。 設(shè)計報告:要求層次清楚,整潔,規(guī)范,不得相互抄襲。2、課程設(shè)計要求1、用兩個線程 a和b來模擬Ethernet 上的兩臺主機。2、用一個雙字類型變量 Bus來模擬總線(將其初始化為“ \0”,并且總線等于“ \0”時表示總線空閑)。3、兩個子線程向總線發(fā)送自己的數(shù)據(jù)。數(shù)據(jù)用該線程的線程號進行模擬,發(fā)送數(shù)據(jù)用線程號和Bus的“或”操作進行模擬(即Bus=Bus|ID,ID為該線程的線程號)。4、每臺主機需向總線上成功發(fā)送 10次數(shù)據(jù),如果其中某次數(shù)據(jù)發(fā)送失敗,則該線程結(jié)束。5、發(fā)送流程必須遵循 CSMA/CD。隨即延遲算法中的沖突窗口取 0.005。在數(shù)據(jù)發(fā)送成功 3、程序設(shè)計分析3.1網(wǎng)卡設(shè)置為了獲取網(wǎng)絡(luò)中的 IP數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里使用套接字(socket) 進行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。 對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包, 網(wǎng)絡(luò)接口在騅投遞地址并非自身地址之后將不引起響應(yīng), 也就是說應(yīng)用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。 使用套接字套接字分為三種,即流套接字 (Streamsocket) 、數(shù)據(jù)報套接字(DatagramSocket)標準文檔實用文案和原始套接字(RawSocket)。要進行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:Socketsock:Sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_TP,NULL,0,WSA_FLAG_OVERLAPPED);本設(shè)計不用考慮超時情況。創(chuàng)建套接后,IP頭就會包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項,調(diào)用setsockopt 函數(shù)。其中flag 設(shè)置為true,并設(shè)定IP-HDRINCL選項,表明用戶可以親自對 IP頭進行處理。最后使用 bind()函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用 WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有的網(wǎng)絡(luò)數(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ù)沒特殊要求,直接設(shè)為0。因為IP數(shù)據(jù)包的最大長度是65535B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來反復(fù)監(jiān)聽接收IP包,用recv()函數(shù)實現(xiàn)接收功能。3.3定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一個數(shù)據(jù)結(jié)構(gòu)表示 IP頭部。其代碼如下:標準文檔實用文案inti=0;//發(fā)送成功次數(shù)intCollisionCounter=16;//沖突計數(shù)器初始值為16doubleCollisionWindow=0.005;//沖突窗口值取值0.005intrandNum=rand()%3;//隨機數(shù)loop:if(Bus==0)//總線空閑{Bus=Bus|ID1; // 模擬發(fā)送包Sleep(12);if(Bus==ID1) // 無沖突{printf("%dSendSuccess\n\n",ID1); // 發(fā)送成功Bus=0; // 內(nèi)存清零CollisionCounter=16; // 復(fù)原沖突計數(shù)器Sleep(rand()%10); // 隨即延時i++;printf(" 主機a發(fā)送成功次數(shù)=%d\n\n",i);if(i<10)goto loop; // 發(fā)送次數(shù)不夠10次,開始下一次發(fā)送}else{printf("%dSendCollision\n\n",ID1); // 發(fā)生沖突CollisionCounter--;Bus=0 ;

3.4IP 包的解析解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數(shù)的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。3.5協(xié)議的定義(包含相應(yīng)的頭文件#include#include ):DWORDdwIoControlCode=SIO_RCVALL,/*接收所有的IP包*/dwProtocol=IPPROTO_IP;/*協(xié)議類型為IP*/3.6捕獲處理標準文檔實用文案加載Winsock;創(chuàng)建一個接收原始IP包的socket連接;綁定到一個接口;進行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。代碼如下:if(WSAIoctl(s,dwIoControlCode,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL,NULL)==SOCKET_ERROR)接著設(shè)定一個線程進行捕獲:1)創(chuàng)建一個接收IP包的鏈表頭;2)設(shè)置一個標識,為真,則不斷進行IP包的捕獲;3)建立一個新的結(jié)點,將捕獲的數(shù)據(jù)包加入到該結(jié)點;4)如果鏈表的長度達到指定的長度,創(chuàng)建一個線程對該鏈表的IP包進行解析;再設(shè)置一個在IP數(shù)據(jù)包鏈表不足給定的長度,而又中止IP捕獲時,對鏈表的處理;5)為下一個IP包鏈表創(chuàng)建一個鏈表頭。建立一個進行IP包解析并顯示的線程,進行解析IP數(shù)據(jù)包,然后顯示IP數(shù)據(jù)包。4、運行結(jié)果截獲IP數(shù)據(jù)包程序運行結(jié)果如下:標準文檔實用文案5、總結(jié)這次計算機網(wǎng)絡(luò)課程設(shè)計是解析 IP數(shù)據(jù)包,通過這次上機充分應(yīng)用了所學(xué)的計算機網(wǎng)絡(luò)和 C語言的知識,并上網(wǎng)搜索一部分相當(dāng)資料,粗略設(shè)計出該程序。通過本次課程設(shè)計,首先認識到了自己的不足。在編碼的過程中認識到了自己細節(jié)方面的不足,在以后計算機網(wǎng)絡(luò)的學(xué)習(xí)過程中在理解的同時還要做到對細節(jié)的注重; 當(dāng)然在本次課設(shè)中最終還是實現(xiàn)了題目要求。同時,覺得本次課設(shè)是十分有意義的,使自己所學(xué)的只是有了實踐的地方。6、課程設(shè)計參考資料《計算機網(wǎng)絡(luò)(第四版)》 主編:謝希仁 出版社:電子工業(yè)出版社 出版時間:2004年7月《計算機網(wǎng)絡(luò)課程設(shè)計》 主編:吳功宜 胡曉英張仁何云王寧出版社:機械工業(yè)出版社標準文檔實用文案出版或修訂時間:2005年9月《計算機網(wǎng)絡(luò)設(shè)計》主編:易建勛 出版社:人民郵電出版社 出版或修訂時間:2007年10月7、源程序代碼#include"winsock2.h"#include"ws2tcpip.h"#include"iostream"#include"stdio.h"#pragma comment(lib,"ws2_32.lib")typedefstruct_IP_HEADER// 定義IP頭{union{BYTEVersion; // 版本(前4位)BYTEHdrLen; //IHL (后4位),報頭標長};BYTEServiceType; // 服務(wù)類型WORDTotalLen; // 總長WORDID; // 標識union{WORDFlags; // 標志(前3位)WORDFragOff; // 分段偏移(后13位)};BYTETimeToLive; // 生命期BYTEProtocol; // 協(xié)議WORDHdrChksum; // 頭校驗和DWORDSrcAddr; // 源地址標準文檔實用文案DWORDDstAddr; // 目的地址BYTEOptions; // 選項}IP_HEADER;逐位解析IP頭中的信息voidgetVersion(BYTEb,BYTE&version){version=b>>4; // 右移4位,獲取版本字段}voidgetIHL(BYTEb,BYTE&result){result=(b&0x0f)*4; // 獲取頭部長度字段}char*parseServiceType_getProcedence(BYTEb){switch(b>>5) // 獲取服務(wù)類型字段中優(yōu)先級子域{case7:return"NetworkControl";break;case6:return"InternetworkControl";break;case5:return"CRITIC/ECP";break;case4:return"FlashOverride";break;case3:return"Flsah";break;標準文檔實用文案case2:return"Immediate";break;case1:return"Priority";break;case0:return"Routine";break;default:return"Unknow";break;}}char*parseServiceType_getTOS(BYTEb){b=(b>>1)&0x0f; // 獲取服務(wù)類型字段中的 TOS子域switch(b){case0:return"Normalservice";break;case1:return"Minimizemonetarycost";break;case2:return"Maximizereliability";break;#include<unistd.h>#include<stdio.h>#include<sys/wait.h>#include<sys/ipc.h>標準文檔實用文案#include<sys/shm.h>#include<sys/types.h>#include<error.h>#include<time.h>#include<stdlib.h>#defineERROR_SHMGET-1#defineERROR_SHMAT-2#defineERROR_WAIT-3#defineERROR_FORK-4#defineSLOT_TIME0.005/*截止二進制指數(shù)退避算法的實現(xiàn)該算法可以表示為:t=2*τ*r為結(jié)點重新發(fā)送需要的后退延遲時間;2*τ為沖突窗口值;r為隨機數(shù),r的取值范圍為[0,2^k-1],k=Min[重傳次數(shù),10];當(dāng)重傳16次仍不成功時,則丟棄該幀.*/staticunsignedlongget_backoff(constintn)//計算重傳推遲時間{intk=n;k=16-k;if(k>10)// 如果重傳次數(shù)大于 10時,重傳次數(shù)置為10k=10;return(random()%(1<<k))*SLOT_TIME;// 返回重傳推遲時間}/*發(fā)送數(shù)據(jù)流程*/staticvoidsend_msg(constvoid*addr,constpid_tpid,charch){pid_t*bus=(pid_t*)addr;intcollision;// 沖突計數(shù)器intk=0;//發(fā)送成功的次數(shù)for(inti=0;i<10;i++){collision=16;do{while(*bus!=0);//總線不空閑,循環(huán)等待直到總線空閑.usleep(SLOT_TIME/2);//檢測到總線為空閑時就開始發(fā)送數(shù)據(jù),因為線程A和B共享總線變量bus,所以在τ時間以內(nèi),另一個線程收不到數(shù)據(jù),所以要進行此操作*bus|=pid;//表示另一個進程受收到模擬數(shù)據(jù).usleep(SLOT_TIME/2);//從模擬數(shù)據(jù)發(fā)送后經(jīng)過2τ時間之后進行判斷.判斷是否沖突,共享內(nèi)存與寫入內(nèi)存比較,若相同則無沖突,否則發(fā)生沖突.if(*bus!=pid){*bus=0;// 復(fù)原總線為0標準文檔實用文案collision--;if(collision>0){printf("%dsendcollision.\n",pid);usleep(get_backoff(collision));//隨機延時}else{printf("%dsendfailure.\n",pid);//發(fā)送失敗break;}}else{*bus=0;break;}}while(1);if(collision>0){k++;printf("%dsendsuccess.\n",pid);printf("%csendsuccess=%d.\n",ch,k);}usleep(random()%1024);}}/*主函數(shù)*/intmain(){pid_tpid=0;intbus=0;/*共享內(nèi)存的ID,用來模擬總線*/void*addr=0;/*指向模擬總線的首地址*/bus=shmget(IPC_PRIVATE,sizeof(pid_t),SHM_R|SHM_W);//獲取共享內(nèi)存if(bus==-1)/*如果申請內(nèi)存失敗*/{perror("shmgeterror.");returnERROR_SHMGET;}if((pid=fork())<0)// 創(chuàng)建子進程a{perror("forkerror.");標準文檔實用文案returnERROR_FORK;}elseif(pid==0){pid=getpid();// 獲取子進程IDaddr=shmat(bus,0,0);// 初始化共享內(nèi)存為 \0if(addr==(void*)-1){perror("shmaterror");/*shmctl(shmid,IPC_RMID0)是釋放共享內(nèi)存區(qū),shmid,,這只有在所有進程中的都已經(jīng)無效化后才會進行IPC_RMID0)如果shmid0

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論