ARP(7)

NAME
arp - Linux的ARP核心模組

描述
這個核心協議模組實現RFC826中定義的 Address Resolution Protocol [譯註：即TCP/IP的第三層到第一層的地址轉換協議]， 用於在直接相連的網路中換第二層硬體地址和 Ipv4 協議地址之間的轉換。 使用者除非想對其進行配置，否則一般不會直接操作這個模組。

實際上，它提供對核心中其它協議的服務。

使用者程序可以使用 packet(7) 的 sockets，收到 ARP 包（譯註：一譯分組）。 還有一種機制是使用 netlink(7) sockets，在使用者空間管理 ARP 快取的機制。 我們也可以通過 ioctl (2) 控制任意 PF_INET socket上的 ARP 表

ARP 模組維護一個硬體地址到協議地址對映的快取。這個快取有大小限制，所以 不常用的和舊的記錄（Entry）將被垃圾收集器清除（garbage-collected）， 垃圾收集器永遠不能刪除標為永久的記錄。我們可以使用ioctls直接操縱緩衝， 並且其性狀可以用下面定義的 sysctl 調節。

如果在限定的時間（見下面的sysctl）內，一條現存對映沒有肯定反饋時， 則認為相鄰層的快取記錄失效。 為了再次向目標傳送資料，ARP將首先試著詢問本地arp程序 app_solicit 次，獲取更新了的 MAC（介質訪問控制）地址。 如果失敗，並且舊的MAC地址是已知的，則傳送 ucast_solicit 次的 unicast probe。如果仍然失敗，則將向網路廣播一個新的ARP請求,此時要 有待發送資料的佇列

如果 Linux 接到一個地址請求，而且該地址指向 Linux 轉發的地址， 並且接收介面打開了代理 arp 時，Linux 將自動新增一條非永久的 代理 arp 記錄；如果存在拒絕到目標的路由，則不新增代理 arp 記錄。

IOCTLS
有三個 ioctl 可以用於所有 PF_INET 的 sockets 中。它們以一個指向 struct arpreq 的指標作為它們的引數。

struct arpreq
{
struct sockaddr arp_pa; /* 協議地址(protocol address)*/
struct sockaddr arp_ha; /* 硬體地址(hardware address) */
int arp_flags; /* 標誌(flags) */
struct sockaddr arp_netmask;
/* 協議地址的網路掩碼(netmask of protocol address)*/
char arp_dev[16];
};

SIOCSARP, SIOCDARP 和 SIOCGARP 可分貝設定、刪除和獲取 ARP 對映。設定和刪除 ARP 對映是特許操作， 只有擁有 CAP_NET_ADMIN 許可權的程序或有效UID為0的程序可以執行。

arp_pa 必須是 AF_INET socket，並且 arp_ha 必須有和 arp_dev. 指定的裝置相同的型別。 arp_dev 是個以null結束的裝置名字串。

arp_flags
標誌(flag) | 含義(meaning)
ATF_COM | 查詢完成(Lookup complete)
ATF_PERM | 永久記錄(Permanent entry)
ATF_PUBL | 張貼記錄(Publish entry)
ATF_USETRAILERS | 要求使用字尾(Trailers requested)
ATF_NETMASK | 使用網路掩碼(Use a netmask)
ATF_DONTPUB | 不回覆(Don't answer)

如果設定了 ATF_NETMASK 標誌，那麼 arp_netmask 必須有效。 Linux 2.2 不支援代理網路 ARP 記錄，因此，要設成0xffffffff或者0， 以刪除現存代理arp記錄。這裡不使用 現存代理arp記錄。 ATF_USETRAILERS 已經過時了，不應該繼續使用。

SYSCTLS
ARP 支援一個 sysctl 介面，可以用以配置全域性引數或逐個網路介面地進行配製。 該 sysctl 可以通過 /proc/sys/net/ipv4/neigh/*/* 檔案或者使用 sysctl(2) 介面來訪問。系統中每個介面都在 /proc/sys/net/ipv4/neigh/. 中有自己的目錄。`default'目錄中的設定用於所有新建的裝置。 sysctl 相關的時間是以秒為單位，除非特別宣告過．

anycast_delay
    對 IPv6 相鄰請求資訊的回覆的最大延遲時間； 目前還不支援 anycast。預設值為1秒。

app_solicit
    這是在使用多路廣播探測(multicast probe)前， 經過網路連線送到使用者間隙ARP埠監控程式的探測（probe） 最大數目(見 mcast_solicit )。 預設值為0。

base_reachable_time
    一旦發現相鄰記錄，至少在一段介於 base_reachable_time/2和3*base_reachable_time/2 之間的隨機時間內，該記錄是有效的。如果收到上層協議的肯定反饋， 那麼記錄的有效期將延長。 預設值是30秒。

delay_first_probe_time
    發現某個相鄰層記錄無效(stale)後，發出第一個探測要等待的時間。 預設值是5秒。

gc_interval
    收集相鄰層記錄的無用記錄的垃圾收集程式的執行週期，預設為30秒。

gc_stale_time
    決定檢查一次相鄰層記錄的有效性的週期。 當相鄰層記錄失效時，將在給它傳送資料前，再解析一次。 預設值是60秒。

gc_thresh1
    存在於ARP快取記憶體中的最少層數，如果少於這個數， 垃圾收集器將不會執行。預設值是128。

gc_thresh2
    儲存在 ARP 快取記憶體中的最多的記錄軟限制。 垃圾收集器在開始收集前，允許記錄數超過這個數字 5 秒。 預設值是 512。

gc_thresh3
    儲存在 ARP 快取記憶體中的最多記錄的硬限制， 一旦快取記憶體中的數目高於此， 垃圾收集器將馬上執行。預設值是1024。

locktime
    ARP 記錄儲存在快取記憶體內的最短時間（jiffy數）， 以防止存在多個可能的對映(potential mapping)時， ARP 快取記憶體系統的顛簸 (經常是由於網路的錯誤配置而引起)。 預設值是 1 秒。

mcast_solicit
    在把記錄標記為不可抵達的之前， 用多路廣播/廣播（multicast/broadcast）方式解析地址的最大次數。 預設值是3。

proxy_delay
    當接收到有一個請求已知的代理 ARP 地址的 ARP 請求時， 在回應前可以延遲的 jiffy（時間單位，見BUG）數目。 這樣，以防止網路風暴。預設值是0.8秒。

proxy_qlen
    能放入代理 ARP 地址佇列(proxy-ARP addresses)的資料包最大數目。預設值是64。

retrans_time
    重發一個請求前的等待 jiffy（時間單位，見BUG）的數目。預設值是1秒。

ucast_solicit
    詢問ARP埠監控程式前，試圖傳送單探測（unicast probe）的次數。 (見 app_solicit). 預設值是3秒。

unres_qlen
    每個沒有被其它網路層解析的地址，在佇列中可存放包的最大數目。預設值是3.

BUGS
時鐘設定的時間單位 jiffy，跟硬體體系有關。 在 Alpha 上，一個 jiffy 是 1/1024 秒，而在其它機器上，是 1/100 秒。

目前還沒有辦法從使用者空間傳送肯定反饋。 這意味著在使用者空間實現的面向連線的協議 （connection oriented protocols）將產生大量的 ARP 通訊。 因為ndisc將重新探測MAC地址。核心 NFS 的實現也存在同樣的問題。

這個手冊頁主要講 IPv4 規範並且共享 IPv4 和 IPv6 的功能．

版本

Linux 2.0中的 struct arpreq， 添加了 arp_dev ，同時 ioctl 數目也改變了。在 Linux 2.2 中將不再支援舊的ioctl。

在 Linux 2.2 中，取消了對網路代理 arp 記錄(網路掩碼不是0xffffffff)的支援。 這個功能被核心設定的一個自動代理 arp 取代，這個自動代理 arp 用於所有位於 其它接上的可到達的主機（如果該介面的轉發和代理 arp 打開了）。

另見
ip(7)

RFC826 瞭解 ARP 描述．
RFC2461 描述了IPv6使用的近鄰查詢以及基本演算法

[中文版維護人]
Alan Yao <Alan_Yao@163.net>

[中文版最新更新]
2000/10/23

《中國linux論壇man手冊頁翻譯計劃》:
http://cmpp.linuxforum.net

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh