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结 束 的 设 备 名 字 符 串 。
如 果 设 置 了 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 打 开 了 ) 。
另 见
RFC826 了
解 ARP 描 述 .
RFC2461 描 述 了 IPv6使 用
的 近 邻 查 找 以
及 基 本 算 法
[中 文 版 维 护 人 ]
Alan Yao <Alan_Yao [AT] 163.net>
[中 文 版 最 新 更 新 ]
2000/10/23
《 中 国 linux论 坛 man手 册 页 翻 译 计 划 》 :
跋
本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh