Skip to content

ARP、IPv6 邻居发现与二层弹性 ​

内容摘要:IP 是端到端地址,MAC 是逐跳地址(05),二者之间需要「翻译」——IPv4 用 ARP,IPv6 用 NDP(邻居发现)。本章讲清这层翻译的报文、状态与缓存,以及二层网络如何靠生成树(STP)避免环路、靠链路聚合提升带宽与冗余。这是「同网段能不能通」的直接决定因素,也是 ARP 欺骗等攻击的战场(网络安全)。

难度:中级 | 前置知识:05 以太网与 VLAN、03 报文剖析 | 所属层次:链路层↔网络层之间

一、为什么需要地址解析 ​

主机要发一个 IP 包给同网段的目标,链路层却只认 MAC(05)。所以必须先回答:「IP 地址 192.0.2.20 对应的 MAC 是多少?」 这就是地址解析。

关键认知:跨网段时,主机解析的是「网关的 MAC」而非「最终目标的 MAC」。 目的 IP 始终是最终目标,但目的 MAC 是「下一跳」。每经过一个路由器,源/目的 MAC 都被改写,IP 不变(07)。这解释了为什么 ARP 表里网关的 MAC 至关重要——它错了,整个默认路由都发不出去。

二、ARP(IPv4 地址解析协议) ​

ARP(Address Resolution Protocol,RFC 826) 用广播「问」、单播「答」,把 IPv4 地址解析为 MAC。ARP 直接跑在以太网之上(EtherType 0x0806),不经过 IP 层。

1、请求-应答时序 ​

2、ARP 报文关键字段 ​

字段长度取值示例语义抓包显示常见异常
硬件类型2B1=以太网链路类型Hardware type—
协议类型2B0x0800=IPv4要解析的协议Protocol type—
操作码(op)2B1=请求、2=应答请求还是应答Opcode伪造应答(欺骗)
发送方 MAC/IP6B/4B86:…/192.0.2.2发送方地址对Sender伪造(网络安全)
目标 MAC/IP6B/4B00:…/192.0.2.20目标地址对Target—

3、免费 ARP 与 ARP 缓存 ​

  • 免费 ARP(Gratuitous ARP):主机主动广播「我是 IP X,MAC 是 Y」,用途:检测 IP 冲突、通告 MAC 变更(如 VRRP 主备切换、QoS 与高可用;虚拟机迁移)。也被 ARP 欺骗滥用。
  • ARP 缓存:解析结果缓存一段时间(避免每包都问)。缓存有老化时间,条目状态在不同 OS 有差异(Linux 有 INCOMPLETE/REACHABLE/STALE/DELAY/PROBE 等,与 NDP 状态机类似)。

三、NDP(IPv6 邻居发现协议) ​

IPv6 没有 ARP,改用 NDP(Neighbor Discovery Protocol,RFC 4861),基于 ICMPv6(09),用组播而非广播,功能也更丰富。

NDP 报文ICMPv6 类型作用对应 IPv4
路由器请求(Router Solicitation, RS)133主机请求路由器信息无(DHCP 相关)
路由器通告(Router Advertisement, RA)134路由器通告前缀/网关/MTU无(DHCP/ICMP 混合)
邻居请求(Neighbor Solicitation, NS)135解析 IPv6→MAC / DADARP Request
邻居通告(Neighbor Advertisement, NA)136回应 NSARP Reply
重定向(Redirect)137告知更优下一跳ICMP Redirect

设计改进:ARP 用广播打扰整个网段的所有主机;NDP 的 NS 发往被请求节点组播地址(solicited-node multicast,ff02::1:ffXX:XXXX),只打扰目标 IP 相关的少数主机——更高效、更省无线电(对 Wi-Fi 友好)。

1、邻居缓存状态机(NDP) ​

NDP 邻居缓存(neighbor cache)比 ARP 更明确地维护可达性状态:

2、重复地址检测(DAD) ​

重复地址检测(Duplicate Address Detection,DAD,RFC 4862):IPv6 主机在正式启用一个地址前,先对该地址发 NS「有人在用吗?」——若收到 NA 说明冲突,则不启用。这是 IPv6 即插即用(SLAAC,08)的安全基础。

四、最小可复现实验:查看邻居表 ​

1、实验目标 ​

  • 查看本机 ARP 表(IPv4)与 NDP 邻居表(IPv6)及其状态。

2、平台与工具 ​

  • 本机验证环境:macOS 26.6.2,arp、ndp。Linux 用 ip neigh(见注释)。

3、执行命令与本机实测 ​

IPv4 ARP 表(本机可跑):

bash
# macOS(本机可跑)
arp -an
# Linux 等价
ip neigh show

本机实测(2026-09-07,MAC 与 IP 已按本库规范脱敏为 RFC 5737 文档地址 + 示例 MAC,仅保留结构与状态语义):

text
? (192.0.2.1)   at 02:00:5e:00:00:01 on en0 ifscope [ethernet]           # 网关
? (192.0.2.20)  at 02:00:5e:00:00:14 on en0 ifscope [ethernet]
? (192.0.2.2)   at 02:00:5e:00:00:02 on en0 ifscope permanent [ethernet] # 本机(permanent)

IPv6 邻居表(本机可跑):

bash
# macOS(本机可跑)
ndp -an
# Linux 等价
ip -6 neigh show

本机实测(2026-09-07,地址脱敏为 2001:db8::/32 文档前缀,保留真实观测到的状态字段 R/S/permanent 与 incomplete):

text
Neighbor                       Linklayer Address   Netif Expire    St Flgs
2001:db8::1                     02:00:5e:00:00:01     en0 23h41m50s  S  R    # 邻居, Stale, Router
fe80::1%en0                     02:00:5e:00:00:01     en0 permanent  R       # 链路本地
2001:db8::ff2                   (incomplete)        utun4 permanent  R       # 未解析成功

解读:St 列的 S(STALE)、R(REACHABLE/Router flag) 印证了第三节的邻居缓存状态机;(incomplete) 表示 NS 未收到 NA、解析未完成——这正是「IPv6 邻居不可达」的直接证据(对应排障,分层故障排查)。permanent 是静态/本机条目,不老化。

4、失败注入(需 Linux,本环境未执行) ​

在隔离环境删除某邻居条目、观察重新解析;或注入静态错误条目模拟 ARP 欺骗后果(仅隔离环境):

bash
# [未在本环境执行] Linux;仅隔离实验环境
ip neigh flush dev eth0                       # 清空后触发重新 ARP
ip neigh replace 192.0.2.20 lladdr 02:00:5e:00:00:99 dev eth0 nud permanent  # 模拟错误映射
# 预期:发往 192.0.2.20 的帧被送到错误 MAC → 不可达(演示 ARP 欺骗后果)
ip neigh del 192.0.2.20 dev eth0              # 清理

安全边界:注入错误邻居条目仅限本机隔离实验演示后果,不得在生产或他人网络实施 ARP 欺骗(网络安全)。

5、结论边界与清理 ​

  • 邻居表为单主机、单时刻快照。静态注入实验须用 ip neigh del/flush 恢复。

五、二层弹性(一):生成树协议 STP ​

二层网络若存在物理环路(为冗余而多路径),广播帧会无限循环、指数放大,形成广播风暴,瞬间打死网络。生成树协议(Spanning Tree Protocol,STP,IEEE 802.1D) 通过逻辑上阻塞冗余链路,把带环拓扑裁剪成无环树。

  • 原理:选举根桥(Root Bridge),各交换机计算到根的最短路径,阻塞会形成环路的冗余端口(Blocking 状态),只在主链路故障时收敛并启用备份链路。
  • 收敛慢是经典痛点:传统 STP 收敛需数十秒。RSTP(Rapid STP,802.1w) 与 MSTP(多实例,802.1s) 大幅加快收敛并支持按 VLAN 分树。
  • 无 STP 的后果:一个错插的环路 + 一个广播帧 = 全网瘫痪。这是二层网络最危险的自伤方式。

数据中心趋势:STP 阻塞冗余链路 = 浪费带宽。现代数据中心多用三层到边缘(L3 到 ToR)+ ECMP(10)或 Overlay(VXLAN)(VPN 与隧道)替代大二层 STP,把「无环」交给三层路由解决。

六、二层弹性(二):链路聚合 ​

链路聚合(Link Aggregation,IEEE 802.1AX,俗称 LAG/bonding/EtherChannel) 把多条物理链路捆成一条逻辑链路,同时提升带宽与冗余。

  • LACP(Link Aggregation Control Protocol):动态协商聚合,检测配置一致性与链路健康。
  • 哈希分担:按五元组(02)哈希把不同流分到不同物理链路——单条大流不会被拆到多链路(保序),所以「聚合 3×1G」不等于「单连接能跑 3G」。这是常见误解。
  • 与 STP 的关系:聚合后的逻辑链路对 STP 是「一条链路」,不会被 STP 当环路阻塞。

七、错误示例与常见误区 ​

误区纠正
「跨网段要解析目标主机的 MAC」解析的是网关的 MAC;目标 MAC 逐跳改写。
「IPv6 也用 ARP」IPv6 用 NDP(基于 ICMPv6 组播),无 ARP。
「ARP 表有条目就一定能通」条目可能过期/错误;NDP 的 INCOMPLETE/STALE 说明未必可达。
「二层冗余链路越多越好」无 STP 会成环路→广播风暴;需 STP/RSTP 或三层替代。
「链路聚合 3×1G = 单连接 3G」按流哈希分担,单条流仍受单链路限制。
「免费 ARP 无害」是正常机制,也是 ARP 欺骗的载体,需 DAI 防护。

八、性能影响 ​

  • ARP/NDP 风暴:大广播域内海量解析请求消耗带宽/CPU(05 广播域控制)。
  • STP 收敛时间:传统 STP 收敛慢导致故障切换期间中断;用 RSTP/MSTP 或三层 ECMP。
  • 邻居缓存未命中:首包需先解析,引入一次 RTT 级延迟;缓存老化过快会反复解析。
  • 链路聚合哈希不均:哈希算法不当导致流量倾斜到某条物理链路,聚合收益打折(性能观测)。

九、安全风险与加固 ​

风险原理检测证据加固
ARP 欺骗(ARP spoofing)伪造 ARP 应答,把网关/目标 IP 指向攻击者 MAC,做中间人抓包见同一 IP 对应多个 MAC、异常免费 ARP动态 ARP 检测(DAI)、DHCP Snooping、静态绑定关键网关(网络安全)
NDP 欺骗/RA 欺骗伪造 NA/RA 冒充网关或下发恶意前缀异常 RA、邻居 MAC 突变RA Guard、SEND(Secure ND)、交换机 ND 检测
DAD 攻击对受害者 DAD 请求持续回应「地址已用」,阻止其获取 IPv6 地址DAD 反复失败交换机侧防护、监控

本库红线:ARP/NDP 欺骗的演示仅限授权隔离环境;不提供针对真实网络的攻击指引。防护措施(DAI、RA Guard)应在生产启用。

十、版本与平台差异 ​

  • ARP=RFC 826、NDP=RFC 4861、DAD/SLAAC=RFC 4862、STP=802.1D / RSTP=802.1w / MSTP=802.1s、链路聚合=802.1AX。
  • Linux:ip neigh(邻居)、bridge(软件交换 + STP)、bonding/team(聚合);macOS:arp/ndp;交换机:厂商 CLI(EtherChannel/port-channel 等语法各异)。

十一、常见问题与排查方向 ​

  • 「同网段 ping 不通」:查 ARP/NDP 表是否解析成功(INCOMPLETE/incomplete 即失败)、是否 VLAN 隔离、是否 MAC 冲突(05、分层故障排查)。
  • 「网关时通时断」:查是否 ARP 欺骗(一 IP 多 MAC)、VRRP 切换后免费 ARP(QoS 与高可用)。
  • 「插线后全网变慢/瘫痪」:查二层环路与广播风暴、STP 是否生效。
  • 「IPv6 拿不到地址」:查 RA 是否收到、DAD 是否冲突/被攻击(08)。

十二、清理与恢复 ​

  • 只读查看无副作用;ip neigh 静态注入、bridge/bonding 实验须删除恢复(见第四节与 20)。

十三、关联章节 ​

检索关键词 ​

ARP 请求应答 RFC 826 免费 ARP Gratuitous ARP ARP 缓存 NDP 邻居发现 RFC 4861 NS NA RS RA ICMPv6 被请求节点组播 邻居缓存状态机 INCOMPLETE REACHABLE STALE DAD 重复地址检测 STP 生成树 根桥 RSTP MSTP 收敛 链路聚合 LACP bonding ARP 欺骗 DAI RA Guard

权威来源 ​

  • RFC 826(ARP)、RFC 5227(IPv4 地址冲突检测/ACD)
  • RFC 4861(IPv6 邻居发现)、RFC 4862(IPv6 无状态地址自动配置 / DAD)
  • IEEE 802.1D(STP)、802.1w(RSTP)、802.1s(MSTP)、802.1AX(链路聚合)
  • Linux ip-neighbour(8)、bridge(8) man page(以目标内核版本为准)

ARP/NDP 报文与状态机以上述 RFC 为准,STP/聚合以 IEEE 标准为准,verified_at: 2026-09-07;邻居表输出为 macOS 26.6.2 本机真实结构,MAC/IP 已按脱敏规范替换为文档地址,保留真实状态字段语义。静态邻居注入与 bridge/bonding 实验未在本环境执行(macOS 无 ip neigh/bridge)。

ICP 备案号待补充 · Gitee 主页