ARP協議與RARP協議
ARP:地址解析協議
對於乙太網,資料鏈路層上是根據48bit的乙太網地址來確定目的介面,裝置驅動程式從不檢查IP資料報中的目的IP地址。ARP協議為IP地址到對應的硬體地址之間提供動態對映。
工作過程
在乙太網(ARP協議只適用於區域網)中,如果本地主機想要向某一個IP地址的主機(路由表中的下一跳路由器或者直連的主機,注意此處IP地址不一定是IP資料報中的目的IP)發包,但是並不知道其硬體地址,此時利用ARP協議提供的機制來獲取硬體地址,具體過程如下:
1) 本地主機在區域網中廣播ARP請求,ARP請求資料幀中包含目的主機的IP地址。意思是“如果你是這個IP地址的擁有者,請回答你的硬體地址”。
2) 目的主機的ARP層解析這份廣播報文,識別出是詢問其硬體地址。於是傳送ARP應答包,裡面包含IP地址及其對應的硬體地址。
3) 本地主機收到ARP應答後,知道了目的地址的硬體地址,之後的資料報就可以傳送了。
點對點鏈路不使用ARP協議。
幀格式
- 乙太網目的地址:目的主機的硬體地址。目的地址全為1的特殊地址是廣播地址。
- 乙太網源地址:源主機的硬體地址。
- 幀型別:對於ARP協議,該欄位為0x0806。對於RARP協議,該欄位為0x8035。
- 硬體型別:表示硬體地址的型別。值為1時表示乙太網地址。也就是說ARP協議不僅僅應用於乙太網協議,還可以支援別的鏈路層協議。
- 協議型別:表示要對映的協議地址型別。值為0x0800
- 硬體地址長度:與硬體型別對應的硬體地址的長度,以位元組為單位。如果是乙太網,則是6位元組(MAC長度)。
- 協議地址長度:與協議型別對應的協議地址長度,以位元組為單位。如果是IP協議,則是4位元組(IP地址長度)。
- 操作型別(op):四中操作型別。ARP請求(1),ARP應答(2),RARP請求(3),RARP應答(4)。
- 傳送端硬體地址:如果是乙太網,則是源主機乙太網地址,此處和乙太網頭中的源地址對應。
- 傳送端協議地址:如果是IP協議,則表示源主機的IP地址。
- 目的端硬體地址:如果是乙太網,則是目的乙太網地址,和乙太網頭中的目的地址對應。
- 目的端協議地址:如果是IP協議,則表示源主機要請求硬體地址的
- 對應ARP請求包來說,目的端的硬體地址欄位無須填充,其他欄位都需要填充。對於ARP回覆包來說,所有欄位都需要填充。
APR請求包是廣播的,但是ARP應答幀是單播的。
乙太網資料報最小長度是60位元組(14位元組的乙太網頭,不包含4位元組的FCS),ARP資料包長度為42位元組(14位元組的乙太網頭和28位元組的ARP資料),需要加入填充字元到乙太網最小長度要求:60位元組。
ARP快取記憶體
每個主機都有一個ARP快取記憶體表,這樣避免每次發包時都需要傳送ARP請求來獲取硬體地址。預設老化時間是20分鐘。利用arp -a命令可以檢視顯示系統中快取記憶體的內容。
Windows下“arp -d”命令可以清除arp快取記憶體表。
有時候需要手動清除arp快取,曾經就是因為arp快取沒有做清理,導致迷惑了很久。遇到的問題:
1) 製作了一個寫路由器MAC地址的工具,每次寫完MAC地址,重啟路由器,會發現無法telnet登陸路由器。IP地址沒變,但是MAC地址更改了,而ARP快取表中IP地址對映的仍然是舊的MAC地址。
2) 類似的問題,有兩個路由器具有相同的IP地址。先連線一個路由器,登陸成功後,再去連線另一臺路由器,卻發現登陸不了。
ARP代理
如果ARP請求時從一個網路的主機發往另一個網路上的主機,那麼連線這兩個網路的路由器可以回答該請求,這個過程稱作委託ARP或者ARP代理。這樣可以欺騙發起ARP請求的傳送端,使它誤以為路由器就是目的主機。
RARP:逆地址解析協議
將區域網中某個主機的實體地址轉換為IP地址,比如區域網中有一臺主機只知道實體地址而不知道IP地址,那麼可以通過RARP協議發出徵求自身IP地址的廣播請求,然後由RARP伺服器負責回答。RARP協議廣泛應用於無盤工作站引導時獲取IP地址。
RARP允許區域網的物理機器從網管伺服器ARP表或者快取上請求其IP地址。
幀格式
幀格式同ARP協議,幀型別欄位和操作型別不同,具體見ARP幀格式描述。
工作原理
1. 主機發送一個本地的RARP廣播,在此廣播包中,宣告自己的MAC地址並且請求任何收到此請求的RARP伺服器分配一個IP地址。
2. 本地網段上的RARP伺服器收到此請求後,檢查其RARP列表,查詢該MAC地址對應的IP地址。
3. 如果存在,RARP伺服器就給源主機發送一個響應資料包並將此IP地址提供給對方主機使用。
4. 如果不存在,RARP伺服器對此不做任何的響應。
5. 源主機收到從RARP伺服器的響應資訊,就利用得到的IP地址進行通訊;如果一直沒有收到RARP伺服器的響應資訊,表示初始化失敗。