ARP地址解析協(xié)議實驗報告_第1頁
ARP地址解析協(xié)議實驗報告_第2頁
ARP地址解析協(xié)議實驗報告_第3頁
ARP地址解析協(xié)議實驗報告_第4頁
ARP地址解析協(xié)議實驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、網(wǎng)絡(luò)技術(shù)與應(yīng)用實驗報告實驗三目錄背景知識3開發(fā)環(huán)境4程序設(shè)計7ARP數(shù)據(jù)包結(jié)構(gòu)定義7獲取本機網(wǎng)絡(luò)接口的MAC地址和IP地址9向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)包12程序測試15執(zhí)行結(jié)果界面截圖15執(zhí)行結(jié)果分析17獲取IP地址與MAC地址的對應(yīng)關(guān)系背景知識以太網(wǎng)的一個很大的特點就是具有強大的廣播能力。針對這種具備廣播能力、物理地址長但長度固定的網(wǎng)絡(luò),IP互聯(lián)網(wǎng)采用動態(tài)聯(lián)編方式進行IP地址到物理地址的映射,并制定了相應(yīng)的協(xié)議ARP。 假定在一個以太網(wǎng)中,主機A欲獲取主機B的IP地址IB與MAC地址PB的映射關(guān)系。ARP協(xié)議的工作過程為:1)主機A廣播發(fā)送一個帶有IB的請求信息包,請求主機B用它的IP地址IB和MAC地

2、址PB的映射關(guān)系進行相應(yīng);2)于是,以太網(wǎng)上的所有主機接受到這個請求信息包(包括主機B在);3)主機B識別該請求信息,并向主機A發(fā)送帶有自己的IP地址IB和MAC地址PB映射關(guān)系的相應(yīng)數(shù)據(jù)包;4)主機A 得到IB與PB的映射關(guān)系,并可以在隨后的發(fā)送過程中使用該映射關(guān)系。當ARP報文在以太網(wǎng)中傳送時,需要將它們封裝在以太網(wǎng)數(shù)據(jù)幀中。為了使接收方能夠容易地識別該數(shù)據(jù)幀攜帶的為ARP數(shù)據(jù),發(fā)送方需要將以太網(wǎng)數(shù)據(jù)幀首部的長度/類型字段指定為0x0806。由于ARP請求和應(yīng)答分別采用廣播方式和單播方式發(fā)送,因此封裝ARP請求數(shù)據(jù)幀的目的地址為全“1”形式的廣播地址,而封裝ARP響應(yīng)的數(shù)據(jù)真的目的地址為接

3、收節(jié)點的單播地址。在以太網(wǎng)中,ARP數(shù)據(jù)包的格式如圖3-1所示:硬件類型協(xié)議類型硬件地址長度協(xié)議地址長度操作源MAC地址(03)源MAC地址(45)源IP地址(01)源IP地址(23)目的MAC地址(01)目的MAC地址(25)目的IP地址(03)圖3-1以太網(wǎng)中ARP的報文格式其中,個字段的意義如下:硬件類型:物理接口類型。其中,以太網(wǎng)的接口類型為1。協(xié)議類型:高層協(xié)議類型。其中,IP協(xié)議類型為0x0800。操作:指定ARP報文一個ARP請求還是一個ARP應(yīng)答。其中,ARP請求報文為 1,ARP應(yīng)答報文為2。硬件地址長度:以字節(jié)為單位的物理地址長度。在以太網(wǎng)中,物理地址(MAC 地址)的長度

4、為6B。協(xié)議地址長度:以字節(jié)為單位的上層協(xié)議地址長度。IP地址長度為4B。源MAC地址:發(fā)送方的MAC地址。源IP地址:發(fā)送方的IP地址。目的MAC地址:在ARP請求報文中,該字段容沒有意義;在ARP響應(yīng)報文中, 該字段為接收方的MAC地址。目的IP地址:在ARP請求報文中,該字段為請求解析的IP地址;在ARP響應(yīng) 報文中,該字段為接收方的IP地址。開發(fā)環(huán)境本實驗的目的是捕獲以太網(wǎng)中的數(shù)據(jù)包并對其進行分析,因此以太網(wǎng)在該實驗中時必不可少的。本實驗使用的以太網(wǎng)既可以是共享式以太網(wǎng)也可以是交換式以太網(wǎng)。本實驗利用Microsoft集成開發(fā)環(huán)境IDE創(chuàng)建基于WinPcap的應(yīng)用程序。因此,需要在源碼

5、中增加與WinPcap相關(guān)的信息,還需要對IDE中的某些缺省參數(shù)進行修改。下面介紹使用VC6.0創(chuàng)建基于WinPcap應(yīng)用程序的配置方法:1.添加pcap.h包含文件:如果一個源文件使用了WinPcap提供的函數(shù),那么需要在該文件開始位置增加pcap.h包含文件,如下所示:#include“pcap.h”2.增加與WinPcap有關(guān)的預(yù)處理器定義:需要將WPCAP和HAVE_REMOTE兩個標號添加到預(yù)處理器定義中。在VC6.0提供的IDE環(huán)境中,可以通過執(zhí)行“工程”菜單中的“設(shè)置”命令進入該項目的屬性配置頁,如圖2-2所示。通過選擇“C/C+”選項就可以增加這兩個標號。圖3-2在預(yù)處理器定義

6、中增加WPCAP和HAVE_REMOTE3.添加包含文件目錄:在生成基于WinPcap的應(yīng)用程序過程中,生成程序需要知道pcap.h等包含文件在磁盤中的位置,因此需要將WinPcap提供的包含文件目錄位置通知生成程序。添加包含文件目錄可以通過執(zhí)行“工具”菜單中的“選項”命令進入“選項”對話框,如圖2-3所示。然后,通過選擇對話框中的“目錄->include files”選項可以將WinPcap的包含文件目錄添加到IDE集成開發(fā)環(huán)境中。圖3-3在IDE集成開發(fā)環(huán)境中增加包含文件目錄4.添加wpcap.lib庫文件:在生成基于WinPcap的應(yīng)用程序過程中,生成程序需要wpcap.lib庫文

7、件。因此,需要將WinPcap.lib添加到利用IDE集成開發(fā)環(huán)境生成的項目中。添加wpcap.lib庫文件可以通過執(zhí)行“項目”菜單中的“設(shè)置”命令進入“Project Settings”對話框,如圖2-4所示。通過選擇“連接”選項就可以添加wpcap.lib庫文件。圖3-4添加wpcap.lib庫文件程序設(shè)計利用WinPcap獲取IP地址與MAC地址的對應(yīng)關(guān)系需要經(jīng)過下面各步驟。ARP數(shù)據(jù)包結(jié)構(gòu)定義網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包是經(jīng)過封裝的,每一次封裝都會增加相應(yīng)的首部。由于WinPcap在數(shù)據(jù)鏈路層捕獲數(shù)據(jù)包,因此在以太網(wǎng)中利用pcap_next_ex函數(shù)獲得的數(shù)據(jù)都包含以太網(wǎng)幀頭信息。同時,由于利用

8、pcap_next_ex函數(shù)捕獲到的數(shù)據(jù)包保存在一個無結(jié)構(gòu)的緩沖區(qū)中,因此在實際編程過程中,通常需要定義一些有關(guān)首部的數(shù)據(jù)結(jié)構(gòu),通過將這些結(jié)構(gòu)賦予存放數(shù)據(jù)包的無結(jié)構(gòu)緩沖區(qū)簡化數(shù)據(jù)的提取過程。 在分析以太網(wǎng)數(shù)據(jù)幀和ARP數(shù)據(jù)包時可以定義以太網(wǎng)數(shù)據(jù)幀和ARP數(shù)據(jù)包首部結(jié)構(gòu)為:#pragma pack(1)/進入字節(jié)對齊模式typedef structFrameHeader_t/幀頭部BYTE DesMac6;/目的地址BYTE SrcMac6;/源地址WORD FrameType;/幀類型FrameHeader_t;typedef struct ARPFrame_t/IP首部FrameHeader

9、_t FrameHeader;WORD HardwareType;WORD ProtocolType;BYTE HLen;BYTE PLen;WORD Operation;BYTE SendHa6;DWORD SendIP;BYTE RecvHa6;DWORD RecvIP;ARPFrame_t;typedef struct Data_t/包含幀首部和IP首部的數(shù)據(jù)包FrameHeader_t FrameHeader;IPHeader_t IPHeader;Data_t;#pragma pack()/恢復(fù)缺省對齊模式獲取本機網(wǎng)絡(luò)接口的MAC地址和IP地址調(diào)用WinPcap的pcap_finda

10、lldevs_ex函數(shù)后,參數(shù)alldevs指向的鏈表中包含了主機中安裝的網(wǎng)絡(luò)接口設(shè)備列表。在alldevs鏈表中每個元素保存的網(wǎng)絡(luò)接口相關(guān)信息中,地址信息保存了該網(wǎng)絡(luò)接口上綁定的IP地址、網(wǎng)絡(luò)掩碼、廣播地址和目的地址等。由于每個網(wǎng)絡(luò)接口卡上可以綁定多個IP地址,因此每個網(wǎng)絡(luò)接口卡擁有的地址信息也采用了鏈表結(jié)構(gòu),其具體定義如下:typedef struct pcap_ifpcap_if_t;structpcap_ifstruct pcap_if *next;char *name;char *description;structpcap_addr *addresses;u_int flags;s

11、tructpcap_addrstruct pcap_addr *next;struct sockaddr *addr;struct sockaddr *netmask;struct sockaddr *broadaddr;struct sockaddr *dstaddr;實驗中按照上面的鏈表結(jié)構(gòu),利用WinPcap的pcap_findalldevs_ex獲取本機的網(wǎng)絡(luò)接口卡與其每塊網(wǎng)卡上綁定的IP地址的程序代碼如下:pcap_if_t *alldevs;/指向設(shè)備鏈表首部的指針pcap_if_t *dpcap_addr_t *acharerrbufPCAP_ERRBUF_SIZE;/錯誤信息緩

12、沖區(qū)/獲得本機的設(shè)備鏈表if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)=-1) MessageBox(“無法獲取設(shè)備鏈表”);for(a=d->addresses;a!=NULL;a=a->next) if(a->addr->sa_family=AF_INET)/判斷該地址是否為IP地址/利用a->addr獲取IP地址str.Format("%d.%d.%d.%d",(BYTE)a->addr->sa_data2,(BYTE)a->addr

13、->sa_data3,(BYTE)a->addr->sa_data4,(BYTE)a->addr->sa_data5);m_details.InsertString(-1,str);/利用a->addr獲取網(wǎng)絡(luò)掩碼str.Format("%d.%d.%d.%d",(BYTE)a->netmask->sa_data2,(BYTE)a->netmask->sa_data3,(BYTE)a->netmask->sa_data4,(BYTE)a->netmask->sa_data5);m_detai

14、ls.InsertString(-1,str);為了形成ARP請求數(shù)據(jù)包,不但需要知道本機網(wǎng)絡(luò)接口上綁定的IP地址,而且必須知道這塊網(wǎng)卡的MAC地址。在理解ARP協(xié)議的基本思想后,可以直接通過WinPcap獲取本機網(wǎng)絡(luò)接口的MAC地址。按照ARP協(xié)議,以太網(wǎng)中的主機如果發(fā)現(xiàn)一個ARP所請求的IP地址為自己擁有的IP地址,那么它將形成ARP響應(yīng)并將該IP地址與MAC地址的對應(yīng)關(guān)系返回給請求主機。如果應(yīng)用程序能夠捕獲到本機發(fā)出的ARP響應(yīng),那么就能夠知道本機網(wǎng)絡(luò)接口的MAC地址。按照這種原理,利用WinPcap獲得本機網(wǎng)絡(luò)接口MAC地址和IP地址的過程大致如下:1)獲取本機安裝的網(wǎng)絡(luò)接口和接口上綁

15、定的IP地址:利用WinPcap提供的pcap_findalldevs_ex函數(shù)獲取本機的接口設(shè)備列表,從而獲得本機網(wǎng)絡(luò)接口與其接口上綁定的IP地址。2)發(fā)送ARP請求,請求本機網(wǎng)絡(luò)接口上綁定的IP地址與MAC地址的對應(yīng)關(guān)系:本地主機模擬一個遠端主機,發(fā)送一個ARP請求報文,該請求報文請求本機網(wǎng)絡(luò)接口上綁定的IP地址與MAC地址的對應(yīng)關(guān)系。在組裝報文過程中,源MAC地址字段和源IP地址字段需要使用虛假的MAC地址和虛假的IP地址。本地主機一旦獲取該ARP請求就會做出響應(yīng)。3)應(yīng)用程序捕獲本機的ARP響應(yīng),獲取本機網(wǎng)絡(luò)接口卡的MAC地址:利用WinPcap捕獲本機的ARP響應(yīng),從而得到本機網(wǎng)絡(luò)接

16、口卡的MAC地址。在得到本機網(wǎng)絡(luò)接口的MAC地址和其上綁定的IP地址后,應(yīng)用程序就可以組裝和發(fā)送ARP請求報文,請求以太網(wǎng)中其他主機的IP地址與MAC地址的對應(yīng)關(guān)系。實驗中運用以下程序段獲取本機網(wǎng)絡(luò)接口的MAC地址和其上綁定的IP地址:/封裝ARP請求包for(i=0;i<6;i+)ARPFrameSent.FrameHeader.DesMACi=0xff;/目的MAC地址設(shè)置為廣播地址ARPFrameSent.FrameHeader.SrcMACi=0x66;ARPFrameSent.SendHai=0x66;ARPFrameSent.RecvHai=0x00;ARPFrameSent

17、.FrameHeader.FrameType=htons(0x0806);ARPFrameSent.HardwareType=htons(0x0001);ARPFrameSent.HLen=6;ARPFrameSent.PLen=4;ARPFrameSent.Operation=htons(0x0001);ARPFrameSent.SendIP=inet_addr(“12”);/目的IP地址設(shè)置為本機網(wǎng)卡上綁定的IP地址ARPFrameSent.SendIP=htonl(BYTE)a->addr->sa_data2<<24)+(BYTE)a-&

18、gt;addr->sa_data3<<16)+(BYTE)a->addr->sa_data4<<8)+(BYTE)a->addr->sa_data5);/啟動數(shù)據(jù)包捕獲者線程m_Capturer=AfxBeginThread(Capturer,NULL,THREAD_PRIORITY_NORMAL);int start=clock(); /啟動計時器while(DstMACGot!=TRUE&&clock()-start<=30000)pcap_sendpacket(p,(u_char *)&ARPFrameS

19、ent,sizeof(ARPFrameSent);if(DstMACGot!=TRUE) /在規(guī)定時間未捕獲IP地址與MAC地址對應(yīng)關(guān)系MessageBox("請求超時");else/輸出IP地址與MAC地址對應(yīng)關(guān)系CString str;str.Format("%s->%02x-%02x-%02x-%02x-%02x-%02x",m_strDesIP,ARPFrameReceived->FrameHeader.SrcMAC0,ARPFrameReceived->FrameHeader.SrcMAC1,ARPFrameReceived-

20、>FrameHeader.SrcMAC2,ARPFrameReceived->FrameHeader.SrcMAC3,ARPFrameReceived->FrameHeader.SrcMAC4,ARPFrameReceived->FrameHeader.SrcMAC5);m_match.InsertString(-1,str);向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)包為了獲取以太網(wǎng)中其他主機的IP地址與MAC地址的對應(yīng)關(guān)系,應(yīng)用程序需要向以太網(wǎng)廣播ARP請求。向以太網(wǎng)發(fā)送數(shù)據(jù)報可以使用WinPcap提供的pcap_sendpacket()函數(shù),該函數(shù)原型如下:Int pcap_send_pac

21、ket(pcap_t*p,u_charbuf,intsize);其中,pcap_sendpacket函數(shù)中各參數(shù)的意義如下:p:指定pcap_sendpacket函數(shù)通過哪塊接口網(wǎng)卡發(fā)送數(shù)據(jù)包。該參數(shù)為一個指向pcap_t結(jié)構(gòu)的指針,通常是調(diào)用pcap_open函數(shù)成功后返回的值。buf:指向需要發(fā)送的數(shù)據(jù)包,該數(shù)據(jù)包應(yīng)該包含各層的頭部信息。但需要注意的是,以太幀的CRC校驗和字段不應(yīng)該包含在buf中,WinPcap在發(fā)送過程中會自動為其添加校驗和。size:指定發(fā)送數(shù)據(jù)包的大小。在發(fā)送成功后時,pcap_sendpacket函數(shù)返回0,后則返回-1.實驗中,利用WinPcap發(fā)送ARP請求的

22、程序如下:/封裝ARP請求包for(i=0;i<6;i+)/將目的MAC地址設(shè)置為廣播地址ARPFrameSent.FrameHeader.DesMACi=0xff;/將源MAC地址設(shè)置為本機網(wǎng)卡的MAC地址ARPFrameSent.FrameHeader.SrcMACi=SrcMACAddri;ARPFrameSent.SendHai=SrcMACAddri;ARPFrameSent.RecvHai=0x00;/幀類型為ARPARPFrameSent.FrameHeader.FrameType=htons(0x0806);/硬件類型為以太網(wǎng)ARPFrameSent.HardwareTy

23、pe=htons(0x0001);/協(xié)議類型為IPARPFrameSent.ProtocolType=htons(0x0800);/硬件地址長度為6ARPFrameSent.HLen=6;/協(xié)議地址長度為4ARPFrameSent.PLen=4;/操作為ARP請求ARPFrameSent.Operation=htons(0x0001);/源IP地址設(shè)置為本機網(wǎng)卡上綁定的IP地址ARPFrameSent.SendIP=htonl(BYTE)a->addr->sa_data2<<24)+(BYTE)a->addr->sa_data3<<16)+(BY

24、TE)a->addr->sa_data4<<8)+(BYTE)a->addr->sa_data5);/目的IP地址設(shè)置為請求的IP地址ARPFrameSent.RecvIP=htonl(DstIP);/啟動數(shù)據(jù)包捕獲者線程m_Capturer=AfxBeginThread(Capturer,NULL,THREAD_PRIORITY_NORMAL);int start=clock(); /啟動計時器while(DstMACGot!=TRUE&&clock()-start<=30000)pcap_sendpacket(p,(u_char *)&ARPFrameSent,sizeof(ARPFrameSent);if(DstMACGot!=TRUE) /在規(guī)定時間未捕獲IP地址與MAC地址對應(yīng)關(guān)系MessageBox("請求超時");else/輸出IP地址與MAC地址對應(yīng)關(guān)系CString str

溫馨提示

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

評論

0/150

提交評論