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