2007年6月24日 星期日

[TCP/IP Illustrated] ARP & RARP

簡介

若回頭去看看 TCP/IP 四層,會發現 IP 屬於 Network Layer,這表示 IP 僅在 Network Layer 可供辨識,並無法在 Link Layer 中提供辨識的功能;因此在 Link Layer 中,Ethernet、Token Ring.....等提供了一個長度為 48 bit 的硬體位址作為辨識之用。當 frame 在傳送時,所依據的是其硬體位址,而非 IP address,因為 device driver 並不會去檢查 IP datagram 中的 IP address。

ARP(Address Resolution Protocol) 以及 RARP(Reverse Address Resolution Protocol) 就是用來進行 IP address(32 bits) 與硬體位址(48 bits) 的對應之用,以下用一張圖來說明:

從圖中可以看出,兩個 protocol 的目的地都相同(將 32-bit Internet address 與 48-bit Ethernet address 作對應),只是所擁有的資料與要找的資料相反罷了!

就一般的狀況來說,ARP 是用於一般的情形,有 IP address,要取得相對應的 hardware address。

RARP 就比較不一樣了,大部分是用於沒有磁碟(diskless)的主機環境中,由於沒有磁碟,因此就沒有地方可以儲存主機的 IP address 資訊,因此每次主機啟動後,都必須透過 RARP 去詢問自己的 IP address,因此在該網段也必須要有一台 RARP server 存在。


ARP 運作原理

簡單來說,將 IP address 轉換為 Hardware address(以下稱為 MAC address) 的過程,就是 RAP 所負責的工作,運作的方式如下:
  1. 傳送端送出「ARP request
    此為 Ethernet frame,並且是廣播封包,因此該網段的所有主機都會收到,而在此 frame 中包含了目的地主機的 IP address,因此這個 frame 廣播出來的用意在於告訴大家:「如果您是這個 IP address 的擁有者,請告訴我您的 MAC address」
  2. 接收端回應「ARP reply
    當接收端接收到 ARP reqeust 後(不是此 IP address 的主機就會把 frame 丟棄了),就會回應 ARP reply,其中包含了接收端主機的 MAC address
  3. 傳送端取得「ARP reply
    有了原本的 IP address 以及用 ARP 取得的 MAC address 之後,就可以開始傳遞資料了!


ARP Cache

若一次傳送資料,每一次都要使用 ARP 取得接收端的 MAC address,會造成傳輸效率的低落,因此就有 ARP cache 的產生,透過 cache 的機制,將已經知道的 IP address 與 MAC address 暫存起來,就不必一直重複進行用 ARP 取得 MAC address 的工作。

然而,在 Linux 或是 Windows 中,都可以透過以下指令查看 ARP cache 有哪些資料:
shell> arp -a
基本上,cache 也是有其 timeout 的時間,實際時間搞不清楚,不過一段時間沒用後,ARP cache 中的內容的確是會被清除掉,有興趣的人可以自行實驗。

【注意】在 Linux 中有提供處理 ARP cache 的指令,稱為「arp」,有興趣的人可以參考 arp 的 manpage


ARP 封包格式

首先要說明,ARP request 與 ARP reply 的封包格式是相同的,如下圖:

欄位說明如下:
  1. Ethernet destination addr & Ethernet source addr
    當 destination addr 全部為 1 時,表示此為廣播(broadcast)封包
  2. frame type
    描述接在這欄位之後的資料的型態為何,例如:0x0806 表示後續的資料為 ARP request 或是 ARP reply
    【註】RARP 封包為 0x8035
  3. hard type
    描述 hardware address 的型態為何,例如:0x0001 為 Ethernet
  4. prot type
    描述對應到何種型態的 protocol address,例如:0x0800 為 IP address
  5. hard size
    描述 hardware address 的長度(單位:byte),因此一般此欄位的值為 0x06
  6. prot size
    描述 protocol address 的長度(單位:byte),因此一般此欄位的值為 0x04
  7. op
    描述此封包是用於哪種功能上,例如:0x0001(ARP request)、0x0002(ARP reply)、0x0003(RARP request)、0x0004(RARP reply)
  8. sender Ethernet+IP addr & target Ethernet+IP addr
    這些欄位看名稱就很清楚是儲存哪些資料,就不多提了! 只是比較需要注意的是,在 Ethernet header 與 ARP request/reply 中,有重複的部分(Ethernet address)


實際範例

接著用個實際範例說明,ARP 是如何運作的,以下使用 tcpdump 程式觀察封包的進出:
# -e 參數是用在顯示 link layer 的 header inforamtion 之用(斜體字部分根據實際情況必須更改)
shell> tcpdump -i eth0 -e host 140.137.12.10
當另外一台主機 telnet 進來後,就會有封包資料的進出,輸出內容大概如下:

一開始傳送端主機不知道接收端主機的 MAC address,就必須發出 ARP request 去取得,因此就會有上面的封包出現。

有一個地方沒有框起來,但是卻需要注意的地方,是「length 60」的部分;一般來說,ARP request/reply 的長度僅只有 42 bytes(14 bytes Ethernet header + 28 bytes ARP request/reply),但由於 Ethernet frame 最小長度必須為 60 bytes,因此每個 ARP request/reply 會被填滿至 60 bytes 再送出。

此外,之後若是在短時間內再度 telnet 一次遠端主機,就不會有 ARP 的封包出現了,原因是資料已經存在於 ARP cache 中,不需在發送 ARP request 取得 hardware address。

最後,若要觀察在目前的網段中,所有的 ARP request/reply 的內容,可以用以下指令:(ARP 是廣播封包,所以可以全部擷取到)
# 參數 -n 表示要以 IP 的形式呈現
shell> tcpdump -n arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
17:06:09.837584 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:12.874831 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:18.825728 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:30.902268 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:32.711703 arp who-has 140.137.12.43 tell 140.137.12.41
17:06:32.711772 arp reply 140.137.12.43 is-at 00:02:b3:ad:85:43
17:06:33.914824 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:37.658513 arp who-has 140.137.12.10 tell 140.137.12.42
17:06:37.658531 arp reply 140.137.12.10 is-at 00:11:2f:0e:cd:dd
17:06:39.950699 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:42.655529 arp who-has 140.137.12.42 tell 140.137.12.10
17:06:42.655674 arp reply 140.137.12.42 is-at 00:50:ba:1e:d3:af
17:06:43.015543 arp who-has 140.137.12.90 tell 140.137.12.10
17:06:43.015830 arp reply 140.137.12.90 is-at 00:01:80:0a:f2:09
17:06:44.620024 arp who-has 140.137.12.247 tell 140.137.12.229
17:06:44.620078 arp reply 140.137.12.247 is-at 00:40:f4:d8:4e:72
17:06:52.023248 arp who-has 140.137.12.56 tell 140.137.12.254
17:06:55.124773 arp who-has 140.137.12.56 tell 140.137.12.254
17:07:01.205729 arp who-has 140.137.12.56 tell 140.137.12.254
17:07:13.165892 arp who-has 140.137.12.56 tell 140.137.12.254
............
............


Proxy ARP

Proxy ARP 是讓 router 可以針對不同網段間的 ARP request,回傳正確的 ARP reply。基本上,傳送端目的僅是要取得接收端的 hardware address,與其讓 router 將 ARP request 封包 forward 到另外一個網段作廣播,不如就自己回應,網路使用的效率上反而好些(前提是 router 必須要知道接收端的 hardware address 以及 IP address)。


Gratuitous ARP

ARP 還有另外一種功能,就是在主機發送 ARP request 的目的是取得自己的 IP address 所對應的 hardware address 時,稱為 Gratuitous ARP。一般來說,通常都是發生在系統啟動時,或是將網路卡重新啟動時(所以在 Windows 中設定與別台主機相同的 IP 時會有警告訊息,就是 Gratuitous ARP 的功能)。

而 Gratuitous ARP 提供了兩大功能:
  1. 檢查是否有重複 IP address
  2. 當主機更換、或是網路卡更換後,透過 Gratuitous ARP 可以通知網段中的其他主機,IP address 與新的 hardware address 的對應關係

這個功能還曾被提出來可應用於 failover 的情況,可惜似乎不是每個 OS 都有實作出相同功能,所以這個部分稍微看看就好。


RARP 運作原理

其實跟 ARP 也沒有太大差異,只是所發出去跟接收回來的封包,分別是 RARP requestRARP reply

詳細的協定內容可以參考 RFC903

還有一點是需要注意的! 由於 RARP 會發送廣播封包,因此被定位為 Link Layer 的協定,因此封包是沒辦法跨過 router 的喔! 就不會造成網路壅塞的情況發生。


RARP 封包格式

RARP 的封包格式,與 ARP 是相同的,僅是在 frame type 欄位中,儲存的值為 0x8035。

【註】ARP 為 0x0806


沒有留言:

張貼留言