一、物理地址與邏輯地址1.物理地址
物理地址是節點的地址,由它所在的局域網或廣域網定義。物理地址包含在數據鍊路層的幀中。物理地址是最低一級的地址。
物理地址的長度和格式是可變的,取決于具體的網絡。以太網使用寫在網絡接口卡(NIC)上的6字節的标識作為物理地址。
物理地址可以是單播地址(一個接收者)、多播地址(一組接收者)或廣播地址(由網絡中的所有主機接收)。有些網絡不支持多播或廣播地址,當需要把幀發送給一組主機或所有主機時,多播地址或廣播地址就需要用單播地址來模拟。
2.邏輯地址
在互聯網的環境中僅使用物理地址是不合适的,因為不同網絡可以使用不同的地址格式。因此,需要一種通用的編址系統,用來惟一地标識每一台主機,而不管底層使用什麼樣的物理網絡。
邏輯地址就是為此目的而設計的。目前Internet上的邏輯地址是32位地址,通常稱為IP地址,可以用來标識連接在Internet上的每一台主機。在Internet上沒有兩個主機具有同樣的IP地址。
圖2-1 ARP報文格式
ARP報文格式具有如下的一些字段:
● 硬件類型:這是16位字段,用來定義運行ARP的網絡的類型。每一個局域網基于其類型被指派給一個整數。例如,以太網的硬件類型是1。ARP可用在任何網絡上。 ● 協議類型:這是16位字段。用來定義協議的類型。例如,對IPv4協議,這個字段的值是0x0800。ARP可用于任何高層協議。 ● 硬件地址長度:這是一個8位字段,用來定義以字節為單位的物理地址長度。例如,以太網物理地址為6字節,所對應的硬件地址長度值為6。 ● 協議地址長度:标識用于該數據包的邏輯地址的長度,用十進制标識,單位為一個字節,例如,IPv4為4個字節,所對應的協議地址長度值為4。 ● 操作碼:這是16位字段,用來定義數據包的類型。已定義了兩種類型:為1時表示ARP請求,為2時表示ARP應答。 ● 發送端硬件地址:這是可變長度字段,用來定義發送端的物理地址。對于以太網這個字段是6字節長。 ● 發送端邏輯地址:這是可變長度字段,用來定義發送端的邏輯地址。對于邏輯地址為IP地址的網絡,該字段長度為4字節。 ● 目的端硬件地址:這是可變長度字段,用來定義目标的物理地址。對于ARP請求,字段是全0,因為發送端不知道目标的物理地址(該字段長度為可變,如以太網硬件地址為6個字節)。 ● 目的端邏輯地址:這是可變長度字段,用來定義目标的邏輯地址(該字段長度為可變,如IPv4協議的邏輯地址為4個字節)。
四、ARP封裝
ARP數據報直接封裝在數據鍊路幀中。例如,在下圖中,ARP數據包封裝在以太網的幀中。類型字段值為0x0806指出了此幀所攜帶的數據是ARP數據包。
圖2-2 ARP數據包的封裝
五. ARP的運行過程
數據包傳輸過程可分為如下步驟:
1. 發送端知道目的端的IP地址。
2. IP要求ARP創建一個ARP請求報文,其中包含了發送方的物理地址、發送方的IP地址和目的端的IP地址。目的端的物理地址用0填充。
3. 将報文傳遞到數據鍊路層,并在該層中用發送方的物理地址作為源地址,用物理廣播地址作為目的地址,将其封裝在一個幀中。
4. 因為該幀中包含了一個廣播目的地址,所以同一鍊路中的每個主機或路由器都接收到這個幀。所有接收到該幀的主機都将其傳遞到ARP層進行處理。除了目的端主機以外的所有主機都丢棄該報文。
5. 目的端主機用一個包含其物理地址的ARP應答報文做出響應,并對該報文進行單播。
6. 發送方接收到這個應答報文,這樣它就知道了目标主機的物理地址。
ARP地址解析過程如下圖所示。
六、ARP高速緩存
在真正的協議實現中,并不是每次發送IP報文前都需要發送ARP請求報文來獲取目的MAC地址。在大多數的系統中都存在着一個ARP緩存表。記錄着一段時間内曾經獲取過的MAC地址和IP地址的映射關系,如下圖所示:
圖2-4 ARP高速緩存
發送IP數據報前先對ARP緩存表進行查找,查看目的MAC地址是否存在于緩存表中,如果存在,則不需要發送ARP請求報文而直接使用此地址進行IP數據包的發送。如果不存在,則發送ARP請求報文,在收到ARP應答報文之後,使用應答報文中的目的MAC地址發送IP數據包,并将目的MAC地址存于ARP緩存表中供以後使用。
另外,ARP緩存表采用老化機制,在一段時間内如果表中的某一項沒有使用,就會被删除,這樣可以大大減少ARP緩存表的長度,加快查詢速度。
下圖描述了ARP高速緩存的使用與更新過程:
圖2-5 ARP高速緩存的使用與更新過程
七、代理ARP
代理ARP可用來産生劃分子網的效應。如果ARP請求是從一個網絡中的主機發往另一個網絡中的主機,那麼連接這兩個網絡的路由器就可以回答該請求,當這個路由器收到真正的IP數據包時,它就把該數據包發送給相應的主機或路由器。
例如,在下圖所示的網絡中,安裝在右邊主機上的代理ARP應答對目标IP地址為141.23.56.23的ARP請求。
圖2-6 代理ARP
八、協議棧實現代碼解析
本實驗将通過對安裝目錄ExpCNS\work\EXPcns_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.h和netproto_arp_student.c兩個文件進行編碼,完成協議棧中arp協議的實現。
netproto_arp_student.h文件中定義了arp協議實現相關數值,關鍵代碼如下所示:
這段代碼定義了8個宏,他們代表的含義如下表所示:
表2-1 netproto_arp_student.h中定義的宏
在實驗的編碼過程中,應該使用這些宏對相應的變量進行賦值。 netproto_arp_student.c文件是協議棧中arp協議的實現部分,其中定義了1個全局數組以及3個函數。下面分别介紹這些協議棧的實現部分。 全局數組netp_arp_table是arp協議的緩存表,擁有NETP_ARP_TABLE_SIZE個netp_arp_table_item元素。其中NETP_ARP_TABLE_SIZE是arp緩存表的條目數,默認值為10,同學們不需要修改。netp_arp_table_item是一個結構體,代表了arp緩存表中的一個條目,包括一個物理地址hardware_addr和一個IP地址ip_address,其定義如下:
需要根據arp協議的實現原理編寫代碼來維護arp緩存表。 函數display_arp_table的功能是顯示arp緩存表中的條目,在實驗中可以直接調用該函數,便于查看arp緩存表中的内容。 函數netp_arp_output_student的功能是構造并發送一個arp請求數據包。這個函數的編碼工作需要由學生完成。 當有數據到達本機網絡接口時,函數netp_arp_input_student将被調用,并傳遞給這個函數原始數據。在本實驗中該函數需要完成兩個功能,一是處理針對本機的arp請求數據包,二是處理針對本機的arp應答數據包。處理針對本機的arp請求數據包時,應該發送相應的arp應答數據包。處理針對本機的arp應答數據包時,應該更新arp緩存表。這個函數的編碼工作需要由學生完成。該函數的返回值為push_to_lwip的枚舉類型值,push_to_lwip的定義如下:
返回NETP_PUSH_TO_LWIP表示這個數據幀應該提交給協議棧上層繼續處理,而返回NETP_NO_PUSH_LIWP則表示不需要提交給協議棧上層處理,本層處理完畢後,這個數據幀将被丢棄。需要根據正确的邏輯關系返回适當的值,使協議棧正常工作。 在編碼過程中可能會遇到一些結構體、宏和函數,下表對他們進行介紹:
表2-2 實驗涉及的結構體和函數
九、各模塊推薦流程1.arp請求發送流程 編碼實現arp請求數據包發送推薦使用如下流程:
圖2-7 arp請求數據包發送推薦流程
2. 輸入arp數據包處理流程
編碼實現處理arp輸入數據包推薦使用如下流程:
圖2-8 處理arp輸入數據包推薦流程
【實驗步驟】
練習1 領略真實的ARP(同一子網)
各主機打開工具區的"拓撲驗證工具",選擇相應的網絡結構,配置網卡後,進行拓撲驗證,如果通過拓撲驗證,關閉工具繼續進行實驗,如果沒有通過,請檢查網絡連接。
本練習将主機A、B、C、D、E、F作為一組進行實驗。1.主機A、B、C、D、E、F啟動協議分析器,打開捕獲窗口進行數據捕獲并設置過濾條件(提取ARP、ICMP)。2.主機A、B、C、D、E、F在命令行下運行"arp -d"命令,清空ARP高速緩存。3.主機A ping 主機D(172.16.1.4)。 主機B ping 主機C(172.16.1.3)。 主機E ping 主機F(172.16.0.3)。4.主機A、B、C、D、E、F停止捕獲數據,并立即在命令行下運行"arp -a"命令察看ARP高速緩存。● ARP高速緩存表由哪幾項組成?● 結合協議分析器上采集到的ARP報文和ARP高速緩存表中新增加的條目,簡述ARP協議的報文交互過程以及ARP高速緩存表的更新過程。
練習2 編輯并發送ARP報文(同一子網)
本練習将主機A、B、C、D、E、F作為一組進行實驗。1.在主機E上啟動協議編輯器,并編輯一個ARP請求報文。其中: MAC層: 目的MAC地址:設置為FFFFFF-FFFFFF 源MAC地址:設置為主機E的MAC地址 協議類型或數據長度:0806 ARP層: 發送端硬件地址:設置為主機E的MAC地址 發送端邏輯地址:設置為主機E的IP地址(172.16.0.2) 目的端硬件地址:設置為000000-000000 目的端邏輯地址:設置為主機F的IP地址(172.16.0.3)2.主機A、B、C、D、F啟動協議分析器,打開捕獲窗口進行數據捕獲并設置過濾條件(提取ARP協議)。3.主機B、E、F在命令行下運行"arp -d"命令,清空ARP高速緩存。主機E發送已編輯好的ARP報文。4.主機A、B、C、D、F停止捕獲數據,分析捕獲到的數據,進一步體會ARP報文交互過程。
【思考問題】
1. 哪些主機收到了ARP請求包,哪個主機給出了ARP響應包?2. 主機A、C、D是否收到ARP請求包,為什麼?
練習3 跨路由地址解析(不同子網)
本練習将主機A、B、C、D、E、F作為一組進行實驗。
1.主機B在命令行方式下輸入staticroute_config命令,開啟靜态路由服務。
2.主機A、B、C、D、E、F在命令行下運行"arp -d"命令,清空ARP高速緩存。
3.主機A、B、C、D、E、F重新啟動協議分析器,打開捕獲窗口進行數據捕獲并設置過 濾條件(提取ARP、ICMP)。
4.主機A ping 主機E(172.16.0.2)。
5.主機A、B、C、D、E、F停止數據捕獲,察看協議分析器中采集到的ARP報文,并回答以下問題:
● 單一ARP請求報文是否能夠跨越子網進行地址解析?為什麼?
● ARP地址解析在跨越子網的通信中所起到的作用?
6.主機B在命令行方式下輸入recover_config命令,停止靜态路由服務。
【思考問題】
1.哪些主機收到了ARP請求包,哪台主機給出了ARP響應包?
2.比較ARP協議在同網段内解析和跨網段的解析有何異同點?
3.ARP數據包的長度是固定的嗎?試加以解釋。
4.試解釋為什麼ARP高速緩存每存入一個項目就要設置10-20分鐘的超時計時器。這個時間設置得太大或太小會出現什麼問題?
5.至少舉出兩種不需要發送ARP請求數據包的情況。
練習4 發送ARP請求功能的實現
本練習将主機A、C和D作為一組,主機B、E和F作為一組。現僅以主機A、C、D所在組為例,其它組的操作參考主機A、C、D所在組的操作。實驗開始前,先單擊"初始環境"。
在實驗中,主機A将新接口的IP地址設置為172.16.1.12、主機B使用物理接口2,将新接口的IP設置為172.16.0.11、主機C将新接口的IP地址設置為172.16.1.13、主機D使用處于連接狀态的物理接口,将新接口的IP地址設置為172.16.1.14、主機E使用處于連接狀态的物理接口,将新接口的IP地址設置為172.16.0.12、主機F将新接口的IP地址設置為172.16.0.13。所有主機使用子網掩碼255.255.255.0,默認網關設置為0.0.0.0。
1.所有主機編碼實現發送arp請求數據包
(1)各主機打開安裝目錄ExpCNS\work\EXPcns_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.c文件,在函數netp_arp_output_student内編寫實現代碼。
(2)參考實驗原理arp請求數據包發送推薦流程圖給出的流程,分析已經存在的代碼。
已經存在的代碼定義了一個能容納arp請求數據包的緩沖區arp_buffer、一個以太網幀頭結構變量eth_header和一個arp包頭結構變量arp_header、以及将緩沖區數據發送到網絡中的實現。
(3)構造、填充以太網數據幀頭
構造并填充一個以太網數據幀頭。目的MAC地址設置為廣播地址即FF-FF-FF-FF-FF-FF。源MAC地址設置為本接口的MAC地址,可以使用netp_current_hw_addr函數獲取本接口的MAC地址。協議類型或數據長度字段值應設置為0x0806,表示上層協議為arp協議,可以使用MAC_PROTO_ARP宏。
(4)構造、填充ARP數據包頭 構造并填充一個ARP數據包頭。ARP數據包頭中各字段值的填充如下: 硬件類型值為0x0001,可以使用ARP_HWTYPE_ETH宏。 協議類型值為0x0800,可以使用ARP_PROTOTYPE_IP宏。 硬件地址長度值為0x06,可以使用ARP_HWADDR_LEN_ETH宏。 協議地址長度值為0x04,可以使用ARP_PROTOADDR_LEN_IP宏。 操作碼值為0x0001,可以使用ARP_OPCODE_REQUEST宏。 發送端硬件地址值為本接口的MAC地址,可以使用netp_current_hw_addr函數獲取本接口的MAC地址。 發送端邏輯地址值為本接口的IP地址,可以使用netp_current_ip_addr函數獲取本接口的IP地址。 目的端硬件地址值為0。 主機A使用172.16.1.3作為目的端邏輯地址、主機C使用172.16.1.4作為目的端邏輯地址、主機D使用172.16.1.2作為目的端邏輯地址。 (5)将構造完成的以太網數據幀頭和ARP數據包頭拷貝到緩沖區。 2.所有主機打開協議分析器,開始捕獲數據 3.所有主機調試并運行程序 4.各主機停止數據捕獲,觀察實驗現象 5.參考代碼如下:
練習5 處理輸入的arp數據包功能的實現
本練習将主機A、C和D作為一組,主機B、E和F作為一組。現僅以主機A、C、D所在組為例,其它組的操作參考主機A、C、D所在組的操作。實驗開始前,先單擊"初始環境"。
該練習需要在前一個練習的基礎上進行。
在實驗中,主機A将新接口的IP地址設置為172.16.1.12、主機B使用物理接口2,将新接口的IP設置為172.16.0.11、主機C将新接口的IP地址設置為172.16.1.13、主機D使用處于連接狀态的物理接口,将新接口的IP地址設置為172.16.1.14、主機E使用處于連接狀态的物理接口,将新接口的IP地址設置為172.16.0.12、主機F将新接口的IP地址設置為172.16.0.13。所有主機使用子網掩碼255.255.255.0,默認網關設置為0.0.0.0。
1.所有主機編碼實現arp數據包的過濾
(1)各主機打開安裝目錄ExpCNS\work\EXPcns_student\netproto_arp_student\netproto_arp_student下的netproto_arp_student.c文件,在函數netp_arp_input_student内編寫實現代碼,參考實驗原理處理arp輸入數據包推薦流程圖給出的流程,思考代碼編寫方案。 (2)過濾arp數據包 通過判斷以太網幀中的"協議類型或數據長度"字段值是否為0x0806(宏MAC_PROTO_ARP定義該數值)來過濾arp數據包。如果接收到的數據包不是arp數據包,則應該返回NETP_PUSH_TO_LWIP交給協議棧處理。 2.處理arp請求數據包 (1)判斷arp類型 通過arp包頭中的"操作碼"字段的值來判斷arp數據包類型,如果該值為0x0001(宏ARP_OPCODE_REQUEST定義了該數值),則這個arp包為arp請求報文,應該返回arp應答數據包。 (2)構造arp應答數據包的以太網幀頭 使用已經定義的變量response_eth_header來構造以太網幀頭。其中:目的MAC地址為arp請求數據包頭中的發送端硬件地址;源MAC地址為本接口的MAC地址;"協議類型與數據長度"字段值為0x0806(宏MAC_PROTO_ARP定義該數值)。 (3)構造arp應答數據包的arp包頭 使用已經定義的變量response_arp_header來構造以太網幀頭。其中: 硬件類型值為0x0001,可以使用ARP_HWTYPE_ETH宏。 協議類型值為0x0800,可以使用ARP_PROTOTYPE_IP宏。 硬件地址長度值為0x06,可以使用ARP_HWADDR_LEN_ETH宏。 協議地址長度值為0x04,可以使用ARP_PROTOADDR_LEN_IP宏。 操作碼值為0x0002,可以使用ARP_OPCODE_RESPONSE宏。 發送端硬件地址值為本接口的MAC地址,可以使用netp_current_hw_addr函數獲取本接口的MAC地址。 發送端邏輯地址值為本接口的IP地址,可以使用netp_current_ip_addr函數獲取本接口的IP地址。 目的端硬件地址值為arp請求數據包頭中的發送端硬件地址。 目的端邏輯地址為arp請求數據包頭中的發送端邏輯地址。 3.處理arp應答數據包 (1)判斷arp類型 通過arp包頭中的"操作碼"字段的值來判斷arp數據包類型,如果該值為0x0001(宏ARP_OPCODE_REQUEST定義了該數值),則這個arp包為arp請求報文,應該返回arp應答數據包。 (2)判斷arp應答數據包是否發送給本接口 判斷以太網幀"目的MAC地址"字段值是否為本接口的MAC地址,如果不是則返回NETP_PUSH_TO_LWIP交給協議棧處理。 判斷arp應答數據包頭中"目的端邏輯地址"字段值是否為本接口的IP地址,如果不是則返回返回NETP_PUSH_TO_LWIP交給協議棧處理。 (3)更新arp緩存表 根據arp應答數據包中的發送端邏輯地址和發送端硬件地址字段的值來更新arp緩存表,arp緩存表是命名為netp_arp_table的一個數組,如果發送端邏輯地址已經在arp緩存表中,則隻需要更新相應的MAC地址即可。如果發送端邏輯地址沒有在arp緩存表中,則需要在新的位置創建arp緩存表條目,其中ip地址為發送端邏輯地址,MAC地址為發送端硬件地址。 4.主機C和主機D修改練習四編寫的程序,将目的端邏輯地址設置為172.16.1.12
5.所有主機打開協議分析器,開始捕獲數據6.所有主機調試并運行程序7.各主機停止數據捕獲,觀察實驗現象8.參考代碼如下:
1
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!