Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346473
  • 博文数量: 102
  • 博客积分: 3140
  • 博客等级: 中校
  • 技术积分: 680
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-28 11:44
个人简介

开阔未来

文章分类

全部博文(102)

文章存档

2015年(10)

2014年(1)

2013年(1)

2012年(4)

2011年(8)

2010年(24)

2009年(51)

2008年(3)

我的朋友

分类: LINUX

2009-03-22 12:32:57

这个核心协议模块实现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结束的设备名字符串。



如果设置了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使用的近邻查找以及基本算法
阅读(1882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~