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 記錄。
有三個 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
已經過時了,不應該繼續使用。
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.
時鐘設定的時間單位
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 <[email protected]>
2000/10/23
http://cmpp.linuxforum.net
本頁面中文版由中文 man
手冊頁計劃提供。
中文 man 手冊頁計劃:
https://github.com/man-pages-zh/manpages-zh