自协商(AN)协议详解

自协商这东西,说白了就是两个端口在物理层握手,商量好大家都用什么速度、什么双工模式。我刚开始接触以太网时觉得它很简单,后来在项目中被它坑过好几次才老实——一个握手失败,整条链路直接罢工,连调试都进不去。

AN 的核心:FLP 脉冲

自协商靠的是 FLP(Fast Link Pulse)脉冲序列。两个端口上电后,各自发一串脉冲给对方。脉冲里编码了能力信息:支持哪些速率、是否支持全双工、是否支持流控等等。

关键点:

  • 每个 FLP 脉冲包含 33 个时钟位置,其中 17 个是脉冲位置。
  • 脉冲携带 Base Page 和 Next Page(可选),Base Page 包含主要能力。
  • 双方通过脉冲序列交换 16-bit 的能力代码。

我记得有一次在实验室调一个 10GBase-T 的板卡,发现 PHY 总是协商到 1Gbps 而不是预期的 10Gbps。查了半天,原来是我用的调试网线只支持到 1G,FLP 脉冲传过去后对方根据能力集自动降级了。嗯,这个教训让我记住了:线缆质量直接影响 AN 结果。

协商过程:先听后说

自协商是个“先听后说”的过程。端口在发送自己的 FLP 脉冲前,先监听一段时间,看线路上有没有其他脉冲。如果检测到对方也在发,双方就同步到同一个速度。

避坑指南:我曾经遇到一个奇怪问题,两个交换机背靠背直连,自协商失败,链路始终 down。后来用示波器抓 FLP 脉冲,发现一端发送时钟偏差太大,脉冲宽度超出规范。换了个 PHY 芯片就好了。所以碰到自协商问题,先拿示波器看脉冲质量。

优先级决议表

双方交换完能力后,根据这张表选一个双方都支持的最高优先级组合。我习惯称为“能力对齐矩阵”。

速率双工模式优先级(高→低)
10 Gbps全双工1(最高)
5 Gbps全双工2
2.5 Gbps全双工3
1 Gbps全双工4
1 Gbps半双工5
100 Mbps全双工6
100 Mbps半双工7
10 Mbps全双工8
10 Mbps半双工9(最低)

你想想看,如果 A 端支持 1G 全双工和 100M 全双工,B 端只支持 100M 半双工和 10M 全双工,那最终协商结果就是 100M 全双工——因为 A 的 100M 全双工优先级高于 B 的 100M 半双工,同时双方都有 100M 能力。这个逻辑很直观,但实际中经常因为某端没打开某项能力导致降级。

Next Page:扩展能力交换

标准自协商的 Base Page 只有 16 bit,装不下太多信息。所以 IEEE 802.3 定义了 Next Page 机制:协商完 Base Page 后,双方可以继续发更多页交换扩展信息,比如 EEE(节能以太网)、MACsec 等。

注意:Next Page 不是必须的,很多老设备不实现它。如果你需要 EEE 或快速链路唤醒(FLR),必须确保两端都支持 Next Page。我见过一个项目,因为一端没开 Next Page,EEE 模式始终进入不了,功耗比预期高不少。

AN 时序与状态机

自协商状态机分成几个阶段:

  1. 能力检测:听线路,收集对方的 FLP 脉冲。
  2. 能力交换:双方互发 Base Page(以及可选的 Next Page)。
  3. 确认:双方都收到并确认对方的 Base Page。
  4. 协商完成:按优先级表决定最终速度和双工。
  5. 链路建立:进入正常数据传输模式。

整体时序大概在几十毫秒到几百毫秒之间。我见过一些 PHY 芯片的 AN 超时设置太短,导致有时链路起不来。

常见故障模式

  • FLP 脉冲丢失:线缆断线或接触不良,一端完全收不到脉冲。
  • 时钟偏差:脉冲发送时钟不准,接收端无法解析。
  • 能力不匹配:比如 A 端要求 10G 全双工,B 端只支持 1G,最终协商失败或降级。
  • EEE 协商冲突:一端要求 EEE,另一端不支持或没开,导致协商卡在 Next Page 阶段。

快速定位技巧:我习惯让 PHY 强制在某个速度和双工下工作,跳过自协商。如果强制能通,那就是 AN 的问题;如果强制也不通,就要查硬件和线缆了。这么做能帮你快速缩小范围。

知识结构总览

下面这张图把自协商的核心知识点串在一起。

自协商(AN)知识结构 自协商(AN)协议 FLP 脉冲序列 能力交换(Page) 优先级决议 Base Page(16bit) Next Page(扩展) 确认 & 完成 EEE 协商 速率 & 双工选择 流控能力协调 常见故障排查方法 强制模式跳过 AN 可快速定位

实际项目中的 AN 调优建议

我个人习惯在系统启动时加一个自协商状态打印,把双方协商的结果、能力集、错误码都 log 出来。这样一旦链路异常,几分钟就能定位到是 FLP 问题还是能力集问题。

还有一个地方容易踩坑——EEE 的协商。如果两端都支持 EEE,但一方在 Next Page 中发送了“EEE 请求”,另一方却回复“不支持”,后续链路会退回到非 EEE 模式。但有些 PHY 芯片在此时会错误地进入休眠状态,造成链路闪断。我曾经遇到过这种案子,最后靠更新固件解决了。

嗯,总之一句话:自协商不是万能的,但你不理解它,链路出了问题就毫无头绪。