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

下載本文檔

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

文檔簡介

1、 計算機網(wǎng)絡課程設計實驗報告題 目 發(fā)送Ethernet ARP包 學 院 數(shù)理與信息工程學院 專 業(yè) 計算機科學與技術 班 級 計科101 學 號 201059225101 學生姓名 王立娟 同組成員 潘明越、曾兵、田勝杰、宋煉杰、陳坦、韋國挺 指導教師 郭步 編寫日期 2012-6-30 目錄一、程設計的目的和意義2二、設計的內容和要求2三、設計的相關技術33.1 ARP協(xié)議及工作原理33.2 ARP的分組格式33.3工作原理43.4 ARP包的填充6四、程設計過程64.1流程圖74.2源程序84.3運行結果18五、課程設計小結19六、參考文獻19一、程設計的目的和意義IP地址將不同的物理

2、地址統(tǒng)一起來,從而將物理地址隱藏起來,上層軟件使用IP地址標識結點。但是。兩臺計算機只有在知道彼此的物理地址時才能進行通信。IP數(shù)據(jù)包常通過Ethernet發(fā)送。Ethernet設備并不識別32位IP地址,它們是以48位MAC地址傳輸Ethernet數(shù)據(jù)包的。因此,IP驅動器必須把IP目的地址轉換成Ethernet網(wǎng)絡目的地址。這兩種地址之間存在著某種靜態(tài)的或動態(tài)的映射,通常需要查看一張表來進行這種映射。這種地址協(xié)議(ARP)就是用來確定這些映象的協(xié)議。ARP工作時,送出一個所希望的IP地址的Ethernet廣播數(shù)據(jù)包。目的地主機以一個含有IP和Ethernet地址對的數(shù)據(jù)包作為應答。發(fā)送者將

3、這個地址對高速緩存起來,以節(jié)約不必要的ARP通信。本課程設計的目的是進一步熟悉ARP協(xié)議的幀結構以及它的運行過程。二、設計的內容和要求2.1 基本要求 本次課程設計的基本要求是在熟悉ARP協(xié)議并了解Winpcap編程,或者下載JAVA類:jpcap包構造ARP包,選擇并打開網(wǎng)卡,將ARP包發(fā)送。1)命令行格式: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表示AR

4、P應答。例如:arpsend FA:01:02:03:04:05 0D:E1:02:03:B4:06 12)輸出:Send OK。3)程序的正確性的檢驗。可以安裝一個截包軟件,如Iris,運行該軟件以查看能否收到程序發(fā)出的ARP包,并檢查包中個字段填充的內容(如各地址,協(xié)議類型)是否正確。Error! No bookmark name given.2. 2系統(tǒng)開發(fā)語言及環(huán)境的選擇操作系統(tǒng):Windows XP Professional運行環(huán)境:Microsoft Visual C+ 6.0開發(fā)語言:C語言,C+等三、設計的相關技術3.1 ARP協(xié)

5、議及工作原理 ARP協(xié)議是“Address Resolution Protocol”(地址解析協(xié)議)的縮寫。在局域網(wǎng)中,網(wǎng)絡中實際傳輸?shù)氖恰皫保瑤锩媸怯心繕酥鳈C的MAC地址的。在以太網(wǎng)中,一個主機要和另一個主機進行直接通信,必須要知道目標主機的MAC地址。但這個目標MAC地址是如何獲得的呢?它就是通過地址解析協(xié)議獲得的。所謂“地址解析”就是主機在發(fā)送幀前將目標IP地址轉換成目標MAC地址的過程。ARP協(xié)議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC地址,以保證通信的順利進行。ARP的基本運行過程是:1) 主機A希望發(fā)送數(shù)據(jù)分組給主機B,但不知道B的物理地址。2) A發(fā)送廣播報

6、文,要求B主機用它的物理地址來響應。3) 網(wǎng)站上所有主機都接收到這個分組。4) B識別出自己的IP地址,發(fā)送應答報文,告訴A自己的物理地址。32 ARP的分組格式物理幀頭(14B)ARP幀結構(28B)填充數(shù)據(jù)(18B)CRC(4B)圖一 ARP分組格式目的MAC (6B)源MAC(6B) 類型(2B) 圖2 物理幀頭 0 8 16 24 31(位) 硬件類型(Ethernet:0x1) 上層協(xié)議類型(IP:0x0800)硬件地址長度(0x6)IP地址長度(0x4) 操作(請求: 0x1; 應答: 0x2) 源MAC地址 源MAC地址 源IP地址 源IP地址 目的MAC地址 目的MAC地址 目

7、的IP地址圖3 ARP幀結構3.3工作原理: 源主機在傳輸數(shù)據(jù)前,首先要對初始數(shù)據(jù)進行封裝,在該過程中會把目的主機的IP地址和MAC地址封裝進去。在通信的最初階段,我們能夠知道目的主機的IP地址,而MAC地址卻是未知的。這時如果目的主機和源主機在同一個網(wǎng)段內,源主機會以第二層廣播的方式發(fā)送ARP請求報文。ARP請求報文中含有源主機的IP地址和MAC地址,以及目的主機的IP地址。當該報文通過廣播方式到達目的 主機時,目的主機會響應該請求,并返回ARP響應報文,從而源主機可以獲取目的主機的MAC地址,同樣目的主機也能夠獲得源主機的MAC地址。如果目的主機和源主機地址不在同一個網(wǎng)段內,源主機發(fā)出的I

8、P數(shù)據(jù)包會送到交換機的默認網(wǎng)關,而默認網(wǎng)關的MAC地址同樣可以通過ARP協(xié)議獲取。經(jīng)過ARP協(xié)議解析IP地址之后,主機會在緩存中保存IP地址和MAC地址的映射條目,此后再進行數(shù)據(jù)交換時只要從緩存中讀取映射條目即可。ARP協(xié)議工作原理詳見圖4.圖4 網(wǎng)段內ARP工作原理關于ARP的功能,僅限于在沒有安全防護的網(wǎng)絡里。1) 如果有多個用戶都在同一個網(wǎng)關上網(wǎng),那么若要禁止機器A上網(wǎng),應該怎么做呢?就是讓A得不到正確的網(wǎng)關的ARP映射。可以采取如下措施:偽裝成網(wǎng)關,給機器A發(fā)送ARP包,該ARP的發(fā)送方為網(wǎng)關的IP,而MAC部分隨便填一個地址;接收方正確填寫A的相關信息。2)基于ARP欺騙的監(jiān)聽。如果

9、某臺計算機C和計算機A、B位于同一個局域網(wǎng)內,那么如何監(jiān)聽A和B間的通信呢?很簡單,對A說“我是B”,在對B說“我是A”。具體的操作如下:給A發(fā)送一個偽造的ARP回應包,告訴A,B的IP對應的MAC為C的MAC地址,于是A就會相應地刷新自己的ARP緩存,將發(fā)給B的數(shù)據(jù)都發(fā)送到主機C上來。當然,因為ARP緩存是動態(tài)的,有超時時間,所以必須每隔一段時間就給A發(fā)送一個ARP回應包。為了不讓B發(fā)現(xiàn),我們還要對每次接受到的數(shù)據(jù)包進行轉發(fā)。這樣就監(jiān)聽了A發(fā)送給B的信息。如果想監(jiān)聽B發(fā)送給A的信息,方法類似。34 ARP包的填充 將命令行的參數(shù)作適當?shù)霓D換后填到ARP分組結構的各字段中即可。 要注意的是,填

10、充請求包時。因為包要在Ethernet上廣播,所以,物理幀頭的“目的MAC”字段要填充為FFFFFFFFFFFF;而ARP幀結構中的目的MAC可填充為任意值,因為它此時不起作用?!疤畛鋽?shù)據(jù)”字段要填充為0。四、程設計過程4.1 流程圖Y獲取網(wǎng)卡列表?選擇網(wǎng)卡打開?命令行參數(shù) = 6?Flag=0?發(fā)送包成功? 開始YNYNYNNNY結束關閉網(wǎng)卡 釋放包結構分配及初始化發(fā)送包結構進入發(fā)送ARP包函數(shù)填充DLC的其他字段及ARP頭的各字段ARP請求,填充DLC頭中目的MAC及FlagARP請求,填充DLC頭中目的MAC(廣播,全F)及Flag定義ARP包結構并初始化 圖5 程序流程圖4.2源程序#

11、include <iostream.h>#include <fstream.h>#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <Packet32.h>#include <Ntddndis.h>#pragma comment(lib,"ws2_32.lib")/ DLC頭typedef struct DLCHeader unsigned char DesMAC6; unsigned char SrcMAC6; u

12、nsigned short Ethertype; DLCHEADER;/ ARP楨typedef struct ARPFrame unsigned short HW_Type; unsigned short Prot_Type; unsigned char HW_Addr_Len; unsigned char Prot_Addr_Len; unsigned short Flag; unsigned char Send_HW_Addr6; unsigned char Send_Prot_Addr4; unsigned char Targ_HW_Addr6; unsigned char Targ_

13、Prot_Addr4; unsigned char padding18; ARPFRAME;/ ARP包=DLC頭+ARP楨typedef struct ARPPacket DLCHeader dlcHeader; ARPFrame arpFrame;*PARPPACKET;ARPPacket ARPPACKET;/源文件.cpp#include <iostream.h>#include <string.h> /#include "h.h"int transIP(char *,unsigned char *);int transMAC(char *,

14、unsigned char *);LPADAPTER lpAdapter;LPPACKET lpPacket;bool Send();void main(int argc,char *argv)if(argc!=6) cout<<"輸入格式錯誤"<<endl; return;int i=0;memset(&ARPPACKET, 0, sizeof(ARPPACKET);if(*argv5='0') for(i=0;i<6;i+) ARPPACKET.dlcHeader.DesMACi=0xff; ARPPACKET.ar

15、pFrame.Flag=(unsigned short)1;else if(*argv5='1') /填充DLC頭中目的MAC地址 if(!transMAC(argv4,ARPPACKET.dlcHeader.DesMAC) return; /ARP楨中flag位置2 ARPPACKET.arpFrame.Flag=(unsigned short)0x0200; else cout<<"flag位輸入錯誤"<<endl;if(!transMAC(argv2,ARPPACKET.dlcHeader.SrcMAC) return;/填充D

16、LC頭中楨類型ARPPACKET.dlcHeader.Ethertype=htons(unsigned short)0x0608);ARPPACKET.arpFrame.HW_Type=(unsigned short)0x0100;/(Ethernet類型)ARPPACKET.arpFrame.Prot_Type=(unsigned short)0x0008;ARPPACKET.arpFrame.HW_Addr_Len=(unsigned char)6;ARPPACKET.arpFrame.Prot_Addr_Len=(unsigned char)4;if(!transMAC(argv2,AR

17、PPACKET.arpFrame.Send_HW_Addr) return;if(!transIP(argv1,ARPPACKET.arpFrame.Send_Prot_Addr) return;if(!transMAC(argv4,ARPPACKET.arpFrame.Targ_HW_Addr) return;if(!transIP(argv3,ARPPACKET.arpFrame.Targ_Prot_Addr) return;for(i=0;i<18;i+) ARPPACKET.arpFrame.paddingi=0;if(!Send() cout<<"發(fā)送ar

18、p包失敗"<<endl;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:"<<argv<<"格式錯誤"

19、<<endl; return 0; else if(ipi!='.')j+; else k+; if(j>3) cout<<"輸入ip:"<<argv<<"格式錯誤"<<endl; return 0; else j=0; if(k>3) cout<<"輸入ip:"<<argv<<"格式錯誤"<<endl; return 0; j=0; for(i=0;i<4;i+) /填充I

20、P地址 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+) /判斷命令行

21、輸入的MAC地址是否正確 if(maci<'0'|(maci>':'&&maci<'A')|(maci>'Z'&&maci<'a')|maci>'Z') cout<<"輸入mac:"<<argv<<"格式錯誤"<<endl; return 0; else if(maci!=':')j+; else k+; if(j>2) c

22、out<<"輸入mac"<<argv<<"格式錯誤"<<endl; return 0; else j=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

23、'&&*(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

24、+; bi*=16; if(*(mac+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+=(unsign

25、ed char)(*(mac+j)-'A'+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)(LOBYT

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

27、igned short *)AdapterNameU; for(unsigned 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=Pack

28、etOpenAdapter(AdapterNameA); if(!lpAdapter|lpAdapter->hFile=INVALID_HANDLE_VALUE) cout<<"無法打開網(wǎng)卡,錯誤碼:"<<GetLastError()<<endl; return FALSE; /發(fā)送幀 LPPACKET lpPacket; /分配發(fā)送包結構 if(lpPacket=PacketAllocatePacket()!=NULL) /初始化發(fā)送包結構 PacketInitPacket(lpPacket,&ARPPACKET,size

29、of(ARPPACKET); / 每次只發(fā)送一個包 PacketSetNumWrites(lpAdapter,1); /發(fā)送包 if(PacketSendPacket(lpAdapter,lpPacket,true)=1) cout<<"send ok"<<endl; else cout<<"發(fā)送包失敗"<<endl; PacketFreePacket(lpPacket); /釋放發(fā)送包結構 else cout<<"分配發(fā)送包LPPACKET結構失敗!"<<end

30、l; PacketCloseAdapter(lpAdapter); return TRUE; 4.3運行結果1.應該在預編譯代碼區(qū)加上預編譯指令:#pragma comment(lib, "ws2_32.lib");否則,鏈接時會出現(xiàn)符號無法解析的錯誤。2.程序中填充DLC頭中幀類型應該是:ARPPACKET.dlcHeader.Ethertype = htons(unsigned short)0x0806);而實驗所給的代碼卻是:ARPPACKET.dlcHeader.Ethertype = htons(unsigned short)0x0608);。而ARP報文封裝在以太網(wǎng)幀中的幀類型字段應該是0x0806。3.程序在int transMAC(char *argv, unsigned char *b)函數(shù)中,判斷MAC地址的格式是否正確后,在填充MAC地址之前,應該初始化局部變量j的值,即:j=0;。否則,在MAC地址格式正確的情況下,j的值為2,而后面填充MAC地址的時候會把正確的MAC地址的第一個十六進制字段刪除。例如:正確的MAC地址- 11:12:13

溫馨提示

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

評論

0/150

提交評論