以太网链路基础与自协商机制

做网络故障排查,尤其是链路抖动(Link Flapping),第一件事就是搞清楚链路是怎么建起来的。很多人一上来就抓包、看日志,反而忽略了最底层的东西——以太网链路的状态机和自协商过程。我个人习惯,拿到一个抖动案例,先翻PHY芯片的寄存器,看看链路到底卡在哪个阶段。

链路基本概念

以太网物理层链路,说白了就是两片PHY芯片通过网线(或光纤)握手。握手成功后,才能收发数据。链路状态只有两种:Link Up和Link Down。但中间有个过渡态——Auto-Negotiation(自协商)。

为什么要先讲这个?因为Link Flapping的本质就是链路在Up和Down之间反复跳变。你想想看,如果自协商每次都失败然后又重试,就会产生短暂的Link Down事件。很多“间歇性断网”都是这个原因。

关键点:自协商失败 → 链路断开 → 重新协商 → 链路恢复 → 又失败 → 断开… 这就是典型的Link Flapping循环。

自协商工作流程

自协商是IEEE 802.3规定的一套标准流程。我给大家拆解成几个关键步骤,每一步都可以在寄存器里找到对应证据。

  1. FLP Burst发送:链路启动后,PHY发送快速链路脉冲(Fast Link Pulse)序列,告诉对端自己支持的能力(速率、双工模式)。
  2. 能力交换:双方交换Base Page和Next Page(可选),里面包含了速度、双工、流控等信息。
  3. 优先级仲裁:按照优先级表选出一致的最佳模式。比如1000M全双工优先级最高,10M半双工最低。
  4. Ack完成:双方确认一致后,各自锁存配置。
  5. Link Up:PHY内部状态机切换到Link Up状态,发出中断或更新状态寄存器。

我在项目中遇到过好几次,自协商卡在了第3步。原因是两端PHY的优先级表实现不一致——一边是Marvell,一边是Broadcom,结果互相发完能力后,一直不进入Ack完成状态。嗯,这种坑不翻寄存器根本看不出来。

小技巧:很多PHY的寄存器0x01(MII Status Register)里有个Bit 5(Auto-Negotiation Complete),如果这个位永远不置1,那就说明自协商一直在转圈圈。

寄存器证据解析

下面是我最关心的部分:用寄存器证明自协商状态。以常见的千兆PHY(比如Marvell 88E1111)为例,关键寄存器如下:

寄存器地址名称关键位含义
0x00BMCR(Basic Mode Control Register)Bit 12(Auto-Negotiation Enable)
Bit 9(Restart Auto-Negotiation)
是否启用自协商;是否触发重新协商
0x01BMSR(Basic Mode Status Register)Bit 5(Auto-Negotiation Complete)
Bit 2(Link Status)
自协商完成状态;当前链路是否up
0x04ANAR(Auto-Negotiation Advertisement Register)Bit 15:9(技术能力字段)本端宣告的能力
0x05ANLPAR(Auto-Negotiation Link Partner Ability Register)Bit 15:9(技术能力字段)对端宣告的能力,两边核对

实际排查时,我通常会这样操作:

  • 读0x01的Bit 2,如果为0,说明物理链路断开了——先查网线、光模块、端口协商模式。
  • 如果Bit 2为1但Bit 5为0,说明链路虽然物理上连着(可能有信号),但自协商没完成。这时候去读0x05,看看对端到底发了什么能力。我曾经遇到过对端PHY把1000M能力位漏发了,导致一直协商不上。
  • 如果不停读到Bit 5在0和1之间跳变,那就是Link Flapping的铁证——自协商反复失败。

警告:有些PHY的Link Status寄存器存在“粘滞位”问题——一旦Link Down,Bit 2会锁在0,需要先读一次清掉。如果你只读一次就判定链路断开,可能会被误导。我建议连续读3次,取最新值。

下面我用一张流程图总结自协商与寄存器的关系,方便大家对照排查。

自协商与寄存器证据流程图 自协商流程与寄存器证据 链路启动 发送FLP Burst 能力交换(ANAR↔ANLPAR) 优先级仲裁 Ack完成? Link Up (BMSR Bit5=1) 超时/失败→重试 关键寄存器 BMCR: 启用自协商 BMSR: 完成&状态 ANAR/ANLPAR: 能力 Link Flapping特征 BMSR Bit5 频繁跳变 或Link状态粘滞

常见问题与避坑

说实话,自协商相关的坑,我踩过不下十个。这里列几个高频问题:

  • 强制协商 vs 自协商不匹配:一端设置强制1000M全双工,另一端自协商。这种情况下,对端可能收不到FLP,直接Link Down。我曾经排查过一个机房搬迁后的批量断网,最后发现是运维脚本把千兆口写成了强制模式,但对端交换机默认自协商。
  • 网线质量导致协商降速:CAT5E线跑千兆,自协商时因为串扰太大,对端只收到100M的能力,于是双方协商成100M。但业务流量一上来,误码率飙升,PHY又触发重新协商……这就是Link Flapping。
  • PHY寄存器复位后的初始值:很多PHY上电后自协商是默认开启的,但有些厂商为了兼容老设备,会把默认速度设为10M半双工。如果你不读一下BMCR,很可能会误判。

避坑指南:我曾经遇到过一台设备,自协商日志里显示“Link Up”,但ping不通。最后读BMSR发现Bit5(自协商完成)是1,但Bit2(Link Status)是0。这就奇怪了。后来发现——这PHY的Link Status寄存器在自协商完成后会先置1,然后内部链路训练失败又清零,中间有个几百微秒的窗口。如果你轮询间隔太大,就抓不到这个Down事件。所以排查Link Flapping时,一定要用高速连续读寄存器(比如每10ms一次),才能捕捉到真正的抖动。