链路层地址(ARP/Neighbor)相关信息

@2014-03-13 新版功能: 创建

Linux 下查看 ARP 相关信息的命令为:

# arp -an
? (10.0.0.2) at 00:05:b7:09:4f:29 [ether] on eth0
? (10.0.0.8) at <incomplete> on eth0

如果希望查看更详细的数据或者查看 IPv6 相关的信息则需要使用 ip 命令:

# ip -s neighbor show
fe80::3a22:d6ff:feb5:30c7 dev eth0 lladdr 38:22:d6:b5:30:c7 router used 1127/1127/1110 probes 1 STALE
10.0.0.203 dev eth0 lladdr 00:1e:4f:ea:f2:2e ref 1 used 15/14/15 probes 4 REACHABLE

该命令的输出形式如下:

[ipv4/ipv6] [dev eth0] [lladdr xx:xx:xx:xx:xx:xx] [router] [proxy] [ref x] [used USED/CONFIRMED/UPDATED] [probes x] [INCOMPLETE | REACHABLE | STALE | DELAY | PROBE | FAILED | NOARP | PERMANENT]

各字段分别解释如下:

  • [ipv4/ipv6] 相应的 IP 地址
  • [dev eth0] 该地址对应的网络接口
  • [lladdr xx:xx:xx:xx:xx:xx] 链路层地址
  • [router]
  • [proxy]
  • [ref x] 引用计数
  • [used USED/CONFIRMED/UPDATED] 该地址的(使用/确认/更新,即当前状态维持)的时间
  • [probes x] 探测次数
  • [INCOMPLETE | REACHABLE | STALE | DELAY | PROBE | FAILED | NOARP | PERMANENT] 当前状态

各个状态的意义如下:

  • INCOMPLETE 链路地址探测之中,但还未完成
  • REACHABLE 链路地址可达,该状态的维持时间参考 base_reachable_time, base_reachable_time_ms
  • STALE 链路地址缓存失效,但并不意味不可达
  • DELAY 探测开始之间的延迟,参考 delay_first_probe_time
  • PROBE 链路地址探测之中
  • FAILED 链路地址不可用(被删除)
  • NOARP
  • PERMANENT

Linux 下 ARP 相关的可控参数请参考 arp(7),如 gc (garbage collector)的相关配置。

ARP 的一些状态变化的过程如下:

  1. 主机发送 ARP 查询

    17:33:36.758857 ARP, Request who-has 10.2.0.3 tell 10.2.11.2, length 28
    
  2. 收到目标机器回应后 ARP 状态变为 REACHABLE

    17:33:36.759059 ARP, Reply 10.2.0.3 is-at 00:1d:09:2b:07:dd, length 46
    
    # ip -s neigh show 10.2.0.3
    10.2.0.3 dev eth0 lladdr 00:1d:09:2b:07:dd used 1/0/1 probes 4 REACHABLE
    
  3. 在和目标机器没有数据通讯的状态持续时间在 base_reachable_time/2 和 3*base_reachable_time/2 之间(参考 neigh_rand_reach_time of net/core/neighbour.c), 状态会由 REACHABLE 转变为 STALE,即缓存超时。如果和目标机器持续有数据传输, ARP 状态可能维持在 REACHABLE。

  4. 在收到该目标机器的 unsolicited (gratutious) ARP 回应时,ARP 的状态也会有所更新,如由 FAILED 变为 STALE。使用如下命令发送 unsolicited ARP 回应包。

    # arping -c 4 -A -I eth0 10.2.0.3
    ARPING 10.2.0.3 from 10.2.0.3 eth0
    Sent 4 probes (4 broadcast(s))
    Received 0 response(s)
    
  5. 在 ARP 表项过多时,内核会根据 gc_interval/gc_stale_time/gc_thresh1/gc_thresh2/gc_thresh3 的值来决定 何时以及以何种策略来执行 gc 动作。