ARP - Linux手册页

时间:2019-08-20 18:01:51  来源:igfitidea点击:

Linux程序员手册 第7部分
更新日期: 2020-08-13

名称

arp-Linux ARP内核模块。

说明

此内核协议模块实现RFC 826中定义的地址解析协议。它用于在直接连接的网络上的Layer2硬件地址和IPv4协议地址之间进行转换。用户通常不直接与该模块交互,除非对其进行配置。相反,它为内核中的其他协议提供服务。

用户进程可以使用packet(7)套接字接收ARP数据包。还有一种机制可以通过使用netlink(7)套接字来管理用户空间中的ARP缓存。 ARP表也可以通过任何AF_INET套接字上的ioctl(2)进行控制。

ARP模块维护硬件地址和协议地址之间的映射缓存。高速缓存的大小有限,因此将对旧的和不常使用的条目进行垃圾收集。标记为永久性的条目永远不会被垃圾收集器删除。缓存可以通过使用ioctl进行直接操作,并且其行为可以通过下面描述的/ proc接口进行调整。

如果一段时间后对现有映射没有正面反馈(请参阅下面的/ proc接口),则邻居缓存条目被认为是陈旧的。可以从更高的层获得积极的反馈。例如来自成功的TCP ACK。其他协议可以使用MSG_CONFIRM标志向sendmsg(2)发出转发进度的信号。如果没有前进进度,则ARP尝试重新探测。它首先尝试向本地arp守护程序app_solicit时间询问更新的MAC地址。如果失败并且知道旧的MAC地址,则发送单播探测ucast_solicit次。如果同样失败,它将向网络广播一个新的ARP请求。仅当有排队发送的数据时才发送请求。

当Linux收到转发给它的地址的请求并且在接收接口上启用了代理arp时,将自动添加一个非常永久的代理arp条目。当目标存在拒绝路由时,不添加代理arp条目。

Ioctls

所有AF_INET套接字上都可以使用三个ioctl。他们以指向结构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地址,并且arp_ha必须具有与arp_dev中指定的设备相同的类型。 arp_dev是一个以零结尾的字符串,用于命名设备。

arp 标志 | 含义

如果设置了ATF_NETMASK标志,则arp_netmask应该有效。 Linux 2.2不支持代理网络ARP条目,因此应将其设置为0xffffffff或0以删除现有的代理arp条目。 ATF_USETRAILERS已过时,不应使用。

/proc interfaces

ARP支持一系列/ proc接口,以全局或每个接口为基础配置参数。可以通过读取或写入/ proc / sys / net / ipv4 / neigh / * / *文件来访问这些接口。系统中的每个接口在/ proc / sys / net / ipv4 / neigh /中都有其自己的目录。 "默认"目录中的设置用于所有新创建的设备。除非另有说明,否则与时间相关的接口以秒为单位。

anycast_delay(since Linux 2.2)

在回复IPv6邻居请求消息之前要延迟的最大抖动数量。任播支持尚未实现。默认为1秒。

app_solicit(since Linux 2.2)

在回落到多播探测之前,通过netlink发送到用户空间ARP守护程序的探测的最大数目(请参阅mcast_solicit)。预设为0。

base_reachable_time(since Linux 2.2)

一旦找到邻居,该条目就至少在base_reachable_time / 2和3 * base_reachable_time / 2之间的随机值有效。如果条目收到更高级别协议的积极反馈,则其有效性将得到扩展。默认为30秒。现在该文件已过时,取而代之的是base_reachable_time_ms。

base_reachable_time_ms(since Linux 2.6.12)

至于base_reachable_time,但以毫秒为单位。默认值为30000毫秒。

delay_first_probe_time(since Linux 2.2)

在确定邻居已过时之后的第一次探测之前的延迟。默认为5秒。

gc_interval(since Linux 2.2)

邻居条目的垃圾收集器应尝试运行的频率。默认为30秒。

gc_stale_time(since Linux 2.2)

确定检查过时的邻居条目的频率。如果邻居条目被认为是陈旧的,则在向其发送数据之前,将再次对其进行解析。默认为60秒。

gc_thresh1(since Linux 2.2)

ARP缓存中保留的最小条目数。如果缓存中的条目数少于该数量,则垃圾收集器将不会运行。默认值为128。

gc_thresh2(since Linux 2.2)

保留在ARP高速缓存中的软最大条目数。在执行收集之前,垃圾收集器将允许条目数量超过此数量5秒钟。默认值为512。

gc_thresh3(since Linux 2.2)

ARP高速缓存中保留的硬最大条目数。如果缓存中的条目数超过此数量,则垃圾收集器将始终运行。默认为1024。

locktime(since Linux 2.2)

在高速缓存中保留ARP条目的最小次数。如果存在多个潜在的映射(通常是由于网络配置错误),这可以防止ARP高速缓存崩溃。默认为1秒。

mcast_solicit(since Linux 2.2)

将条目标记为不可达之前,尝试通过多播/广播解析地址的最大次数。默认为3。

proxy_delay(since Linux 2.2)

当收到针对已知代理ARP地址的ARP请求时,最多延迟proxy_delay个延迟后再进行回复。在某些情况下,这用于防止网络泛洪。默认为0.8秒。

proxy_qlen(since Linux 2.2)

可以排队到代理ARP地址的最大数据包数。默认为64。

retrans_time(since Linux 2.2)

重发请求之前要延迟的延迟数量。默认为1秒。现在该文件已过时,取而代之的是retrans_time_ms。

retrans_time_ms(since Linux 2.6.12)

重传请求之前要延迟的毫秒数。默认为1000毫秒。

ucast_solicit(since Linux 2.2)

在询问ARP守护程序之前发送单播探测的最大尝试次数(请参阅app_solicit)。默认为3。

unres_qlen(since Linux 2.2)

其他网络层可以为每个未解析的地址排队的最大数据包数。默认为3。

版本

在Linux 2.0中,结构arpreq进行了更改,以包含arp_dev成员和同时更改的ioctl号。 Linux 2.2中不再支持旧的ioctl。

在Linux 2.2中删除了对网络(网络掩码不等于0xffffffff)的代理arp条目的支持。内核会为其他接口上的所有可访问主机将其替换为自动代理arp设置(当为接口启用转发和代理arp时)。

在Linux 2.2之前,neigh / *接口不存在。

BUGS

一些计时器设置是在jiffies中指定的,这些设置取决于体系结构和内核版本。参见time(7)。

无法通过信号传达来自用户空间的积极反馈。这意味着在用户空间中实现的面向连接的协议将生成过多的ARP流量,因为ndisc会定期重新探测MAC地址。同样的问题也适用于某些内核协议(例如,基于UDP的NFS)。

该手册页将特定于IPv4的功能与在IPv4和IPv6之间共享的功能融合在一起。

另外参见

功能(7),ip(7),arpd(8)

RFC 826对ARP的描述。 RFC 2461描述了IPv6邻居发现和使用的基本算法。如果适用,Linux 2.2+ IPv4 ARP使用IPv6算法。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/