新實(shí)驗(yàn) 地址解析協(xié)議_第1頁
新實(shí)驗(yàn) 地址解析協(xié)議_第2頁
新實(shí)驗(yàn) 地址解析協(xié)議_第3頁
新實(shí)驗(yàn) 地址解析協(xié)議_第4頁
新實(shí)驗(yàn) 地址解析協(xié)議_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實(shí)驗(yàn)2地址解析協(xié)議(ARP)實(shí)驗(yàn)2地址解析協(xié)議(ARP)【實(shí)驗(yàn)?zāi)康摹?.掌握ARP協(xié)議的報(bào)文格式2.掌握ARP協(xié)議的工作原理3.理解ARP高速緩存的作用4.掌握ARP請(qǐng)求和應(yīng)答的實(shí)現(xiàn)方法5.掌握ARP緩存表的維護(hù)過程【學(xué)時(shí)分配】2學(xué)時(shí)【實(shí)驗(yàn)環(huán)境】該實(shí)驗(yàn)采用網(wǎng)絡(luò)結(jié)構(gòu)二【實(shí)驗(yàn)原理】一.物理地址與邏輯地址1.物理地址物理地址是節(jié)點(diǎn)的地址,由它所在的局域網(wǎng)或廣域網(wǎng)定義。物理地址包含在數(shù)據(jù)鏈路層的幀中。物理地址是最低一級(jí)的地址。物理地址的長度和格式是可變的,取決于具體的網(wǎng)絡(luò)。以太網(wǎng)使用寫在網(wǎng)絡(luò)接口卡(NIC)上的6字節(jié)的標(biāo)識(shí)作為物理地址。物理地址可以是單播地址(一個(gè)接收者)、多播地址(一組接收者)或廣播地址(由網(wǎng)絡(luò)中的所有主機(jī)接收)。有些網(wǎng)絡(luò)不支持多播或廣播地址,當(dāng)需要把幀發(fā)送給一組主機(jī)或所有主機(jī)時(shí),多播地址或廣播地址就需要用單播地址來模擬。2.邏輯地址在互聯(lián)網(wǎng)的環(huán)境中僅使用物理地址是不合適的,因?yàn)椴煌W(wǎng)絡(luò)可以使用不同的地址格式。因此,需要一種通用的編址系統(tǒng),用來惟一地標(biāo)識(shí)每一臺(tái)主機(jī),而不管底層使用什么樣的物理網(wǎng)絡(luò)。邏輯地址就是為此目的而設(shè)計(jì)的。目前Internet上的邏輯地址是32位地址,通常稱為IP地址,可以用來標(biāo)識(shí)連接在Internet上的每一臺(tái)主機(jī)。在Internet上沒有兩個(gè)主機(jī)具有同樣的IP地址。邏輯地址可以是單播地址、多播地址和廣播地址。其中廣播地址有一些局限性。在實(shí)驗(yàn)三中將詳細(xì)介紹這三種類型的地址。二.ARP協(xié)議簡介Internet是由各種各樣的物理網(wǎng)絡(luò)通過使用諸如路由器之類的設(shè)備連接在一起組成的。主機(jī)發(fā)送一個(gè)數(shù)據(jù)包到另一臺(tái)主機(jī)時(shí)可能要經(jīng)過多種不同的物理網(wǎng)絡(luò)。主機(jī)和路由器都是在網(wǎng)絡(luò)層通過邏輯地址來識(shí)別的,這個(gè)地址是在全世界范圍內(nèi)是惟一的。然而,數(shù)據(jù)包是通過物理網(wǎng)絡(luò)傳遞的。在物理網(wǎng)絡(luò)中,主機(jī)和路由器通過其物理地址來識(shí)別的,其范圍限于本地網(wǎng)絡(luò)中。物理地址和邏輯地址是兩種不同的標(biāo)識(shí)符。這就意味著將一個(gè)數(shù)據(jù)包傳遞到一個(gè)主機(jī)或路由器需要進(jìn)行兩級(jí)尋址:邏輯地址和物理地址。需要能將一個(gè)邏輯地址映射到相應(yīng)的物理地址。ARP協(xié)議(地址解析協(xié)議)是“AddressResolutionProtocol”的縮寫。所謂“地址解析”就是主機(jī)在發(fā)送幀前將目的邏輯地址轉(zhuǎn)換成目的物理地址的過程。在使用TCP/IP協(xié)議的以太網(wǎng)中,ARP協(xié)議完成將IP地址映射到MAC地址的過程。三.ARP報(bào)文格式下圖為ARP數(shù)據(jù)報(bào)的報(bào)文格式:硬件類型(16位)協(xié)議類型(16位)硬件地址長度(8位)協(xié)議地址長度(8位)操作碼(16位)發(fā)送端硬件地址(例如,對(duì)以太網(wǎng)是6字節(jié))發(fā)送端邏輯地址(例如,對(duì)IP是4字節(jié))目的端硬件地址(例如,對(duì)以太網(wǎng)是6字節(jié))(在請(qǐng)求幀中不填入)目的端邏輯地址(例如,對(duì)IP是4字節(jié))圖2-1ARP報(bào)文格式ARP報(bào)文格式具有如下的一些字段:●硬件類型:這是16位字段,用來定義運(yùn)行ARP的網(wǎng)絡(luò)的類型。每一個(gè)局域網(wǎng)基于其類型被指派給一個(gè)整數(shù)。例如,以太網(wǎng)的硬件類型是1。ARP可用在任何網(wǎng)絡(luò)上?!駞f(xié)議類型:這是16位字段。用來定義協(xié)議的類型。例如,對(duì)IPv4協(xié)議,這個(gè)字段的值是0x0800。ARP可用于任何高層協(xié)議。●硬件地址長度:這是一個(gè)8位字段,用來定義以字節(jié)為單位的物理地址長度。例如,以太網(wǎng)物理地址為6字節(jié),所對(duì)應(yīng)的硬件地址長度值為6?!駞f(xié)議地址長度:標(biāo)識(shí)用于該數(shù)據(jù)包的邏輯地址的長度,用十進(jìn)制標(biāo)識(shí),單位為一個(gè)字節(jié),例如,IPv4為4個(gè)字節(jié),所對(duì)應(yīng)的協(xié)議地址長度值為4?!癫僮鞔a:這是16位字段,用來定義數(shù)據(jù)包的類型。已定義了兩種類型:為1時(shí)表示ARP請(qǐng)求,為2時(shí)表示ARP應(yīng)答?!癜l(fā)送端硬件地址:這是可變長度字段,用來定義發(fā)送端的物理地址。對(duì)于以太網(wǎng)這個(gè)字段是6字節(jié)長?!癜l(fā)送端邏輯地址:這是可變長度字段,用來定義發(fā)送端的邏輯地址。對(duì)于邏輯地址為IP地址的網(wǎng)絡(luò),該字段長度為4字節(jié)。●目的端硬件地址:這是可變長度字段,用來定義目標(biāo)的物理地址。對(duì)于ARP請(qǐng)求,字段是全0,因?yàn)榘l(fā)送端不知道目標(biāo)的物理地址(該字段長度為可變,如以太網(wǎng)硬件地址為6個(gè)字節(jié))?!衲康亩诉壿嫷刂罚哼@是可變長度字段,用來定義目標(biāo)的邏輯地址(該字段長度為可變,如IPv4協(xié)議的邏輯地址為4個(gè)字節(jié))。四.ARP封裝ARP數(shù)據(jù)報(bào)直接封裝在數(shù)據(jù)鏈路幀中。例如,在下圖中,ARP數(shù)據(jù)包封裝在以太網(wǎng)的幀中。類型字段值為0x0806指出了此幀所攜帶的數(shù)據(jù)是ARP數(shù)據(jù)包。圖2-2ARP數(shù)據(jù)包的封裝五.ARP的運(yùn)行過程數(shù)據(jù)包傳輸過程可分為如下步驟:1.發(fā)送端知道目的端的IP地址。2.IP要求ARP創(chuàng)建一個(gè)ARP請(qǐng)求報(bào)文,其中包含了發(fā)送方的物理地址、發(fā)送方的IP地址和目的端的IP地址。目的端的物理地址用0填充。3.將報(bào)文傳遞到數(shù)據(jù)鏈路層,并在該層中用發(fā)送方的物理地址作為源地址,用物理廣播地址作為目的地址,將其封裝在一個(gè)幀中。4.因?yàn)樵搸邪艘粋€(gè)廣播目的地址,所以同一鏈路中的每個(gè)主機(jī)或路由器都接收到這個(gè)幀。所有接收到該幀的主機(jī)都將其傳遞到ARP層進(jìn)行處理。除了目的端主機(jī)以外的所有主機(jī)都丟棄該報(bào)文。5.目的端主機(jī)用一個(gè)包含其物理地址的ARP應(yīng)答報(bào)文做出響應(yīng),并對(duì)該報(bào)文進(jìn)行單播。6.發(fā)送方接收到這個(gè)應(yīng)答報(bào)文,這樣它就知道了目標(biāo)主機(jī)的物理地址。ARP地址解析過程如下圖所示。圖2-3ARP地址解析過程六.ARP高速緩存在真正的協(xié)議實(shí)現(xiàn)中,并不是每次發(fā)送IP報(bào)文前都需要發(fā)送ARP請(qǐng)求報(bào)文來獲取目的MAC地址。在大多數(shù)的系統(tǒng)中都存在著一個(gè)ARP緩存表。記錄著一段時(shí)間內(nèi)曾經(jīng)獲取過的MAC地址和IP地址的映射關(guān)系,如下圖所示:IP地址MAC地址……00-E0-4C-3D-89-7600-E0-4C-3D-C5-0300-E0-4C-4D-BA-92……圖2-4ARP高速緩存發(fā)送IP數(shù)據(jù)報(bào)前先對(duì)ARP緩存表進(jìn)行查找,查看目的MAC地址是否存在于緩存表中,如果存在,則不需要發(fā)送ARP請(qǐng)求報(bào)文而直接使用此地址進(jìn)行IP數(shù)據(jù)包的發(fā)送。如果不存在,則發(fā)送ARP請(qǐng)求報(bào)文,在收到ARP應(yīng)答報(bào)文之后,使用應(yīng)答報(bào)文中的目的MAC地址發(fā)送IP數(shù)據(jù)包,并將目的MAC地址存于ARP緩存表中供以后使用。另外,ARP緩存表采用老化機(jī)制,在一段時(shí)間內(nèi)如果表中的某一項(xiàng)沒有使用,就會(huì)被刪除,這樣可以大大減少ARP緩存表的長度,加快查詢速度。下圖描述了ARP高速緩存的使用與更新過程:圖2-5ARP高速緩存的使用與更新過程七.代理ARP代理ARP可用來產(chǎn)生劃分子網(wǎng)的效應(yīng)。如果ARP請(qǐng)求是從一個(gè)網(wǎng)絡(luò)中的主機(jī)發(fā)往另一個(gè)網(wǎng)絡(luò)中的主機(jī),那么連接這兩個(gè)網(wǎng)絡(luò)的路由器就可以回答該請(qǐng)求,當(dāng)這個(gè)路由器收到真正的IP數(shù)據(jù)包時(shí),它就把該數(shù)據(jù)包發(fā)送給相應(yīng)的主機(jī)或路由器。例如,在下圖所示的網(wǎng)絡(luò)中,安裝在右邊主機(jī)上的代理ARP應(yīng)答對(duì)目標(biāo)IP地址為3的ARP請(qǐng)求。圖2-6代理ARP八.協(xié)議棧實(shí)現(xiàn)代碼解析本實(shí)驗(yàn)將通過對(duì)安裝目錄JLCSS\ExpCNC\Work\NPL\ExpNPL_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.h和netproto_arp_student.c兩個(gè)文件進(jìn)行編碼,完成協(xié)議棧中arp協(xié)議的實(shí)現(xiàn)。netproto_arp_student.h文件中定義了arp協(xié)議實(shí)現(xiàn)相關(guān)數(shù)值,關(guān)鍵代碼如下所示:#defineMAC_PROTO_ARP 0x0806

#defineARP_HWTYPE_ETH 0x0001

#defineARP_PROTOTYPE_IP 0x0800

#defineARP_HWADDR_LEN_ETH 0x06

#defineARP_PROTOADDR_LEN_IP 0x04

#defineARP_OPCODE_REQUEST 0x0001

#defineARP_OPCODE_RESPONSE 0x0002

#defineARP_DEST_IP "這段代碼定義了8個(gè)宏,他們代表的含義如下表所示:表2-1netproto_arp_student.h中定義的宏宏值描述MAC_PROTO_ARP0x0806定義以太網(wǎng)幀中的“協(xié)議類型或數(shù)據(jù)長度”字段的值A(chǔ)RP_HWTYPE_ETH0x0001定義arp包頭中“硬件類型”字段值A(chǔ)RP_PROTOTYPE_IP0x0800定義arp包頭中“協(xié)議類型”字段值A(chǔ)RP_HWADDR_LEN_ETH0x06定義arp包頭中“硬件地址長度”字段值A(chǔ)RP_PROTOADDR_LEN_IP0x04定義arp包頭中“協(xié)議地址長度”字段值A(chǔ)RP_OPCODE_REQUEST0x0001定義arp請(qǐng)求數(shù)據(jù)包頭中“操作碼”字段值A(chǔ)RP_OPCODE_RESPONSE0x0002定義arp應(yīng)答數(shù)據(jù)包頭中“操作碼”字段值A(chǔ)RP_DEST_IP"用點(diǎn)分十進(jìn)制表示的IP地址,定義arp包頭中“目的端邏輯地址”字段值在實(shí)驗(yàn)的編碼過程中,應(yīng)該使用這些宏對(duì)相應(yīng)的變量進(jìn)行賦值。netproto_arp_student.c文件是協(xié)議棧中arp協(xié)議的實(shí)現(xiàn)部分,其中定義了1個(gè)全局?jǐn)?shù)組以及3個(gè)函數(shù)。下面分別介紹這些協(xié)議棧的實(shí)現(xiàn)部分。全局?jǐn)?shù)組netp_arp_table是arp協(xié)議的緩存表,擁有NETP_ARP_TABLE_SIZE個(gè)netp_arp_table_item元素。其中NETP_ARP_TABLE_SIZE是arp緩存表的條目數(shù),默認(rèn)值為10,同學(xué)們不需要修改。netp_arp_table_item是一個(gè)結(jié)構(gòu)體,代表了arp緩存表中的一個(gè)條目,包括一個(gè)物理地址hardware_addr和一個(gè)IP地址ip_address,其定義如下:structnetp_arp_table_item

{

u8_thardware_addr[ETH_ADDRESS_LEN];

structip_addrip_address;

};需要根據(jù)arp協(xié)議的實(shí)現(xiàn)原理編寫代碼來維護(hù)arp緩存表。函數(shù)display_arp_table的功能是顯示arp緩存表中的條目,在實(shí)驗(yàn)中可以直接調(diào)用該函數(shù),便于查看arp緩存表中的內(nèi)容。函數(shù)netp_arp_output_student的功能是構(gòu)造并發(fā)送一個(gè)arp請(qǐng)求數(shù)據(jù)包。這個(gè)函數(shù)的編碼工作需要由學(xué)生完成。當(dāng)有數(shù)據(jù)到達(dá)本機(jī)網(wǎng)絡(luò)接口時(shí),函數(shù)netp_arp_input_student將被調(diào)用,并傳遞給這個(gè)函數(shù)原始數(shù)據(jù)。在本實(shí)驗(yàn)中該函數(shù)需要完成兩個(gè)功能,一是處理針對(duì)本機(jī)的arp請(qǐng)求數(shù)據(jù)包,二是處理針對(duì)本機(jī)的arp應(yīng)答數(shù)據(jù)包。處理針對(duì)本機(jī)的arp請(qǐng)求數(shù)據(jù)包時(shí),應(yīng)該發(fā)送相應(yīng)的arp應(yīng)答數(shù)據(jù)包。處理針對(duì)本機(jī)的arp應(yīng)答數(shù)據(jù)包時(shí),應(yīng)該更新arp緩存表。這個(gè)函數(shù)的編碼工作需要由學(xué)生完成。該函數(shù)的返回值為push_to_lwip的枚舉類型值,push_to_lwip的定義如下:enumpush_to_lwip{

NETP_PUSH_TO_LWIP,//數(shù)據(jù)處理完成后,交給lwIP繼續(xù)處理

NETP_NO_PUSH_LIWP//數(shù)據(jù)處理完成后,不交給lwIP繼續(xù)處理

//本層處理完畢以后數(shù)據(jù)包被丟棄

};返回NETP_PUSH_TO_LWIP表示這個(gè)數(shù)據(jù)幀應(yīng)該提交給協(xié)議棧上層繼續(xù)處理,而返回NETP_NO_PUSH_LIWP則表示不需要提交給協(xié)議棧上層處理,本層處理完畢后,這個(gè)數(shù)據(jù)幀將被丟棄。需要根據(jù)正確的邏輯關(guān)系返回適當(dāng)?shù)闹?,使協(xié)議棧正常工作。在編碼過程中可能會(huì)遇到一些結(jié)構(gòu)體、宏和函數(shù),下表對(duì)他們進(jìn)行介紹:表2-2實(shí)驗(yàn)涉及的結(jié)構(gòu)體和函數(shù)結(jié)構(gòu)體/函數(shù)聲明或定義描述structnetp_arp_table_itemstructnetp_arp_table_item{u8_thardware_addr[ETH_ADDRESS_LEN];structip_addrip_address;};ARP緩存表中一個(gè)條目的結(jié)構(gòu)structin_addrstructin_addr{u32_ts_addr;};32位地址structnetp_eth_headerstructnetp_eth_header{u8_tdest_address[ETH_ADDRESS_LEN];u8_tsour_address[ETH_ADDRESS_LEN];u16_ttype;};以太網(wǎng)幀頭結(jié)構(gòu)structnetp_arp_headerstructnetp_arp_header{u16_thardware_type;u16_tproto_type;u8_thw_addr_len;u8_tproto_addr_len;u16_topcode;u8_tsrc_hw_addr[ETH_ADDRESS_LEN];structip_addrsrc_ip_addr;u8_tdest_hw_addr[ETH_ADDRESS_LEN];structip_addrdest_ip_addr;};arp協(xié)議包頭結(jié)構(gòu)NETP_ARP_TABLE_SIZE#defineNETP_ARP_TABLE_SIZE10ARP緩存表中條目的個(gè)數(shù)ETH_ADDRESS_LEN#defineETH_ADDRESS_LEN6以太網(wǎng)幀地址長度ETH_HEADER_LEN#defineETH_HEADER_LEN14以太網(wǎng)幀頭長度ARP_HEADER_LEN#defineARP_HEADER_LEN28ARP數(shù)據(jù)包頭長度display_arp_tablevoiddisplay_arp_table();將ARP緩存表的內(nèi)容顯示到標(biāo)準(zhǔn)輸出netp_current_hw_addrintnetp_current_hw_addr(u8_t*hardware_address);獲取正在使用的網(wǎng)絡(luò)適配器的物理地址netp_current_ip_addru32_tnetp_current_ip_addr();獲取當(dāng)前正在使用的網(wǎng)絡(luò)適配器的IP地址htonsu16_thtons(u16_tn);將16位數(shù)值由主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序inet_addru32_tinet_addr(constchar*cp);將ASCII編碼的Internet地址轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序地址netp_packet_sendintnetp_packet_send(void*buffer,intlen);使用當(dāng)前正在使用的網(wǎng)絡(luò)接口發(fā)送一個(gè)數(shù)據(jù)幀九.各模塊推薦流程1.arp請(qǐng)求發(fā)送流程編碼實(shí)現(xiàn)arp請(qǐng)求數(shù)據(jù)包發(fā)送推薦使用如下流程:圖2-7arp請(qǐng)求數(shù)據(jù)包發(fā)送推薦流程2.輸入arp數(shù)據(jù)包處理流程編碼實(shí)現(xiàn)處理arp輸入數(shù)據(jù)包推薦使用如下流程:圖2-8處理arp輸入數(shù)據(jù)包推薦流程【實(shí)驗(yàn)步驟】練習(xí)1領(lǐng)略真實(shí)的ARP(同一子網(wǎng))各主機(jī)打開工具區(qū)的“拓?fù)潋?yàn)證工具”,選擇相應(yīng)的網(wǎng)絡(luò)結(jié)構(gòu),配置網(wǎng)卡后,進(jìn)行拓?fù)潋?yàn)證,如果通過拓?fù)潋?yàn)證,關(guān)閉工具繼續(xù)進(jìn)行實(shí)驗(yàn),如果沒有通過,請(qǐng)檢查網(wǎng)絡(luò)連接。本練習(xí)將主機(jī)A、B、C、D、E、F作為一組進(jìn)行實(shí)驗(yàn)。1.主機(jī)A、B、C、D、E、F啟動(dòng)協(xié)議分析器,打開捕獲窗口進(jìn)行數(shù)據(jù)捕獲并設(shè)置過濾條件(提取ARP、ICMP)。2.主機(jī)A、B、C、D、E、F在命令行下運(yùn)行“arp-d”命令,清空ARP高速緩存。3.主機(jī)Aping主機(jī)D()。主機(jī)Bping主機(jī)C()。主機(jī)Eping主機(jī)F()。4.主機(jī)A、B、C、D、E、F停止捕獲數(shù)據(jù),并立即在命令行下運(yùn)行“arp-a”命令察看ARP高速緩存?!馎RP高速緩存表由哪幾項(xiàng)組成?●結(jié)合協(xié)議分析器上采集到的ARP報(bào)文和ARP高速緩存表中新增加的條目,簡述ARP協(xié)議的報(bào)文交互過程以及ARP高速緩存表的更新過程。練習(xí)2編輯并發(fā)送ARP報(bào)文(同一子網(wǎng))本練習(xí)將主機(jī)A、B、C、D、E、F作為一組進(jìn)行實(shí)驗(yàn)。1.在主機(jī)E上啟動(dòng)協(xié)議編輯器,并編輯一個(gè)ARP請(qǐng)求報(bào)文。其中:MAC層:目的MAC地址:設(shè)置為FFFFFF-FFFFFF源MAC地址:設(shè)置為主機(jī)E的MAC地址協(xié)議類型或數(shù)據(jù)長度:0806ARP層:發(fā)送端硬件地址:設(shè)置為主機(jī)E的MAC地址發(fā)送端邏輯地址:設(shè)置為主機(jī)E的IP地址()目的端硬件地址:設(shè)置為000000-000000目的端邏輯地址:設(shè)置為主機(jī)F的IP地址()2.主機(jī)A、B、C、D、F啟動(dòng)協(xié)議分析器,打開捕獲窗口進(jìn)行數(shù)據(jù)捕獲并設(shè)置過濾條件(提取ARP協(xié)議)。3.主機(jī)B、E、F在命令行下運(yùn)行“arp-d”命令,清空ARP高速緩存。主機(jī)E發(fā)送已編輯好的ARP報(bào)文。4.主機(jī)A、B、C、D、F停止捕獲數(shù)據(jù),分析捕獲到的數(shù)據(jù),進(jìn)一步體會(huì)ARP報(bào)文交互過程。思考問題:1.哪些主機(jī)收到了ARP請(qǐng)求包,哪個(gè)主機(jī)給出了ARP響應(yīng)包?2.主機(jī)A、C、D是否收到ARP請(qǐng)求包,為什么?練習(xí)3跨路由地址解析(不同子網(wǎng))本練習(xí)將主機(jī)A、B、C、D、E、F作為一組進(jìn)行實(shí)驗(yàn)。1.主機(jī)B在命令行方式下輸入staticroute_config命令,開啟靜態(tài)路由服務(wù)。2.主機(jī)A、B、C、D、E、F在命令行下運(yùn)行“arp-d”命令,清空ARP高速緩存。3.主機(jī)A、B、C、D、E、F重新啟動(dòng)協(xié)議分析器,打開捕獲窗口進(jìn)行數(shù)據(jù)捕獲并設(shè)置過濾條件(提取ARP、ICMP)。4.主機(jī)Aping主機(jī)E()。5.主機(jī)A、B、C、D、E、F停止數(shù)據(jù)捕獲,察看協(xié)議分析器中采集到的ARP報(bào)文,并回答以下問題:●單一ARP請(qǐng)求報(bào)文是否能夠跨越子網(wǎng)進(jìn)行地址解析?為什么?●ARP地址解析在跨越子網(wǎng)的通信中所起到的作用?6.主機(jī)B在命令行方式下輸入recover_config命令,停止靜態(tài)路由服務(wù)。思考問題:1.哪些主機(jī)收到了ARP請(qǐng)求包,哪臺(tái)主機(jī)給出了ARP響應(yīng)包?2.比較ARP協(xié)議在同網(wǎng)段內(nèi)解析和跨網(wǎng)段的解析有何異同點(diǎn)?3.ARP數(shù)據(jù)包的長度是固定的嗎?試加以解釋。4.試解釋為什么ARP高速緩存每存入一個(gè)項(xiàng)目就要設(shè)置10-20分鐘的超時(shí)計(jì)時(shí)器。這個(gè)時(shí)間設(shè)置得太大或太小會(huì)出現(xiàn)什么問題?5.至少舉出兩種不需要發(fā)送ARP請(qǐng)求數(shù)據(jù)包的情況。練習(xí)4發(fā)送arp請(qǐng)求功能的實(shí)現(xiàn)本練習(xí)將主機(jī)A、C和D作為一組,主機(jī)B、E和F作為一組?,F(xiàn)僅以主機(jī)A、C、D所在組為例,其它組的操作參考主機(jī)A、C、D所在組的操作。實(shí)驗(yàn)開始前,先單擊“初始環(huán)境”。在實(shí)驗(yàn)中,主機(jī)A將調(diào)試接口的IP地址設(shè)置為2、主機(jī)B使用物理接口2,將調(diào)試接口的IP設(shè)置為1、主機(jī)C將調(diào)試接口的IP地址設(shè)置為3、主機(jī)D使用處于連接狀態(tài)的物理接口,將調(diào)試接口的IP地址設(shè)置為4、主機(jī)E使用處于連接狀態(tài)的物理接口,將調(diào)試接口的IP地址設(shè)置為2、主機(jī)F將調(diào)試接口的IP地址設(shè)置為3。所有主機(jī)使用子網(wǎng)掩碼,默認(rèn)網(wǎng)關(guān)設(shè)置為。1.所有主機(jī)編碼實(shí)現(xiàn)發(fā)送arp請(qǐng)求數(shù)據(jù)包(1)各主機(jī)使用VS2005軟件打開實(shí)驗(yàn)平臺(tái)安裝目錄下的JLCSS\ExpCNC\Work\NPL\ExpNPL_student\netproto_arp_student\netproto_arp_student.sln文件,在源文件netproto_arp_student.c的函數(shù)netp_arp_output_student內(nèi)編寫實(shí)現(xiàn)代碼。注:若實(shí)驗(yàn)平臺(tái)安裝在C盤,則目錄為:C:\ProgramFiles\JLCSS\ExpCNC\Work\NPL\ExpNPL_student\netproto_arp_student\netproto_arp_student.sln。(2)參考實(shí)驗(yàn)原理arp請(qǐng)求數(shù)據(jù)包發(fā)送推薦流程圖給出的流程,分析已經(jīng)存在的代碼。已經(jīng)存在的代碼定義了一個(gè)能容納arp請(qǐng)求數(shù)據(jù)包的緩沖區(qū)arp_buffer、一個(gè)以太網(wǎng)幀頭結(jié)構(gòu)變量eth_header和一個(gè)arp包頭結(jié)構(gòu)變量arp_header、以及將緩沖區(qū)數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)中的實(shí)現(xiàn)。(3)構(gòu)造、填充以太網(wǎng)數(shù)據(jù)幀頭構(gòu)造并填充一個(gè)以太網(wǎng)數(shù)據(jù)幀頭。目的MAC地址設(shè)置為廣播地址即FF-FF-FF-FF-FF-FF。源MAC地址設(shè)置為本接口的MAC地址,可以使用netp_current_hw_addr函數(shù)獲取本接口的MAC地址。協(xié)議類型或數(shù)據(jù)長度字段值應(yīng)設(shè)置為0x0806,表示上層協(xié)議為arp協(xié)議,可以使用MAC_PROTO_ARP宏。(4)構(gòu)造、填充ARP數(shù)據(jù)包頭構(gòu)造并填充一個(gè)ARP數(shù)據(jù)包頭。ARP數(shù)據(jù)包頭中各字段值的填充如下:硬件類型值為0x0001,可以使用ARP_HWTYPE_ETH宏。協(xié)議類型值為0x0800,可以使用ARP_PROTOTYPE_IP宏。硬件地址長度值為0x06,可以使用ARP_HWADDR_LEN_ETH宏。協(xié)議地址長度值為0x04,可以使用ARP_PROTOADDR_LEN_IP宏。操作碼值為0x0001,可以使用ARP_OPCODE_REQUEST宏。發(fā)送端硬件地址值為本接口的MAC地址,可以使用netp_current_hw_addr函數(shù)獲取本接口的MAC地址。發(fā)送端邏輯地址值為本接口的IP地址,可以使用netp_current_ip_addr函數(shù)獲取本接口的IP地址。目的端硬件地址值為0。主機(jī)A使用作為目的端邏輯地址、主機(jī)C使用作為目的端邏輯地址、主機(jī)D使用作為目的端邏輯地址。(5)將構(gòu)造完成的以太網(wǎng)數(shù)據(jù)幀頭和ARP數(shù)據(jù)包頭拷貝到緩沖區(qū)。2.所有主機(jī)打開協(xié)議分析器,開始捕獲數(shù)據(jù)3.所有主機(jī)調(diào)試并運(yùn)行程序4.各主機(jī)停止數(shù)據(jù)捕獲,觀察實(shí)驗(yàn)現(xiàn)象5.參考代碼如下:/**

*\brief編輯并發(fā)送一個(gè)ARP數(shù)據(jù)包

*

*由學(xué)生完成這個(gè)函數(shù),發(fā)送一個(gè)ARP請(qǐng)求數(shù)據(jù)包。主線程將會(huì)調(diào)用這個(gè)函數(shù)。

*/

void

netp_arp_output_student()

{

structnetp_eth_headereth_header;

structnetp_arp_headerarp_header;

u8_tarp_buffer[ETH_HEADER_LEN+ARP_HEADER_LEN];

//構(gòu)造、填充以太網(wǎng)數(shù)據(jù)幀頭

u8_tdest_mac_address[ETH_ADDRESS_LEN]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

structnetp_eth_addrsour_mac_address;

netp_current_hw_addr(&sour_mac_address);

memcpy(eth_header.dest_address.addr,dest_mac_address,ETH_ADDRESS_LEN);

memcpy(eth_header.sour_address.addr,sour_mac_address.addr,ETH_ADDRESS_LEN);

eth_header.type=htons(MAC_PROTO_ARP);

//構(gòu)造、填充ARP數(shù)據(jù)包頭

arp_header.hardware_type=htons(ARP_HWTYPE_ETH);

arp_to_type=htons(ARP_PROTOTYPE_IP);

arp_header.hw_addr_len=ARP_HWADDR_LEN_ETH;

arp_to_addr_len=ARP_PROTOADDR_LEN_IP;

arp_header.opcode=htons(ARP_OPCODE_REQUEST);

memcpy(arp_header.src_hw_addr.addr,sour_mac_address.addr,ETH_ADDRESS_LEN);

arp_header.src_ip_addr.addr=netp_current_ip_addr();

memset(arp_header.dest_hw_addr.addr,0,ETH_ADDRESS_LEN);

arp_header.dest_ip_addr.addr=inet_addr(ARP_DEST_IP);

memcpy(arp_buffer,ð_header,ETH_HEADER_LEN);

memcpy(arp_buffer+ETH_HEADER_LEN,&arp_header,ARP_HEADER_LEN);

//發(fā)送ARP數(shù)據(jù)幀

if(!netp_packet_send(arp_buffer,ETH_HEADER_LEN+ARP_HEADER_LEN)){

printf("發(fā)送ARP請(qǐng)求到%s成功!\n",ARP_DEST_IP);

}else{

printf("發(fā)送ARP請(qǐng)求到%s失?。n",ARP_DEST_IP);

}

}練習(xí)5處理輸入的arp數(shù)據(jù)包功能的實(shí)現(xiàn)本練習(xí)將主機(jī)A、C和D作為一組,主機(jī)B、E和F作為一組。現(xiàn)僅以主機(jī)A、C、D所在組為例,其它組的操作參考主機(jī)A、C、D所在組的操作。實(shí)驗(yàn)開始前,先單擊“初始環(huán)境”。該練習(xí)需要在前一個(gè)練習(xí)的基礎(chǔ)上進(jìn)行。在實(shí)驗(yàn)中,主機(jī)A將調(diào)試接口的IP地址設(shè)置為2、主機(jī)B使用物理接口2,將調(diào)試接口的IP設(shè)置為1、主機(jī)C將調(diào)試接口的IP地址設(shè)置為3、主機(jī)D使用處于連接狀態(tài)的物理接口,將調(diào)試接口的IP地址設(shè)置為4、主機(jī)E使用處于連接狀態(tài)的物理接口,將調(diào)試接口的IP地址設(shè)置為2、主機(jī)F將調(diào)試接口的IP地址設(shè)置為3。所有主機(jī)使用子網(wǎng)掩碼,默認(rèn)網(wǎng)關(guān)設(shè)置為。1.所有主機(jī)編碼實(shí)現(xiàn)arp數(shù)據(jù)包的過濾(1)各主機(jī)使用VS2005軟件打開實(shí)驗(yàn)平臺(tái)安裝目錄下的JLCSS\ExpCNC\Work\NPL\ExpNPL_student\netproto_arp_student\netproto_arp_student.sln文件,在源文件netproto_arp_student.c的函數(shù)netp_arp_input_student內(nèi)編寫實(shí)現(xiàn)代碼,參考實(shí)驗(yàn)原理處理arp輸入數(shù)據(jù)包推薦流程圖給出的流程,思考代碼編寫方案。注:若實(shí)驗(yàn)平臺(tái)安裝在C盤,則目錄為:C:\ProgramFiles\JLCSS\ExpCNC\Work\NPL\ExpNPL_student\netproto_arp_student\netproto_arp_student.sln。(2)過濾arp數(shù)據(jù)包通過判斷以太網(wǎng)幀中的“協(xié)議類型或數(shù)據(jù)長度”字段值是否為0x0806(宏MAC_PROTO_ARP定義該數(shù)值)來過濾arp數(shù)據(jù)包。如果接收到的數(shù)據(jù)包不是arp數(shù)據(jù)包,則應(yīng)該返回NETP_PUSH_TO_LWIP交給協(xié)議棧處理。2.處理arp請(qǐng)求數(shù)據(jù)包(1)判斷arp類型通過arp包頭中的“操作碼”字段的值來判斷arp數(shù)據(jù)包類型,如果該值為0x0001(宏ARP_OPCODE_REQUEST定義了該數(shù)值),則這個(gè)arp包為arp請(qǐng)求報(bào)文,應(yīng)該返回arp應(yīng)答數(shù)據(jù)包。(2)構(gòu)造arp應(yīng)答數(shù)據(jù)包的以太網(wǎng)幀頭使用已經(jīng)定義的變量response_eth_header來構(gòu)造以太網(wǎng)幀頭。其中:目的MAC地址為arp請(qǐng)求數(shù)據(jù)包頭中的發(fā)送端硬件地址;源MAC地址為本接口的MAC地址;“協(xié)議類型與數(shù)據(jù)長度”字段值為0x0806(宏MAC_PROTO_ARP定義該數(shù)值)。(3)構(gòu)造arp應(yīng)答數(shù)據(jù)包的arp包頭使用已經(jīng)定義的變量response_arp_header來構(gòu)造以太網(wǎng)幀頭。其中:硬件類型值為0x0001,可以使用ARP_HWTYPE_ETH宏。協(xié)議類型值為0x0800,可以使用ARP_PROTOTYPE_IP宏。硬件地址長度值為0x06,可以使用ARP_HWADDR_LEN_ETH宏。協(xié)議地址長度值為0x04,可以使用ARP_PROTOADDR_LEN_IP宏。操作碼值為0x0002,可以使用ARP_OPCODE_RESPONSE宏。發(fā)送端硬件地址值為本接口的MAC地址,可以使用netp_current_hw_addr函數(shù)獲取本接口的MAC地址。發(fā)送端邏輯地址值為本接口的IP地址,可以使用netp_current_ip_addr函數(shù)獲取本接口的IP地址。目的端硬件地址值為arp請(qǐng)求數(shù)據(jù)包頭中的發(fā)送端硬件地址。目的端邏輯地址為arp請(qǐng)求數(shù)據(jù)包頭中的發(fā)送端邏輯地址。3.處理arp應(yīng)答數(shù)據(jù)包(1)判斷arp類型通過arp包頭中的“操作碼”字段的值來判斷arp數(shù)據(jù)包類型,如果該值為0x0001(宏ARP_OPCODE_REQUEST定義了該數(shù)值),則這個(gè)arp包為arp請(qǐng)求報(bào)文,應(yīng)該返回arp應(yīng)答數(shù)據(jù)包。(2)判斷arp應(yīng)答數(shù)據(jù)包是否發(fā)送給本接口判斷以太網(wǎng)幀“目的MAC地址”字段值是否為本接口的MAC地址,如果不是則返回NETP_PUSH_TO_LWIP交給協(xié)議棧處理。判斷arp應(yīng)答數(shù)據(jù)包頭中“目的端邏輯地址”字段值是否為本接口的IP地址,如果不是則返回返回NETP_PUSH_TO_LWIP交給協(xié)議棧處理。(3)更新arp緩存表根據(jù)arp應(yīng)答數(shù)據(jù)包中的發(fā)送端邏輯地址和發(fā)送端硬件地址字段的值來更新arp緩存表,arp緩存表是命名為netp_arp_table的一個(gè)數(shù)組,如果發(fā)送端邏輯地址已經(jīng)在arp緩存表中,則只需要更新相應(yīng)的MAC地址即可。如果發(fā)送端邏輯地址沒有在arp緩存表中,則需要在新的位置創(chuàng)建arp緩存表?xiàng)l目,其中ip地址為發(fā)送端邏輯地址,MAC地址為發(fā)送端硬件地址。4.主機(jī)C和主機(jī)D修改練習(xí)四編寫的程序,將目的端邏輯地址設(shè)置為25.所有主機(jī)打開協(xié)議分析器,開始捕獲數(shù)據(jù)6.所有主機(jī)調(diào)試并運(yùn)行程序7.各主機(jī)停止數(shù)據(jù)捕獲,觀察實(shí)驗(yàn)現(xiàn)象8.參考代碼如下。/**

*\brief當(dāng)有數(shù)據(jù)幀到達(dá)時(shí),將調(diào)用這個(gè)函數(shù)

*

*\parampacket指向接收到的數(shù)據(jù)

*\parampacket_len數(shù)據(jù)幀的長度

*

*\return一個(gè)put_to_lwip類型的返回值。返回NETP_PUT_LWIP表示處理數(shù)據(jù)后將數(shù)據(jù)幀交給上層協(xié)議棧繼續(xù)處理

*返回NETP_NO_PUT_LIWP表示不將數(shù)據(jù)幀交給上層協(xié)議棧處理。

*/

enumpush_to_lwip

netp_arp_input_student(void*packet,intpacket_len)

{

structnetp_eth_addrmy_mac_address;//本機(jī)mac地址

u32_tmy_ip_address;//本機(jī)IP地址

structnetp_eth_headereth_header;

structnetp_arp_headerarp_header;

inti;

staticintarp_table_index;

memcpy(ð_header,packet,ETH_HEADER_LEN);

//過濾ARP數(shù)據(jù)幀,如果不是ARP數(shù)據(jù)幀,直接返回不進(jìn)行任何處理

if(eth_header.type!=htons(MAC_PROTO_ARP)){

returnNETP_PUSH_TO_LWIP;

}

//填充arp_header結(jié)構(gòu)

memcpy(&arp_header,(u8_t*)packet+ETH_HEADER_LEN,ARP_HEADER_LEN);

//獲取本機(jī)物理地址

netp_current_hw_addr(&my_mac_address);

//獲取本機(jī)IP地址

my_ip_address=netp_current_ip_addr();

//判斷arp類型

switch(ntohs(arp_header.opcode)){

caseARP_OPCODE_REQUEST://arp請(qǐng)求

if(arp_header.dest_ip_addr.addr==my_ip_address){

structnetp_eth_headerresponse_eth_header;

structnetp_arp_headerresponse_arp_header;

u8_tarp_buffer[ETH_HEADER_LEN+ARP_HEADER_LEN];

printf("接收到一個(gè)來自%s的ARP請(qǐng)求數(shù)據(jù)包。\n",inet_ntoa(*(structin_addr*)&arp_header.dest_ip_addr));

//構(gòu)造ARP應(yīng)答數(shù)據(jù)幀

//構(gòu)造、填充以太網(wǎng)數(shù)據(jù)幀頭

memcpy(response_eth_header.dest_address.addr,arp_header.src_hw_addr.addr,ETH_ADDRESS_LEN);

memcpy(response_eth_header.sour_address.addr,my_mac_address.addr,ETH_ADDRESS_LEN);

response_eth_header.type=htons(MAC_PROTO_ARP);

//構(gòu)造、填充ARP數(shù)據(jù)包頭

response_arp_header.hardware_type=htons(ARP_HWTYPE_ETH);

response_arp_to_type=htons(ARP_PROTOTYPE_IP);

response_arp_header.hw_addr_len=ARP_HWADDR_LEN_ETH;

response_arp_to_addr_len=ARP_PROTOADDR_LEN_IP;

response_arp_header.opcode=htons(ARP_OPCODE_RESPONSE);

memcpy(response_arp_header.src_hw_addr.addr,my_mac_address.addr,ETH_ADDRESS_LEN);

response_arp_header.src_ip_addr.addr=my_ip_address;

memcpy(response_arp_hea

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論