計算機網(wǎng)絡解析ARP數(shù)據(jù)包_第1頁
計算機網(wǎng)絡解析ARP數(shù)據(jù)包_第2頁
計算機網(wǎng)絡解析ARP數(shù)據(jù)包_第3頁
計算機網(wǎng)絡解析ARP數(shù)據(jù)包_第4頁
計算機網(wǎng)絡解析ARP數(shù)據(jù)包_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 沈陽理工大學課程設計專用紙 No14成 績 評 定 表學生姓名班級學號1103050409專 業(yè)計算機科學與技術課程設計題目解析ARP數(shù)據(jù)包評語組長簽字:成績?nèi)掌?20 年 月 日課程設計任務書學 院信息科學與工程學院專 業(yè)計算機科學與技術學生姓名班級學號課程設計題目解析ARP數(shù)據(jù)包實踐教學要求與任務:1. 課程設計的目的是對網(wǎng)絡上的ARP數(shù)據(jù)包進行解析,從而熟悉ARP數(shù)據(jù)包的結構,對ARP協(xié)議有更好的理解和認識。2. 通過編寫程序,獲取網(wǎng)絡中的ARP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結果顯示在標準輸出上,并同時寫入日志文件。工作計劃與進度安排:第15周星期一:設計任務分析和總體設計星期二:軟件算

2、法和流程設計星期三:軟件編碼實現(xiàn)星期四:軟件總體調(diào)試星期五:交課程設計報告、答辯、驗收程序指導教師: 201 年 月 日專業(yè)負責人:201 年 月 日學院教學副院長:201 年 月 日目 錄摘 要1 課程設計目的.12 課程設計要求13相關知識14課程設計分析15程序代碼16運行結果與分析17 個人心得.18參考文獻1沈陽理工大學摘 要 本文首先介紹了解析ARP數(shù)據(jù)包課程設計的目的與意義,本次課程設計的要求,接著說明了,什么是ARP?ARP數(shù)據(jù)報消息格式以及ARP協(xié)議的工作流程加強我們對ARP協(xié)議的認識,然后分析了本次課程設計的難點、重點、參考算法、核心代碼,以及對運行結果的分析,還有一些相關

3、知識的拓展。最后對本次課設進行了個人心得的總結。1課程設計目的 課程設計的目的是對網(wǎng)絡上的ARP數(shù)據(jù)包進行解析,從而熟悉ARP數(shù)據(jù)包的結構,對ARP協(xié)議有更好的理解和認識。2 課程設計要求 通過編寫程序,獲取網(wǎng)絡中的ARP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下所示:(1) 以命令行的形式運行,如下所示:ParseArp log_file其中,arpparse為程序名;log_file為日志文件名。(2)程序輸出內(nèi)容如下所示:源IP地址 源MAC地址 目的IP地址 目的MAC地址 操作 時間各部分的說明如下所示:源IP地址:輸出ARP消息格式中的

4、源IP地址字段源MAC地址:輸出ARP消息格式中的源物理地址字段目的IP地址:輸出ARP消息格式中的目的IP地址字段。目的MAC地址:輸出ARP消息格式中的目的物理地址字段 操作:輸出ARP消息格式中的操作字段,若為ARP請求, 則為1,若為ARP應答,則為2。時間:該ARP包產(chǎn)生的時間。(3)當程序接收到鍵盤輸入Ctrl+C時字段退出。3 相關知識(1)什么是ARP地址解析協(xié)議(Address Resolution Protocol,ARP)是在僅知道主機的IP地址時確定其物理地址的一種協(xié)議。因IPv4和以太網(wǎng)的廣泛應用,其主要用作將IP地址翻譯為以太網(wǎng)的MAC地址,但其也能在ATM和FDD

5、IIP網(wǎng)絡中使用。從IP地址到物理地址的映射有兩種方式:表格方式和非表格方式。ARP具體說來就是將網(wǎng)絡層(IP層,也就是相當于OSI的第三層)地址解析為數(shù)據(jù)連接層(MAC層,也就是相當于OSI的第二層)的MAC地址。在以太網(wǎng)協(xié)議中規(guī)定,同一局域網(wǎng)中的一臺主機要和另一臺主機進行直接通信,必須要知道目標主機的MAC地址。而在TCP/IP協(xié)議棧中,網(wǎng)絡層和傳輸層只關心目標主機的IP地址。這就導致在以太網(wǎng)中使用IP協(xié)議時,數(shù)據(jù)鏈路層的以太網(wǎng)協(xié)議接到上層IP協(xié)議提供的數(shù)據(jù)中,只包含目的主機的IP地址。于是需要一種方法,根據(jù)目的主機的IP地址,獲得其MAC地址。這就是ARP協(xié)議要做的事情。所謂地址解析(a

6、ddress resolution)就是主機在發(fā)送幀前將目標IP地址轉(zhuǎn)換成目標MAC地址的過程。 另外,當發(fā)送主機和目的主機不在同一個局域網(wǎng)中時,即便知道目的主機的MAC地址,兩者也不能直接通信,必須經(jīng)過路由轉(zhuǎn)發(fā)才可以。所以此時,發(fā)送主機通過ARP協(xié)議獲得的將不是目的主機的真實MAC地址,而是一臺可以通往局域網(wǎng)外的路由器的某個端口的MAC地址。于是此后發(fā)送主機發(fā)往目的主機的所有幀,都將發(fā)往該路由器,通過它向外發(fā)送。這種情況稱為ARP代理(ARP Proxy)。(2)ARP數(shù)據(jù)報的消息格式網(wǎng)絡上的每臺主機或設備都有一個或多個IP地址。IP地址是網(wǎng)絡層的地址,在網(wǎng)絡層,數(shù)據(jù)被組裝成IP包。但是發(fā)送

7、IP包需要物理設備的支持(通常是Ethernet設備,在本課程設計中我們指定為Ethernet設備),即發(fā)送端必須知道目的物理地址才能將IP包發(fā)送出去,所以需要一種將IP地址映射為物理地址的機制。ARP協(xié)議就是用來完成這個任務的。ARP協(xié)議能夠在同一個物理網(wǎng)絡中,在給定目的主機或設備的IP地址的條件下,得到目的主機或設備的物理地址。ARP協(xié)議的數(shù)據(jù)包格式如圖所示: 0 8 16 24 31(位) 硬件類型 協(xié)議類型物理地址長度協(xié)議地址長度 操作 源物理地址(八位組03) 源物理地址(八位組45) 源IP地址(八位組01) 源IP地址(八位組23) 目的物理地址(八位組01) 目的物理地址(八位

8、組25) 目的IP地址(八位組03)ARP數(shù)據(jù)包的消息格式下面對數(shù)據(jù)包的各個部分進行說明l 硬件類型:指定硬件接口類型。例如,值為1表示Ethernetl 協(xié)議類型:指定發(fā)送方支持的上層協(xié)議的類型l 物理地址長度:指定物理(硬件)地址的長度l 協(xié)議地址長度:網(wǎng)絡層協(xié)議的地址長度。若為IP協(xié)議,其值為4l 操作:指定ARP的操作類型,例如,1表示ARP請求,2表示ARP應答l 源物理地址:指定發(fā)送方的IP地址l 目的物理地址:指定目的物理地址。l 目的IP地址:指定目的IP地址ARP分組必須在數(shù)據(jù)鏈路層中被封裝成偵,才能發(fā)送出去封裝形式如圖所示ARP消息幀頭部 幀數(shù)據(jù) 將ARP數(shù)據(jù)包封裝成一個幀

9、(3)ARP協(xié)議的工作流程。1) 在發(fā)送一個ARP分組之前,源主機首先根據(jù)目的IP地址,在本地ARP高速緩存表中查找與之對應的目的物理地址。如果找到對應的物理地址,就不用進行地址解析,否則需要進行地址解析。2) 實現(xiàn)地址解析的第一步是產(chǎn)生ARP請求分組。在相應的字段寫入本地主機的源物理地址、源IP地址,在目的物理地址字段寫入0,并在操作字段寫入1。3) 將ARP分組發(fā)送到本地的數(shù)據(jù)鏈路層,并封裝成幀。以源物理地址作為源地址,以物理廣播地址(FF-FF-FF-FF-FF-FF)作為目的地址,通過物理層發(fā)送出去。4) 由于采用了廣播地址,因此網(wǎng)段內(nèi)所有的主機或設備都能接受到該幀。除了目的主機外,所

10、有接受到該分組的主機和設備都會丟棄該分組,因為目的主機能夠識別ARP消息中的目的IP地址。5) 目的主機發(fā)送ARP應答分組。在ARP應答分組中,以請求分組中源物理地址、源IP地址作為其目的物理地址、目的IP地址,并將目的主機自身的物理地址、IP地址填入應答分組的源物理地址、源IP地址字段,并在操作字段中寫入2。該分組通過數(shù)據(jù)鏈路層以點對點的方式發(fā)送出去(因為現(xiàn)在目的方已經(jīng)知道雙方的物理地址)。6) 源結點接收到ARP應答分組,知道對應于目的IP地址的目的物理地址,將它作為一條新記錄加入到ARP高速緩存表。源結點將有完整源IP地址、源物理地址、目的IP地址、目的物理地址的信息和數(shù)據(jù)作為一個發(fā)送分

11、組,傳送給它的數(shù)據(jù)鏈路層并封裝成楨,然后以點對點的方式發(fā)送到目的主機。4 課程設計分析1. 課程設計中的重點及難點1) 程序中會用到Winpcap,Winpcap是Win32環(huán)境下數(shù)據(jù)包捕獲的開放代碼函數(shù)庫?;赪inpcap的應用程序一般按照下面幾個步驟進行設計:l 輸出網(wǎng)卡設備列表。l 選擇網(wǎng)卡并打開。l 捕獲數(shù)據(jù)包時,可能需要設置過濾器。l 捕獲數(shù)據(jù)包或者發(fā)送數(shù)據(jù)包。2) 在程序設計過程中需要注意網(wǎng)絡主機字節(jié)順序的轉(zhuǎn)化。由于不同的計算機系統(tǒng)所采用的數(shù)據(jù)表示方式不同,對于2B或4B的數(shù)據(jù),有的采用低字節(jié)地址存放數(shù)據(jù)的高權值位,而有的卻以低地址字節(jié)存放數(shù)據(jù)低權位值,在網(wǎng)絡的數(shù)據(jù)傳輸中,我們應

12、該統(tǒng)一表示,所以我們在捕獲數(shù)據(jù)包后,應將數(shù)據(jù)包頭部的表示長度或類型的數(shù)據(jù)轉(zhuǎn)換成本地機的表達形式。可以利用函數(shù)ntohs()將網(wǎng)絡字節(jié)序轉(zhuǎn)換為主機字節(jié)序。3) 選擇網(wǎng)卡并打開時,注意選擇可用的網(wǎng)卡。2. 參考算法1) 取得當前網(wǎng)卡設備列表。2) 選擇Ethernet網(wǎng)卡并打開,注意判斷所選網(wǎng)卡是否為實際存在的可用網(wǎng)卡。3) 設置過濾器,此處的過濾器正則表達式為“arp”或者“ether protoarp”。4) 捕獲數(shù)據(jù)包并進行處理(包括輸出各IP地址,物理地址,操作類型以及時間)。由于要記錄日志文件,為了便于輸出流參數(shù),建議采用pcap_next_ex()函數(shù)。流程圖如圖所示:開始獲取網(wǎng)卡列表

13、選取Ethernet網(wǎng)卡打開網(wǎng)卡(混雜模式)編譯設置過濾器捕獲ARP包并將其相應內(nèi)容輸出5 程序代碼#include<conio.h>#include<fstream.h>#include<iomanip.h>#include"pcap.h"#include<winsock2.h>#pragma comment(lib,"ws2_32.lib")#pragma comment(lib,"wpcap.lib")/定義ARP包數(shù)據(jù)struct arppktunsigned short hdt

14、yp; /硬件類型unsigned short protyp; /協(xié)議類型unsigned char hdsize; /硬件地址長度unsigned char prosize; /協(xié)議地址長度unsigned short op; /(操作類型)操作值: ARP/RARPu_char smac6; /源MAC地址u_char sip4; /源IP地址u_char dmac6; /目的MAC地址u_char dip4; /目的IP地址;void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream&

15、out) /從ARP包中找到頭部位置 arppkt* arph = (arppkt *)(pkt_data +14);/輸出源IP地址 for(int i=0;i<3;i+) out<<int(arph->sipi)<<'.' out.setf(ios:left); out<<setw(3)<<int(arph->sip3)<<" " out.unsetf(ios:left);/輸出源MAC地址char oldfillchar=out.fill('0');out.s

16、etf(ios:uppercase); for(i=0;i<5;i+) out<<hex<<setw(2)<<int(arph->smaci)<<'-' out<<hex<<setw(2)<<int(arph->smac5)<<" " out.fill(oldfillchar); out.unsetf(ios:hex|ios:uppercase);/輸出目的IP地址 for(i=0;i<3;i+) out<<int(arph-&

17、gt;dip3)<<'.'out.unsetf(ios:left);out<<setw(3)<<int(arph->dip3)<<' 'out.unsetf(ios:left);/輸出目的MAC地址out.fill('0');out.setf(ios:uppercase);for(i=0;i<5;i+) out<<hex<<setw(2)<<int(arph->dmaci)<<'-'out<<hex<

18、<setw(2)<<int(arph->dmac5)<<" "out.fill(oldfillchar);out.unsetf(ios:hex|ios:uppercase);/輸出操作類型out<<ntohs(arph->op)<<" "/輸出操作時間struct tm *ltime;ltime=localtime(&header->ts.tv_sec);out.fill('0');out<<ltime->tm_hour<<

19、9;:'<<setw(2)<<ltime->tm_min<<':'<<setw(2)<<ltime->tm_sec;out.fill(oldfillchar);out<<endl;void main(int argc,char *argv )/命令行參數(shù)/檢查輸入命令格式if(argc!=2)cout<<"Please input command: ParseArp output_file"<<endl;return;/初始化網(wǎng)絡設備相關參數(shù)p

20、cap_if_t *alldevs;pcap_if_t *d;pcap_t *adhandle;char errbufPCAP_ERRBUF_SIZE;u_int netmask;char packet_filter="ether proto arp"struct bpf_program fcode;struct pcap_pkthdr *header;const u_char *pkt_data;/獲取網(wǎng)絡設備列表if(pcap_findalldevs(&alldevs,errbuf)=-1)cout<<"Error in pcap_find

21、alldevs:"<<errbuf;return;/選取一個Ethernet網(wǎng)卡for(d=alldevs;d;d=d->next) /網(wǎng)卡設為混雜模式,接收所有幀if(adhandle=pcap_open_live(d->name,1000,1,300,errbuf)=NULL)cout<<"nUnable to open the adapter."pcap_freealldevs(alldevs);return;/檢查數(shù)據(jù)鏈路是否為Ethernetif(pcap_datalink(adhandle)=DLT_EN10MB&a

22、mp;&d->addresses!=NULL)break;if(d=NULL) cout<<"nNo interfaces found! Make sure Winpcap is installed.n" return;/獲得子網(wǎng)掩碼netmask=(sockaddr_in *)(d->addresses->netmask)->sin_addr.S_un.S_addr;/編譯過濾器,只捕獲ARP包if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) c

23、out<<"nUnable to compile the packet filter.Check the syntax.n" pcap_freealldevs(alldevs); return;/設置過濾器if(pcap_setfilter(adhandle,&fcode)<0) cout<<"nError setting the filter.n" pcap_freealldevs(alldevs); return;/顯示提示信息及每項含義cout<<"listening on "&

24、lt;<d->description<<"."<<endl<<endl;ofstream fout(argv1,ios:app); /日志記錄文件/為了查看日志時的方便,其中加入了日期記錄time_t t;time(&t);fout.seekp(0,ios:end);if(fout.tellp()!=0) fout<<endl;fout<<"ttARP request(1)/reply(2) on"<<ctime(&t);cout<<"

25、;Sour Ip Addr"<<" "<<"Sour MAC Address" <<" "<<"Des Ip Addr"<<" "<<"Des MAC Address"<<" "<<"OP"<<" "<<"Time"<<endl;fout<<&q

26、uot;Sour Ip Addr"<<" "<<"Sour MAC Address" <<" "<<"Des Ip Addr"<<" "<<"Des MAC Address" <<" "<<"OP"<<" "<<"Time"<<endl;/釋放設備列表pca

27、p_freealldevs(alldevs);/開始截獲ARP包int result;while(result=pcap_next_ex(adhandle,&header,&pkt_data)>=0) /循環(huán)解析ARP數(shù)據(jù)包 if(result=0) continue;/解析ARP包,結果輸出到屏幕與文件 packet_handler(header,pkt_data,cout); packet_handler(header,pkt_data,fout);6 運行結果與分析相關擴展與分析:本課程設計還可以在Linux環(huán)境下用rawsocket完成。算法和代碼提示:1) 調(diào)用

28、socket()打開協(xié)議簇為PF_PACKET的原始套接字,這樣我們就可以收到數(shù)據(jù)鏈路幀:int fd = socket(PF_PACKET,SOCK_RAM,htons(ETH_P_ALL);2) 對打開的套接字調(diào)用ioct1(),將網(wǎng)卡設置為混雜模式,這樣我們就可以接受到局域網(wǎng)中所有的包(包括目的地址不是本機的幀): struct ifreq req; memset (&req,0,sizeof(req); strncpy(req.ifr_name,”eth0”,strlen(“eth0”)+1); ioctl(fd,SIOCGIFFLAS,&req); req.ifr_flags|=IFF_PROMISC; /設置為混雜模式 icotl(fd, SIOCGIFFLAGS,&req);3) 利用recvfrom()接收包:recvform(fd,buffer,sizeof(buffer)

溫馨提示

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

評論

0/150

提交評論