發(fā)送ARP數(shù)據(jù)包_第1頁
發(fā)送ARP數(shù)據(jù)包_第2頁
發(fā)送ARP數(shù)據(jù)包_第3頁
發(fā)送ARP數(shù)據(jù)包_第4頁
發(fā)送ARP數(shù)據(jù)包_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、目錄一 課程設(shè)計目的1二 課程設(shè)計要求1三 系統(tǒng)開發(fā)語言及環(huán)境的選擇1四 相關(guān)知識 1-31ARP協(xié)議的工作原理1-22.ARP的包格式 23.ARP包的填充2-3五 課程設(shè)計過程3-111.流程圖 3-42.源程序代碼 4-103.程序運行結(jié)果分析10-11六 課程設(shè)計小結(jié)11七 參考文獻11-12一 課程設(shè)計目的 1) ARP協(xié)議用于完成IP地址與MAC地址間的轉(zhuǎn)換。2) 熟悉ARP協(xié)議對于IP數(shù)據(jù)包的傳輸過程具有重要意義。3) 本課程設(shè)計的主要目的是通過封裝與發(fā)送ARP幀,了解ARP協(xié)議的工作原理與ARP幀的結(jié)構(gòu)。二 課程設(shè)計要求根據(jù)后面介紹的ARP包結(jié)構(gòu),編寫程序封裝并發(fā)送ARP包。1

2、) 以命令行形式運行: arpsend src_ip src_mac dst_ip dst_mac flag其中arpsend作為程序名。各參數(shù)意義:src_ip: 源IP地址。src_mac: 源MAC地址。dst_ip: 目的IP地址。dst_mac: 目的MAC地址。Flag:0表示ARP請求;1表示ARP應(yīng)答。例如: Arpsend FA:01:02:03:04:05 0D:E1:02:03:B4:06 12) 輸出內(nèi)容:ARP幀的各字數(shù)值,包括源IP地址,源MAC地址,目的IP地址,目的MAC地址等。三 系統(tǒng)開發(fā)語言及環(huán)境的選擇操作系統(tǒng)

3、:Windows XP運行環(huán)境:Microsoft Visual C+ 6.0開發(fā)語言:C語言,C+等四 相關(guān)知識 1.ARP協(xié)議的工作原理 Ethernet 設(shè)備(比如網(wǎng)卡)有自己全球唯一的MAC地址,它們以MAC地址來傳輸Ethernet數(shù)據(jù)包,但他們卻不能識別IP包的IP地址。所以,在Ethernet中進行IP通信時就需要一個協(xié)議來建立IP地址和MAC地址的對應(yīng)關(guān)系,這個協(xié)議就是ARP協(xié)議。 ARP的基本運行過程是:1) 主機A希望發(fā)行數(shù)據(jù)分組給主機B,但不知道B的物理地址。2) A發(fā)送廣播報文,要求B主機用他的物理地址來響應(yīng)。3) 網(wǎng)站上所有主機都接收到這個分組。4) B識別出自己的I

4、P地址,發(fā)送給應(yīng)答報文,告訴A自己的物理地址。但是,所有的源節(jié)結(jié)點在發(fā)送任何一個分組或者連續(xù)向同一個目的主機發(fā)送分組時,都要通過ARP服務(wù)去獲取目的物理地址,他的工作效率肯定很低。為了克服這個缺點,要對ARP做些改進。ARP改進的一個重要方法是,在使用ARP的主機上保留一個專用的高速緩存,用于存放最近的IP地址和物理地址的綁定,在發(fā)送ARP請求時先看看這個高速緩存。例如,在命令窗口中輸入:arp-a 得到: Internet Address Physical Address Type50 00-30-6e-07-e6-de dynamic 這就是該計算機里存儲的IP地址與

5、MAC地址的對應(yīng)關(guān)系,dynamic表示臨時存儲在ARP緩存中的條目,過一段時間系統(tǒng)就會自動刪除。 這樣,當(dāng)計算機要和另一臺計算機9通信時,他會先檢查ARP緩存,查找是否與9對應(yīng)的ARP條目。如果沒找到,他就會發(fā)送ARP請求包,廣播詢問與9對應(yīng)的MAC地址。9發(fā)現(xiàn)ARP請求包中的IP一樣,就會發(fā)送ARP應(yīng)答分組,通知自己IP地址與MAC地址的對應(yīng)關(guān)系。于是,計算機的ARP緩存就會相應(yīng)刷新,增加以下信息:9 00-40-05-42-84-f4 dynamic 。 2.ARP的包格式圖1給

6、了ARP分組格式的示意圖。物理幀頭(14B)ARP幀結(jié)構(gòu)(28B)填充數(shù)據(jù)(18B)CRC(4B)圖1 ARP包格式(1) 物理幀頭物理幀頭的結(jié)構(gòu)如2圖所示。目的MAC (6B)源MAC(6B) 類型(2B) ARP幀:0x0806圖2 物理幀頭格式(2)ARP幀結(jié)構(gòu) 圖3給出了ARP幀格式的示意圖,長度為28B。 3ARP包的填充 要注意的是,填充請求包時。因為包要在Ethernet上廣播,所以,物理幀頭的“目的MAC”字段要填充為FFFFFFFFFFFF;而ARP幀結(jié)構(gòu)中的目的MAC可填充為任意值,因為它此時不起作用?!疤畛鋽?shù)據(jù)”字段要填充為0。 0 8 16 24 31(位) 硬件類型(

7、Ethernet:0x1) 上層協(xié)議類型(IP:0x0800)硬件地址長度(0x6)IP地址長度(0x4) 操作(請求: 0x1; 應(yīng)答: 0x2) 源MAC地址 源MAC地址 源IP地址 源IP地址 目的MAC地址 目的MAC地址 目的IP地址圖3 ARP幀結(jié)構(gòu)五 課程設(shè)計過程 1.流程圖NNNYNYARP請求,填充DLC頭中目的MAC(廣播,全F)及FlagFlag=0?N開始YYY結(jié)束關(guān)閉網(wǎng)卡 釋放包結(jié)構(gòu)發(fā)送包成功?分配及初始化發(fā)送包結(jié)構(gòu)選擇網(wǎng)卡并打開?獲取網(wǎng)卡列表?進入發(fā)送ARP包函數(shù)填充DLC的其他字段及ARP頭的各字段ARP請求,填充DLC頭中目的MAC及Flag定義ARP包結(jié)構(gòu)并

8、初始化命令行參數(shù) = 6? 圖5 程序流程圖2.源程序代碼頭文件keshe.h#include <iostream.h>#include <fstream.h>#include <stdlib.h>#include <conio.h>#include <stdio.h>#include "Packet32.h"#include "Ntddndis.h"#pragma comment(lib,"Packet.lib")/ DLC頭typedef struct DLCHeader

9、 unsigned char DesMAC6;/目的MAC地址 unsigned char SrcMAC6;/源MAC地址 unsigned short Ethertype;/幀類型DLCHEADER;/ ARP楨typedef struct ARPFrame unsigned short HW_Type;/硬件類型 unsigned short Prot_Type;/上層協(xié)議類型 unsigned char HW_Addr_Len;/MAC地址長度 unsigned char Prot_Addr_Len;/IP地址長度 unsigned short Flag;/1表示請求,2表示應(yīng)答 uns

10、igned char Send_HW_Addr6;/源MAC地址 unsigned char Send_Prot_Addr4;/源IP地址 unsigned char Targ_HW_Addr6;/目的MAC地址 unsigned char Targ_Prot_Addr4;/目的IP地址 unsigned char padding18;/填充數(shù)據(jù)ARPFRAME;/ ARP包=DLC頭+ARP楨typedef struct ARPPacket DLCHEADER dlcHeader; ARPFRAME arpFrame;*PARPPACKET;ARPPacket ARPPACKET;源文件 k

11、eshe.cpp#include<iostream.h>#include<string.h>#include "keshe.h"int transIP(char *,unsigned char *);/填充IP地址int transMAC(char *,unsigned char *);/填充MAC地址LPADAPTER lpAdapter;/網(wǎng)卡結(jié)構(gòu)指針LPPACKET lpPacket;/接收包結(jié)構(gòu)指針bool Send();/發(fā)送包函數(shù)void main(int argc,char *argv)if(argc!=6)/命令行參數(shù)!=6,輸入錯誤

12、cout<<"輸入格式錯誤"<<endl;return;int i=0;memset(&ARPPACKET, 0, sizeof(ARPPACKET);/初始化ARP包if(*argv5='0')/輸入flag參數(shù)為0,ARP請求for(i=0;i<6;i+)/DLC頭中目的MAC地址為廣播形式ARPPACKET.dlcHeader.DesMACi=0xff;ARPPACKET.arpFrame.Flag=(unsigned short)1;/ARP幀中flag位置1elseif(*argv5='1')/

13、輸入flag參數(shù)為1,ARP響應(yīng)/填充DLC頭中目的MAC地址if(!transMAC(argv4,ARPPACKET.dlcHeader.DesMAC)return;/ARP楨中flag位置2ARPPACKET.arpFrame.Flag=(unsigned short)0x0200;elsecout<<"flag位輸入錯誤"<<endl;if(!transMAC(argv2,ARPPACKET.dlcHeader.SrcMAC)/填充DLC頭中源MAC地址return;/填充DLC頭中楨類型ARPPACKET.dlcHeader.Ethertyp

14、e=htons(unsigned short)0x0806);ARPPACKET.arpFrame.HW_Type=(unsigned short)0x0100;/ARP頭中硬件類型/(Ethernet類型)ARPPACKET.arpFrame.Prot_Type=(unsigned short)0x0008;/上層協(xié)議(IP)類型ARPPACKET.arpFrame.HW_Addr_Len=(unsigned char)6;/MAC地址長度ARPPACKET.arpFrame.Prot_Addr_Len=(unsigned char)4;/IP地址長度if(!transMAC(argv2,A

15、RPPACKET.arpFrame.Send_HW_Addr)/源MAC地址return;if(!transIP(argv1,ARPPACKET.arpFrame.Send_Prot_Addr)/源IP地址return;if(!transMAC(argv4,ARPPACKET.arpFrame.Targ_HW_Addr)/目的MAC地址return;if(!transIP(argv3,ARPPACKET.arpFrame.Targ_Prot_Addr)/目的IP地址return;for(i=0;i<18;i+)ARPPACKET.arpFrame.paddingi=0;/填充數(shù)據(jù)if(!

16、Send()cout<<"發(fā)送arp包失敗"<<endl;/發(fā)送ARP包int transIP(char *argv,unsigned char *a)char ip16;int i=0,j=0,k=0;strcpy(ip,argv);int m=strlen(argv);for(i=0;i<m;i+) /判斷命令行輸入的IP格式是否正確if(ipi<'0'|ipi>'9')&&ipi!='.')cout<<"輸入ip:"<<

17、argv<<"格式錯誤"<<endl;return 0;elseif(ipi!='.')j+;elsek+;if(j>3)cout<<"輸入ip:"<<argv<<"格式錯誤"<<endl;return 0;elsej=0;if(k>3)cout<<"輸入ip:"<<argv<<"格式錯誤"<<endl;return 0;j=0;for(i=0;i&

18、lt;4;i+) /填充IP地址while(*(ip+j)<'0'|*(ip+j)>'9')j+;ai=(unsigned char)atoi(ip+j);while(*(ip+j)>='0'&&*(ip+j)<='9')j+;return 1;int transMAC(char *argv,unsigned char *b)char mac18;int i=0,j=0,k=0;strcpy(mac,argv);int m=strlen(argv);for(i=0;i<m;i+) /判

19、斷命令行輸入的MAC地址是否正確if(maci<'0'|(maci>':'&&maci<'A')|(maci>'Z'&&maci<'a')|maci>'z')cout<<"輸入mac:"<<argv<<"格式錯誤"<<endl;return 0;elseif(maci!=':')j+;elsek+;if(j>2)cout&l

20、t;<"輸入mac:"<<argv<<"格式錯誤"<<endl;return 0;elsej=0;if(k>5)cout<<"輸入mac:"<<argv<<"格式錯誤"<<endl;return 0;for(i=0;i<6;i+) /填充MAC地址while(*(mac+j)=':'|*(mac+j)='-')j+;if(*(mac+j)>='0'&&a

21、mp;*(mac+j)<='9')bi=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')bi=(unsigned char)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='Z')bi=(unsigned char)(*(mac+j)-'A'+10);j+;bi*=16;if(*(mac+

22、j)>='0'&&*(mac+j)<='9')bi+=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')bi+=(unsigned char)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='Z')bi+=(unsigned char)(*(mac+j)-'A&

23、#39;+10); j+;return 1;bool Send() char AdapterNameA8192; char AdapterNameU2*sizeof(AdapterNameA); unsigned long AdapterAlength=sizeof(AdapterNameA); unsigned long AdapterUlength=2*sizeof(AdapterNameA); DWORD dwVersion=GetVersion (); DWORD dwWindowsMajorVersion=(DWORD)(LOBYTE(LOWORD(dwVersion); if(!(

24、dwVersion >= 0x80000000 && dwWindowsMajorVersion >=4)/Windows NT/獲取UNICODE碼網(wǎng)卡名列表if(PacketGetAdapterNames(AdapterNameU,&AdapterUlength)=FALSE)cout<<"無法得到網(wǎng)卡列表!"<<endl;return FALSE;/將第一個網(wǎng)卡名轉(zhuǎn)為ASCII碼unsigned short *pAdapterName=(unsigned short *)AdapterNameU;for(un

25、signed i=0;i<AdapterAlength;i+)if(AdapterNameAi=(char)pAdapterNamei)='0')break;else/Windows 9x/獲取ASCII碼網(wǎng)卡名列表if(PacketGetAdapterNames(AdapterNameA,&AdapterAlength)=FALSE)cout<<"無法得到網(wǎng)卡列表!"<<endl;return FALSE;lpAdapter=PacketOpenAdapter(AdapterNameU);/打開網(wǎng)卡if(!lpAdap

26、ter|lpAdapter->hFile=INVALID_HANDLE_VALUE)cout<<"無法打開網(wǎng)卡,錯誤碼:"<<GetLastError()<<endl;return FALSE;/發(fā)送幀LPPACKET lpPacket; /分配發(fā)送包結(jié)構(gòu)if(lpPacket=PacketAllocatePacket()!=NULL)/初始化發(fā)送包結(jié)構(gòu)PacketInitPacket(lpPacket,&ARPPACKET,sizeof(ARPPACKET);/ 每次只發(fā)送一個包PacketSetNumWrites(lpA

27、dapter,1);/發(fā)送包if(PacketSendPacket(lpAdapter,lpPacket,true)=1)cout<<"send ok"<<endl;elsecout<<"發(fā)送包失敗"<<endl;PacketFreePacket(lpPacket); /釋放發(fā)送包結(jié)構(gòu)elsecout<<"分配發(fā)送包LPPACKET結(jié)構(gòu)失敗!"<<endl; PacketCloseAdapter(lpAdapter);return TRUE;3.程序運行結(jié)果分析 1)安裝驅(qū)動程序。下載Winpcap Driver軟件并安裝,安裝后重啟機器。 2)下載wpdpack(Developers pack)。解壓后會看到其中包含docs、Include、lib、Examp

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論