版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上 青 島 農(nóng) 業(yè) 大 學(xué)計(jì)算機(jī)網(wǎng)絡(luò)綜合實(shí)習(xí)論 文 題 目 : UDP包解析軟件的設(shè)計(jì)與實(shí)現(xiàn) 專(zhuān) 業(yè) 班 級(jí) : 計(jì)本0803 姓名(學(xué)號(hào)): 周方盼() 2011年 11 月 16 日UDP包解析軟件的設(shè)計(jì)與實(shí)現(xiàn)1數(shù)據(jù)包捕獲原理由于目前用的最多的網(wǎng)絡(luò)形式是以太網(wǎng),在以太網(wǎng)上,數(shù)據(jù)是以被稱(chēng)為幀的為單位進(jìn)行交換的,而幀是用被稱(chēng)為帶碰撞檢測(cè)的載波偵聽(tīng)多址訪問(wèn)即CSMA/CD 的方式發(fā)送的,在這種方法中,發(fā)送到指定地址的幀實(shí)際上是發(fā)送到所有計(jì)算機(jī)的,只是如果網(wǎng)卡檢測(cè)到經(jīng)過(guò)的數(shù)據(jù)不是發(fā)往自身的,簡(jiǎn)單忽略過(guò)去而已3。正是這種基于CSMA/CD 的廣播機(jī)制,這就給連接在網(wǎng)絡(luò)上的計(jì)算
2、機(jī)捕獲來(lái)自于其他主機(jī)的數(shù)據(jù)帶來(lái)了可能,即通過(guò)對(duì)網(wǎng)絡(luò)接口的設(shè)置可以使網(wǎng)卡能夠接收到所有經(jīng)過(guò)該機(jī)器的數(shù)據(jù),然后將這些數(shù)據(jù)做相應(yīng)處理并實(shí)時(shí)分析這些數(shù)據(jù)的內(nèi)容,進(jìn)而分析網(wǎng)絡(luò)當(dāng)前狀態(tài)和整體布局。從廣義的角度上看,一個(gè)數(shù)據(jù)包捕獲機(jī)制包含三個(gè)主要部分。首先是最底層針對(duì)特定操作的包捕獲機(jī)制,然后是最高層針對(duì)用戶(hù)程序的接口,第三部分是數(shù)據(jù)包過(guò)濾機(jī)制。不同的操作系統(tǒng)實(shí)現(xiàn)的底層包捕獲機(jī)制可能是不一樣的,但從形式上看大同小異。數(shù)據(jù)包常規(guī)的傳輸路徑依次為網(wǎng)卡、設(shè)備驅(qū)動(dòng)層、數(shù)據(jù)鏈路層、IP 層、傳輸層、最后到達(dá)應(yīng)用程序。而數(shù)據(jù)包捕獲機(jī)制是在數(shù)據(jù)鏈路層增加一個(gè)旁路處理,對(duì)發(fā)送和接收到的數(shù)據(jù)包做過(guò)濾緩沖等相關(guān)處理,最后直接傳
3、遞到應(yīng)用程序4。值得注意的是,數(shù)據(jù)包捕獲機(jī)制并不影響操作系統(tǒng)對(duì)數(shù)據(jù)包的網(wǎng)絡(luò)棧處理。對(duì)用戶(hù)程序而言,數(shù)據(jù)包捕獲機(jī)制提供了一個(gè)統(tǒng)一的接口,使用戶(hù)程序只需要簡(jiǎn)單的調(diào)用若干函數(shù)就能獲得所期望的數(shù)據(jù)包。這樣一來(lái),針對(duì)特定操作系統(tǒng)的捕獲機(jī)制對(duì)用戶(hù)透明,使用戶(hù)程序有比較好的可移植性。數(shù)據(jù)包過(guò)濾機(jī)制是對(duì)所捕獲到的數(shù)據(jù)包根據(jù)用戶(hù)的要求進(jìn)行篩選,最終只把滿(mǎn)足過(guò)濾條件的數(shù)據(jù)包傳遞給用戶(hù)程序。2 數(shù)據(jù)包捕獲方法縱觀國(guó)內(nèi)外使用的包捕獲機(jī)制的方法,大致可歸納為兩類(lèi):一類(lèi)是由操作系統(tǒng)內(nèi)核提供的捕獲機(jī)制;另一類(lèi)是由應(yīng)用軟件或系統(tǒng)包通過(guò)安裝包捕獲驅(qū)動(dòng)程序提供的捕獲機(jī)制,該機(jī)制主要用于Win32 平臺(tái)下的開(kāi)發(fā)。操作系統(tǒng)提供的捕獲
4、機(jī)制主要有四種5:BPF、DLPI、NIT 和Sock Packet 類(lèi)型套接口。BPF 由基于BSD 的Unix 系統(tǒng)內(nèi)核所實(shí)現(xiàn)。DLPI 是Silaris 系統(tǒng)的內(nèi)嵌子系統(tǒng)。NIT 是SunOS4系統(tǒng)的一部分,但在Solaris 系統(tǒng)中被DLPI 及NIT 所取代。Linux 核心則實(shí)現(xiàn)了Sock Packet的包捕獲機(jī)制。從性能上看,BPF 比DLPI 及NIT 好得多,而Sock Packet 最弱。Windows操作系統(tǒng)沒(méi)有提供內(nèi)置的包捕獲機(jī)制。它只提供了數(shù)量很少并且功能有限的API 調(diào)用。PCAUSA 公司提供了一個(gè)商業(yè)的產(chǎn)品,該產(chǎn)品提供了包捕獲接口并且包括了一個(gè)BPF 兼容的過(guò)濾
5、器。然而,用戶(hù)接口過(guò)于低級(jí)并且該產(chǎn)品不提供象過(guò)濾器生成函數(shù)那樣的抽象函數(shù)。WinPcap 是Win32 上的第一個(gè)用來(lái)捕獲數(shù)據(jù)包的開(kāi)放系統(tǒng)軟件包,它是一種新提出的強(qiáng)有力并且可擴(kuò)展的框架結(jié)構(gòu)。WinPcap 包含了一系列以前系統(tǒng)所沒(méi)有的創(chuàng)新特性。本文中將主要使用目前比較流行的WinPcap 軟件包來(lái)提供捕獲機(jī)制,因?yàn)樗冀K把性能放在首位,能支持十分苛求的應(yīng)用要求6。由于網(wǎng)絡(luò)適配器一般工作在數(shù)據(jù)鏈路層,因此所得到的報(bào)文是鏈路層的報(bào)文,它除了應(yīng)用層的數(shù)據(jù)外,還包括數(shù)據(jù)鏈路層幀頭、IP 報(bào)文頭、以及IP 層之上的TCP 或UDP 報(bào)文頭,并且應(yīng)用層還有可能也定義了自己的幀結(jié)構(gòu)。本文設(shè)計(jì)的捕獲程序是由運(yùn)
6、行在Windows 核心層的包捕獲驅(qū)動(dòng)程序?qū)崿F(xiàn)的。不使用專(zhuān)用的數(shù)據(jù)采集系統(tǒng),而是通過(guò)網(wǎng)卡來(lái)捕獲數(shù)據(jù),所以必須要有一個(gè)高效的丟包率低的包捕獲驅(qū)動(dòng)程序。該驅(qū)動(dòng)程序采用WinPcap 包捕獲結(jié)構(gòu)。該包捕獲結(jié)構(gòu)具有與網(wǎng)絡(luò)適配卡無(wú)關(guān)的特性,并且獨(dú)立于網(wǎng)絡(luò)的具體形式,如令牌環(huán)、以太網(wǎng)、點(diǎn)到點(diǎn)協(xié)議PPP 等,因此適應(yīng)面廣。利用WinPcap 的捕獲數(shù)據(jù)技術(shù)對(duì)底層數(shù)據(jù)進(jìn)行捕獲。首先用戶(hù)應(yīng)用程序向網(wǎng)卡設(shè)備驅(qū)動(dòng)程序發(fā)出請(qǐng)求,由網(wǎng)卡設(shè)備驅(qū)動(dòng)程序激活從網(wǎng)絡(luò)拷貝每個(gè)分組的數(shù)據(jù)包,并且將它們分發(fā)到對(duì)應(yīng)的應(yīng)用程序7。捕獲流程如圖1 所示。圖1 捕獲數(shù)據(jù)流程圖具體步驟如下:1、打開(kāi)網(wǎng)卡,并設(shè)為混雜模式。2、回調(diào)函數(shù)Netwo
7、rk Tap10在得到監(jiān)聽(tīng)命令后,從網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序處收集數(shù)據(jù)包,把監(jiān)聽(tīng)到的數(shù)據(jù)包負(fù)責(zé)傳送給過(guò)濾程序。3、當(dāng)Packet filter 監(jiān)聽(tīng)到有數(shù)據(jù)包到達(dá)時(shí),NDIS 中間驅(qū)動(dòng)程序首先調(diào)用分組驅(qū)動(dòng)程序,該程序?qū)?shù)據(jù)傳遞給每一個(gè)參與進(jìn)程的分組過(guò)濾程序。4、然后由Packet filter 過(guò)濾程序決定哪些數(shù)據(jù)包應(yīng)該丟棄,哪些數(shù)據(jù)包應(yīng)該接收,是否需要將接收到的數(shù)據(jù)拷貝到相應(yīng)的應(yīng)用程序。5、通過(guò)分組過(guò)濾器后,將數(shù)據(jù)未過(guò)濾掉的數(shù)據(jù)包提交給核心緩沖區(qū)。然后等待系統(tǒng)緩沖區(qū)滿(mǎn)后,再將數(shù)據(jù)包拷貝到用戶(hù)緩沖區(qū)。監(jiān)聽(tīng)程序可以直接從用戶(hù)緩沖區(qū)中讀取捕獲的數(shù)據(jù)包。6、關(guān)閉網(wǎng)卡。3 數(shù)據(jù)包捕獲實(shí)現(xiàn)關(guān)于數(shù)據(jù)包捕獲的實(shí)現(xiàn)算
8、法是十分的簡(jiǎn)單的,當(dāng)網(wǎng)卡設(shè)置為混雜模式時(shí),在網(wǎng)內(nèi)的數(shù)據(jù)包都會(huì)被發(fā)送一份到網(wǎng)卡上。以電子郵件為例,在發(fā)送郵件連接信息和郵件頭的端口號(hào)是25 端口。據(jù)此,只需要監(jiān)聽(tīng)網(wǎng)絡(luò)是否25 端口的數(shù)據(jù)包,如果有,則進(jìn)一步判斷其數(shù)據(jù)報(bào)的IP 是否是我們需要監(jiān)聽(tīng)的計(jì)算機(jī)的IP,如果是,則檢查是否有以指定IP 命名的文件夾,動(dòng)態(tài)命文件名存儲(chǔ)數(shù)據(jù)包;如果不是,一方面我們可以存儲(chǔ)數(shù)據(jù)包,也可以丟棄8。程序主要函數(shù)如下:void CMainFrame:OnOptAdpater()/提取網(wǎng)卡信息void CMainFrame:OnUpdateOptAdpater(CCmdUI pCmdUI)/數(shù)據(jù)包捕獲開(kāi)始后,禁止選擇網(wǎng)卡
9、void CMainFrame:OnFileStart()/開(kāi)始捕獲void CMainFrame:OnFileStop()/暫停捕獲UINT ReceivePacket (LPVOID param)/接收數(shù)據(jù)包CListCtrl ctrlthis>GetListCtrl();/將所捕獲數(shù)據(jù)包的內(nèi)容復(fù)制下來(lái),并保存到CArray 數(shù)組中,以備將來(lái)使用在實(shí)際應(yīng)用中,用戶(hù)系統(tǒng)只關(guān)心一些特定的數(shù)據(jù)。因此高效的信息過(guò)濾機(jī)制是系統(tǒng)的重要組成部分,它使得用戶(hù)系統(tǒng)可以指定特定的子網(wǎng)主機(jī)以及指定的協(xié)議類(lèi)型,只將用戶(hù)關(guān)心的數(shù)據(jù)向上層提交,從而提高系統(tǒng)的工作效率。WinPcap 使用了一個(gè)高效的數(shù)據(jù)包過(guò)濾機(jī)
10、制,BPF(伯克利數(shù)據(jù)包過(guò)濾)。與應(yīng)用層過(guò)濾機(jī)制相比,BPF 機(jī)制是一種內(nèi)核層的過(guò)濾機(jī)制,通過(guò)它可以大幅度地提高包過(guò)濾時(shí)的性能。在過(guò)濾機(jī)制中,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),最重要是要掌握它的過(guò)濾規(guī)則,因?yàn)閃inPcap 就是通過(guò)調(diào)用相應(yīng)的函數(shù),來(lái)使用這些過(guò)濾規(guī)則實(shí)現(xiàn)對(duì)數(shù)據(jù)包實(shí)現(xiàn)過(guò)濾的9??紤]到性能的因素,在使用過(guò)濾器前,NPF 提供一個(gè)JIT 編譯器將它轉(zhuǎn)化成本地的80x86函數(shù)。當(dāng)一個(gè)數(shù)據(jù)包被捕獲,NPF 調(diào)用這個(gè)本地函數(shù)而不是調(diào)用過(guò)濾器的解釋器,這使得處理過(guò)程相當(dāng)快。程序主要函數(shù)如下:void CMainFrame:OnOptFilter()/設(shè)置過(guò)濾器BOOL CMainFrame:Filter(c
11、onst unsigned char pktdata)/過(guò)濾數(shù)據(jù)包void CMainFrame:OnUpdateOptFilter(CCmdUI pCmdUI)/數(shù)據(jù)包捕獲開(kāi)始后禁止設(shè)置過(guò)濾器捕獲結(jié)果如圖2 所示。圖2 數(shù)據(jù)包捕獲結(jié)果具體代碼如下:#include "stdio.h"#include "stdlib.h"#include "iostream.h"#include "pcap.h"#include "winsock2.h"#pragma comment(lib,"ws2
12、_32")#pragma comment(lib,"wpcap")/以太幀頭結(jié)構(gòu)體typedef struct ether_header unsigned char ether_dhost6;unsigned char ether_shost6;unsigned short ether_type;ETHHEADER,*PETHHEADER;/IPv4包頭結(jié)構(gòu)體typedef struct ip_header unsigned char ver_ihl; /Version (4 bits) + Internet header length (4 bits)unsig
13、ned char tos; /Type of serviceunsigned short tlen; /Total lengthunsigned short identification; /Identificationunsigned short flags_fo; /Flags (3 bits) + Fragment offset (13 bits) unsigned char ttl; /Time to liveunsigned char proto; /Protocolunsigned short crc; /Header checksumu_char ip_src4; /Source
14、 addressu_char ip_dst4; /Destination addressIPHEADER,*PIPHEADER;/UDP包頭結(jié)構(gòu)體typedef struct udp_header u_short sport; /源端口號(hào)u_short dport; /目的端口號(hào)u_short len; /數(shù)據(jù)報(bào)長(zhǎng)度u_short crc; /校驗(yàn)和UDPHEADER,*PUDPHEADER;void InitAdapter(); /初始化網(wǎng)絡(luò)適配器 void dispatcher_handler(u_char*,const pcap_pkthdr*,const u_char *);/解析UD
15、P數(shù)據(jù)包格式void CloseAdapter(); /關(guān)閉網(wǎng)絡(luò)適配器FILE *fp;pcap_if_t *alldevs,*d;char errbufPCAP_ERRBUF_SIZE;pcap_t *adhandle;void main() int count=0,number;printf("Please enter the number of packet sended:");scanf("%d",&number);InitAdapter();fp=fopen("d:/buhuo/udp.txt","w&qu
16、ot;);while(count<=number) pcap_loop(adhandle,1,dispatcher_handler,NULL); /捕獲數(shù)據(jù)報(bào)count+; CloseAdapter();void InitAdapter() int i;if(pcap_findalldevs(&alldevs,errbuf)=-1) /尋找網(wǎng)絡(luò)適配器cout<<"Error in pcap_findalldevs!"return;for(d=alldevs,i=0;i<0;d=d->next,i+);if(adhandle=pcap_o
17、pen_live(d->name,65535,1,20,errbuf)=NULL) /打開(kāi)選取的網(wǎng)絡(luò)適配器cout<<"Unable to open the adapter!"pcap_freealldevs(alldevs);return;if(pcap_datalink(adhandle)!=DLT_EN10MB) /判斷網(wǎng)絡(luò)是否為10MB以太網(wǎng)cout<<"This program works only on Ethernet network!"pcap_freealldevs(alldevs);return;void
18、 dispatcher_handler(u_char *,const pcap_pkthdr *header,const u_char *p) PETHHEADER eth=(PETHHEADER)p;PIPHEADER ip=(PIPHEADER)(p+sizeof(ETHHEADER);PUDPHEADER udp=(PUDPHEADER)(p+sizeof(ETHHEADER)+sizeof(IPHEADER);if(ntohs(eth->ether_type)=0x0800) /封裝在IPv4包頭中的UDP數(shù)據(jù)包if(ip->proto=17) /IPv4包頭中Proto字段值為17表示上層數(shù)據(jù)包為UDPfprintf(fp,"源端口:%d ",ntohs(udp->sport); /源端口號(hào)fprintf(fp,"目的端口:%d ",ntohs(udp->dport); /目的端口號(hào)fprintf(fp
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電廠煤炭采購(gòu)合同與環(huán)保型付款策略3篇
- 2025年碳晶片技術(shù)培訓(xùn)及咨詢(xún)合同3篇
- 開(kāi)發(fā)商繼續(xù)履行合同范本(2篇)
- 工廠員工勞動(dòng)合同(2篇)
- 二零二五版貨物代理合同范本3篇
- 二零二五年度棉花價(jià)格指數(shù)編制與應(yīng)用合同4篇
- 2025年度個(gè)人購(gòu)房借款合同物業(yè)管理服務(wù)協(xié)議3篇
- 二零二五年度中小企業(yè)應(yīng)收賬款質(zhì)押貸款合同范本4篇
- 2025年航空航天產(chǎn)業(yè)投資入股分紅合同3篇
- 2025年度租賃車(chē)輛智能監(jiān)控服務(wù)合同遠(yuǎn)程管理4篇
- Unit10l'mten!(練)新概念英語(yǔ)青少版StarterA
- 產(chǎn)業(yè)園區(qū)開(kāi)發(fā)全流程實(shí)操解析
- NBT 47013.4-2015 承壓設(shè)備無(wú)損檢測(cè) 第4部分:磁粉檢測(cè)
- 羽毛球比賽對(duì)陣表模板
- 2024年上海市中考數(shù)學(xué)真題試卷及答案解析
- 2024年全國(guó)卷1高考理綜試題及答案
- 初中語(yǔ)文現(xiàn)代文閱讀訓(xùn)練及答案二十篇
- 農(nóng)村開(kāi)荒土地承包權(quán)轉(zhuǎn)讓協(xié)議書(shū)
- 牙科門(mén)診病歷
- 2023年小學(xué)科學(xué)教研組教研工作總結(jié)(5篇)
- (完整版)金融市場(chǎng)基礎(chǔ)知識(shí)知識(shí)點(diǎn)歸納-圖文
評(píng)論
0/150
提交評(píng)論