自协商(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 时序与状态机
自协商状态机分成几个阶段:
- 能力检测:听线路,收集对方的 FLP 脉冲。
- 能力交换:双方互发 Base Page(以及可选的 Next Page)。
- 确认:双方都收到并确认对方的 Base Page。
- 协商完成:按优先级表决定最终速度和双工。
- 链路建立:进入正常数据传输模式。
整体时序大概在几十毫秒到几百毫秒之间。我见过一些 PHY 芯片的 AN 超时设置太短,导致有时链路起不来。
常见故障模式
- FLP 脉冲丢失:线缆断线或接触不良,一端完全收不到脉冲。
- 时钟偏差:脉冲发送时钟不准,接收端无法解析。
- 能力不匹配:比如 A 端要求 10G 全双工,B 端只支持 1G,最终协商失败或降级。
- EEE 协商冲突:一端要求 EEE,另一端不支持或没开,导致协商卡在 Next Page 阶段。
快速定位技巧:我习惯让 PHY 强制在某个速度和双工下工作,跳过自协商。如果强制能通,那就是 AN 的问题;如果强制也不通,就要查硬件和线缆了。这么做能帮你快速缩小范围。
知识结构总览
下面这张图把自协商的核心知识点串在一起。
实际项目中的 AN 调优建议
我个人习惯在系统启动时加一个自协商状态打印,把双方协商的结果、能力集、错误码都 log 出来。这样一旦链路异常,几分钟就能定位到是 FLP 问题还是能力集问题。
还有一个地方容易踩坑——EEE 的协商。如果两端都支持 EEE,但一方在 Next Page 中发送了“EEE 请求”,另一方却回复“不支持”,后续链路会退回到非 EEE 模式。但有些 PHY 芯片在此时会错误地进入休眠状态,造成链路闪断。我曾经遇到过这种案子,最后靠更新固件解决了。
嗯,总之一句话:自协商不是万能的,但你不理解它,链路出了问题就毫无头绪。