版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告題 目 發(fā)送Ethernet ARP包 學(xué) 院 數(shù)理與信息工程學(xué)院 專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) 班 級 計(jì)科101 學(xué) 號 201059225101 學(xué)生姓名 王立娟 同組成員 潘明越、曾兵、田勝杰、宋煉杰、陳坦、韋國挺 指導(dǎo)教師 郭步 編寫日期 2012-6-30 目錄一、程設(shè)計(jì)的目的和意義2二、設(shè)計(jì)的內(nèi)容和要求2三、設(shè)計(jì)的相關(guān)技術(shù)33.1 ARP協(xié)議及工作原理33.2 ARP的分組格式33.3工作原理43.4 ARP包的填充6四、程設(shè)計(jì)過程64.1流程圖74.2源程序84.3運(yùn)行結(jié)果18五、課程設(shè)計(jì)小結(jié)19六、參考文獻(xiàn)19一、程設(shè)計(jì)的目的和意義IP地址將不同的物理
2、地址統(tǒng)一起來,從而將物理地址隱藏起來,上層軟件使用IP地址標(biāo)識結(jié)點(diǎn)。但是。兩臺計(jì)算機(jī)只有在知道彼此的物理地址時(shí)才能進(jìn)行通信。IP數(shù)據(jù)包常通過Ethernet發(fā)送。Ethernet設(shè)備并不識別32位IP地址,它們是以48位MAC地址傳輸Ethernet數(shù)據(jù)包的。因此,IP驅(qū)動(dòng)器必須把IP目的地址轉(zhuǎn)換成Ethernet網(wǎng)絡(luò)目的地址。這兩種地址之間存在著某種靜態(tài)的或動(dòng)態(tài)的映射,通常需要查看一張表來進(jìn)行這種映射。這種地址協(xié)議(ARP)就是用來確定這些映象的協(xié)議。ARP工作時(shí),送出一個(gè)所希望的IP地址的Ethernet廣播數(shù)據(jù)包。目的地主機(jī)以一個(gè)含有IP和Ethernet地址對的數(shù)據(jù)包作為應(yīng)答。發(fā)送者將
3、這個(gè)地址對高速緩存起來,以節(jié)約不必要的ARP通信。本課程設(shè)計(jì)的目的是進(jìn)一步熟悉ARP協(xié)議的幀結(jié)構(gòu)以及它的運(yùn)行過程。二、設(shè)計(jì)的內(nèi)容和要求2.1 基本要求 本次課程設(shè)計(jì)的基本要求是在熟悉ARP協(xié)議并了解Winpcap編程,或者下載JAVA類:jpcap包構(gòu)造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應(yīng)答。例如:arpsend FA:01:02:03:04:05 0D:E1:02:03:B4:06 12)輸出:Send OK。3)程序的正確性的檢驗(yàn)。可以安裝一個(gè)截包軟件,如Iris,運(yùn)行該軟件以查看能否收到程序發(fā)出的ARP包,并檢查包中個(gè)字段填充的內(nèi)容(如各地址,協(xié)議類型)是否正確。Error! No bookmark name given.2. 2系統(tǒng)開發(fā)語言及環(huán)境的選擇操作系統(tǒng):Windows XP Professional運(yùn)行環(huán)境:Microsoft Visual C+ 6.0開發(fā)語言:C語言,C+等三、設(shè)計(jì)的相關(guān)技術(shù)3.1 ARP協(xié)
5、議及工作原理 ARP協(xié)議是“Address Resolution Protocol”(地址解析協(xié)議)的縮寫。在局域網(wǎng)中,網(wǎng)絡(luò)中實(shí)際傳輸?shù)氖恰皫保瑤锩媸怯心繕?biāo)主機(jī)的MAC地址的。在以太網(wǎng)中,一個(gè)主機(jī)要和另一個(gè)主機(jī)進(jìn)行直接通信,必須要知道目標(biāo)主機(jī)的MAC地址。但這個(gè)目標(biāo)MAC地址是如何獲得的呢?它就是通過地址解析協(xié)議獲得的。所謂“地址解析”就是主機(jī)在發(fā)送幀前將目標(biāo)IP地址轉(zhuǎn)換成目標(biāo)MAC地址的過程。ARP協(xié)議的基本功能就是通過目標(biāo)設(shè)備的IP地址,查詢目標(biāo)設(shè)備的MAC地址,以保證通信的順利進(jìn)行。ARP的基本運(yùn)行過程是:1) 主機(jī)A希望發(fā)送數(shù)據(jù)分組給主機(jī)B,但不知道B的物理地址。2) A發(fā)送廣播報(bào)
6、文,要求B主機(jī)用它的物理地址來響應(yīng)。3) 網(wǎng)站上所有主機(jī)都接收到這個(gè)分組。4) B識別出自己的IP地址,發(fā)送應(yīng)答報(bào)文,告訴A自己的物理地址。32 ARP的分組格式物理幀頭(14B)ARP幀結(jié)構(gòu)(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; 應(yīng)答: 0x2) 源MAC地址 源MAC地址 源IP地址 源IP地址 目的MAC地址 目的MAC地址 目
7、的IP地址圖3 ARP幀結(jié)構(gòu)3.3工作原理: 源主機(jī)在傳輸數(shù)據(jù)前,首先要對初始數(shù)據(jù)進(jìn)行封裝,在該過程中會(huì)把目的主機(jī)的IP地址和MAC地址封裝進(jìn)去。在通信的最初階段,我們能夠知道目的主機(jī)的IP地址,而MAC地址卻是未知的。這時(shí)如果目的主機(jī)和源主機(jī)在同一個(gè)網(wǎng)段內(nèi),源主機(jī)會(huì)以第二層廣播的方式發(fā)送ARP請求報(bào)文。ARP請求報(bào)文中含有源主機(jī)的IP地址和MAC地址,以及目的主機(jī)的IP地址。當(dāng)該報(bào)文通過廣播方式到達(dá)目的 主機(jī)時(shí),目的主機(jī)會(huì)響應(yīng)該請求,并返回ARP響應(yīng)報(bào)文,從而源主機(jī)可以獲取目的主機(jī)的MAC地址,同樣目的主機(jī)也能夠獲得源主機(jī)的MAC地址。如果目的主機(jī)和源主機(jī)地址不在同一個(gè)網(wǎng)段內(nèi),源主機(jī)發(fā)出的I
8、P數(shù)據(jù)包會(huì)送到交換機(jī)的默認(rèn)網(wǎng)關(guān),而默認(rèn)網(wǎng)關(guān)的MAC地址同樣可以通過ARP協(xié)議獲取。經(jīng)過ARP協(xié)議解析IP地址之后,主機(jī)會(huì)在緩存中保存IP地址和MAC地址的映射條目,此后再進(jìn)行數(shù)據(jù)交換時(shí)只要從緩存中讀取映射條目即可。ARP協(xié)議工作原理詳見圖4.圖4 網(wǎng)段內(nèi)ARP工作原理關(guān)于ARP的功能,僅限于在沒有安全防護(hù)的網(wǎng)絡(luò)里。1) 如果有多個(gè)用戶都在同一個(gè)網(wǎng)關(guān)上網(wǎng),那么若要禁止機(jī)器A上網(wǎng),應(yīng)該怎么做呢?就是讓A得不到正確的網(wǎng)關(guān)的ARP映射??梢圆扇∪缦麓胧簜窝b成網(wǎng)關(guān),給機(jī)器A發(fā)送ARP包,該ARP的發(fā)送方為網(wǎng)關(guān)的IP,而MAC部分隨便填一個(gè)地址;接收方正確填寫A的相關(guān)信息。2)基于ARP欺騙的監(jiān)聽。如果
9、某臺計(jì)算機(jī)C和計(jì)算機(jī)A、B位于同一個(gè)局域網(wǎng)內(nèi),那么如何監(jiān)聽A和B間的通信呢?很簡單,對A說“我是B”,在對B說“我是A”。具體的操作如下:給A發(fā)送一個(gè)偽造的ARP回應(yīng)包,告訴A,B的IP對應(yīng)的MAC為C的MAC地址,于是A就會(huì)相應(yīng)地刷新自己的ARP緩存,將發(fā)給B的數(shù)據(jù)都發(fā)送到主機(jī)C上來。當(dāng)然,因?yàn)锳RP緩存是動(dòng)態(tài)的,有超時(shí)時(shí)間,所以必須每隔一段時(shí)間就給A發(fā)送一個(gè)ARP回應(yīng)包。為了不讓B發(fā)現(xiàn),我們還要對每次接受到的數(shù)據(jù)包進(jìn)行轉(zhuǎn)發(fā)。這樣就監(jiān)聽了A發(fā)送給B的信息。如果想監(jiān)聽B發(fā)送給A的信息,方法類似。34 ARP包的填充 將命令行的參數(shù)作適當(dāng)?shù)霓D(zhuǎn)換后填到ARP分組結(jié)構(gòu)的各字段中即可。 要注意的是,填
10、充請求包時(shí)。因?yàn)榘贓thernet上廣播,所以,物理幀頭的“目的MAC”字段要填充為FFFFFFFFFFFF;而ARP幀結(jié)構(gòu)中的目的MAC可填充為任意值,因?yàn)樗藭r(shí)不起作用?!疤畛鋽?shù)據(jù)”字段要填充為0。四、程設(shè)計(jì)過程4.1 流程圖Y獲取網(wǎng)卡列表?選擇網(wǎng)卡打開?命令行參數(shù) = 6?Flag=0?發(fā)送包成功? 開始YNYNYNNNY結(jié)束關(guān)閉網(wǎng)卡 釋放包結(jié)構(gòu)分配及初始化發(fā)送包結(jié)構(gòu)進(jìn)入發(fā)送ARP包函數(shù)填充DLC的其他字段及ARP頭的各字段ARP請求,填充DLC頭中目的MAC及FlagARP請求,填充DLC頭中目的MAC(廣播,全F)及Flag定義ARP包結(jié)構(gòu)并初始化 圖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<<"輸入格式錯(cuò)誤"<<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位輸入錯(cuò)誤"<<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<<"格式錯(cuò)誤"
19、<<endl; return 0; else if(ipi!='.')j+; else k+; if(j>3) cout<<"輸入ip:"<<argv<<"格式錯(cuò)誤"<<endl; return 0; else j=0; if(k>3) cout<<"輸入ip:"<<argv<<"格式錯(cuò)誤"<<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<<"格式錯(cuò)誤"<<endl; return 0; else if(maci!=':')j+; else k+; if(j>2) c
22、out<<"輸入mac"<<argv<<"格式錯(cuò)誤"<<endl; return 0; else j=0; if(k>5) cout<<"輸入mac"<<argv<<"格式錯(cuò)誤"<<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; /將第一個(gè)網(wǎng)卡名轉(zhuǎn)為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)卡,錯(cuò)誤碼:"<<GetLastError()<<endl; return FALSE; /發(fā)送幀 LPPACKET lpPacket; /分配發(fā)送包結(jié)構(gòu) if(lpPacket=PacketAllocatePacket()!=NULL) /初始化發(fā)送包結(jié)構(gòu) PacketInitPacket(lpPacket,&ARPPACKET,size
29、of(ARPPACKET); / 每次只發(fā)送一個(gè)包 PacketSetNumWrites(lpAdapter,1); /發(fā)送包 if(PacketSendPacket(lpAdapter,lpPacket,true)=1) cout<<"send ok"<<endl; else cout<<"發(fā)送包失敗"<<endl; PacketFreePacket(lpPacket); /釋放發(fā)送包結(jié)構(gòu) else cout<<"分配發(fā)送包LPPACKET結(jié)構(gòu)失敗!"<<end
30、l; PacketCloseAdapter(lpAdapter); return TRUE; 4.3運(yùn)行結(jié)果1.應(yīng)該在預(yù)編譯代碼區(qū)加上預(yù)編譯指令:#pragma comment(lib, "ws2_32.lib");否則,鏈接時(shí)會(huì)出現(xiàn)符號無法解析的錯(cuò)誤。2.程序中填充DLC頭中幀類型應(yīng)該是:ARPPACKET.dlcHeader.Ethertype = htons(unsigned short)0x0806);而實(shí)驗(yàn)所給的代碼卻是:ARPPACKET.dlcHeader.Ethertype = htons(unsigned short)0x0608);。而ARP報(bào)文封裝在以太網(wǎng)幀中的幀類型字段應(yīng)該是0x0806。3.程序在int transMAC(char *argv, unsigned char *b)函數(shù)中,判斷MAC地址的格式是否正確后,在填充MAC地址之前,應(yīng)該初始化局部變量j的值,即:j=0;。否則,在MAC地址格式正確的情況下,j的值為2,而后面填充MAC地址的時(shí)候會(huì)把正確的MAC地址的第一個(gè)十六進(jìn)制字段刪除。例如:正確的MAC地址- 11:12:13
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024預(yù)制板購銷合同
- 2025年度瓷磚研發(fā)中心實(shí)驗(yàn)室建設(shè)與運(yùn)營合同3篇
- 2025年度危險(xiǎn)化學(xué)品儲存安全管理承包合同4篇
- 2025年度智能物流中心建設(shè)與運(yùn)營管理合同4篇
- 2025年度商業(yè)地產(chǎn)租賃代理服務(wù)合同模板4篇
- 2024物業(yè)項(xiàng)目策劃2024委托代理合同
- 2025年度醫(yī)療器械代生產(chǎn)加工合同范本4篇
- 2025年度特殊用途車牌租賃與押金管理協(xié)議4篇
- 2025年度展會(huì)現(xiàn)場安保及應(yīng)急預(yù)案服務(wù)合同3篇
- 2024鐵路鋼軌鋪設(shè)及維護(hù)工程協(xié)議細(xì)則
- 勞動(dòng)合同續(xù)簽意見單
- 大學(xué)生國家安全教育意義
- 2024年保育員(初級)培訓(xùn)計(jì)劃和教學(xué)大綱-(目錄版)
- 河北省石家莊市2023-2024學(xué)年高二上學(xué)期期末考試 語文 Word版含答案
- 企業(yè)正確認(rèn)識和運(yùn)用矩陣式管理
- 分布式光伏高處作業(yè)專項(xiàng)施工方案
- 陳閱增普通生物學(xué)全部課件
- 檢驗(yàn)科主任就職演講稿范文
- 人防工程主體監(jiān)理質(zhì)量評估報(bào)告
- 20225GRedCap通信技術(shù)白皮書
- 燃?xì)庥邢薰究蛻舴?wù)規(guī)范制度
評論
0/150
提交評論