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