2、自动协商协议原理:FLP Burst、能力寄存器、优先级解析

自动协商这玩意儿,说白了就是让两端的PHY在建立物理链路之前,先“聊一聊”。聊什么呢?聊各自的本事——你支持多少兆?是全双工还是半双工?然后两边协商出一个双方都能接受的最高性能模式。我在现场调试过不少掉链子的网络,八成问题都出在自动协商上。所以,你得先懂它的底层原理,不然连故障都看不懂。

2.1 FLP Burst:链路脉冲的“摩尔斯电码”

自动协商的消息载体叫FLP Burst,全称Fast Link Pulse Burst。嗯,这个名字很直白——快速链路脉冲串。

正常没有数据传输时,百兆以太网会发普通的NLP(Normal Link Pulse)来维持链路。但自动协商激活后,PHY每隔16ms就会发送一串FLP Burst。每个Burst由几十个脉冲组成,这些脉冲之间的间隔编码了信息。

脉冲分两种:

  • 时钟脉冲(Clock Pulse):位置固定,用于同步。每隔125μs发一个,共17个。
  • 数据脉冲(Data Pulse):位置可变,夹在时钟脉冲之间。共16个窗口,有脉冲代表“1”,无脉冲代表“0”。

你看,这就是16位数据。一次FLP Burst正好传输一个16位的Base Page。

我的经验: 用示波器抓FLP Burst时,记得选择AC耦合,触发电平设在中值附近。我第一次测时触发电平太高,死活看不到数据脉冲,后来才发现是自己粗心。

FLP Burst时序一个典型的Burst包含这些元素:

时间轴(单位μs):
0    125   250   375   500   625   ...   2000
| C1 | P1 | C2 | P2 | C3 | P3 | ... | C17 | P16 | IDLE(~16ms)
C = 时钟脉冲(固定位置)
P = 数据脉冲(位置可变,代表1或0)
IDLE = 静默期,等待下一次Burst

为什么这么设计?我理解是为了可靠。时钟脉冲提供时间基准,数据脉冲利用位置编码,对噪声的容忍度比幅值编码高得多。

2.2 能力寄存器:你到底能干什么?

每个支持自动协商的PHY内部都有一套能力寄存器。对方发来的FLP Burst中提取的16位Base Page,会跟本地寄存器内容进行比较。

Base Page的结构:

位域 位数 含义
S0-S4 (Selector Field) 5 协议选择。00001表示IEEE 802.3以太网,其他值基本不用管。
A0-A7 (Technology Ability) 8 技术能力位。每一位代表一种模式,如10Base-T、100Base-TX、全双工等。
RF (Remote Fault) 1 远端故障指示。对方PHY有问题时会置1。
Ack (Acknowledge) 1 确认位。收到3个相同的一致性FLP Burst后置1,表示已同步。
NP (Next Page) 1 有下一页。千兆协商需要用到扩展能力。

我重点说说Technology Ability这8位。我做调试时经常直接读寄存器的值来推算期望速率。比如1000Base-T的Base Page只有6位能力位,剩余能力通过Next Page往下传。

常见能力位映射(百兆PHY为例):

  • Bit 0: 10Base-T 半双工
  • Bit 1: 10Base-T 全双工
  • Bit 2: 100Base-TX 半双工
  • Bit 3: 100Base-TX 全双工
  • Bit 4: 100Base-T4(已很少用)
  • Bit 5: Pause帧支持
  • Bit 6: 非对称Pause
  • Bit 7: 保留

2.3 优先级解析:到底用哪个模式?

两边能力列表都传递完了,怎么决定最终模式呢?说白了就是一个优先级裁决表。我做过不少兼容性测试,发现很多奇怪的问题都出在这个优先级机制上。

自动协商优先级规则:

  1. 速率优先:1000M > 100M > 10M。能千兆绝不用百兆,即使千兆只能跑半双工。
  2. 双工模式次之:同一速率下,全双工优先于半双工。
  3. 冲突时回退:如果两端最佳能力不匹配,选取双方都支持且优先级最高的组合。

举个例子:

  • 本地PHY支持:1000M全双工、100M全双工、100M半双工
  • 对端PHY支持:100M全双工、100M半双工、10M全双工
  • 结果:100M全双工。因为1000M只有单方支持,只能降到双方共有的最高级别——100M全双工。
避坑指南: 我曾经遇到一个交换机,厂商把1000M全双工的能力位写成了保留位。结果一端拼命发千兆能力,另一端收不到。最终链路协商成100M,用户还以为是线缆问题。后来我强制读寄存器才发现能力位映射有错。所以,遇到奇怪的问题,先查Phy的寄存器手册,看看厂商有没有“魔改”标准位映射。

下表整理了常见的优先级排列:

优先级(高→低) 模式 备注
11000BASE-T 全双工最高优先级
21000BASE-T 半双工千兆半双工很少用
3100BASE-TX 全双工百兆上常见
4100BASE-TX 半双工冲突域问题多
5100BASE-T4四对线,已淘汰
610BASE-T 全双工十兆全双工
710BASE-T 半双工最低优先级

2.4 完整协商流程

你想想看,两端PHY怎么从零开始达成一致?大致分这几步:

  1. 发起:一端PHY开始发送FLP Burst。如果另一端也在发,双方进入同步状态。
  2. 交互:双方互相发送Base Page,连续至少3个相同的Burst后,Ack位置1。
  3. 解析:收到Ack后,各自提取对方的能力信息。
  4. 裁决:根据本地能力和远端能力,按优先级表选出最佳模式。
  5. 应用:配置MAC侧的速率和双工设置,建立正常链路。
  6. 保持:链路建立后,继续每16ms发送FLP Burst维持协商状态。如果连续收到3个错误Burst,触发重启。
一个小细节: 千兆自动协商需要额外的Next Page来传递1000BASE-T的能力信息,所以Base Page中的NP位会置1,双方再交换一个或两个Next Page。调试此时需要多抓几步,不能只看第一步。
FLP Burst 与 Base Page 结构图 时间 Burst 1 (Base Page) Burst 2 (Base Page) Burst 3 (Ack=1) 每个 Burst 间隔约 16ms,传输 16 位有效数据 Base Page (16 bits) S0-S4 Selector(5位) A0-A7 Technology Ability(8位) RF (1位) Ack (1位) NP (1位) 注意:千兆协商需要 NP=1,通过 Next Page 扩展能力信息 Ack 表示已经连续收到 3 个一致性 Burst,进入同步状态

2.5 几个关键点要记住

  • FLP Burst不可关闭:有些交换机可以关掉自动协商,但此时PHY会退化为强制模式,只发NLP不发FLP。这时候单端打开自动协商,两端反而协商不起来。我遇到很多工程问题就是这样——一边自动,一边强制,两边连不上。
  • 能力寄存器可读:大部分PHY提供MII管理接口(MDIO),可以读取PHY ID和AN能力寄存器。调试时我习惯先读0x4、0x5寄存器看看Auto-Neg能力位是否被正确设置。
  • 优先级有例外:少数特殊PHY厂商会调整优先级顺序,建议以芯片手册为准。有一次我在一款车载PHY上遇到1G半双工优先级高于100M全双工的情况,差点被坑。

自动协商不复杂,但很关键。搞懂FLP Burst、能力寄存器和优先级这三样,你就能看懂链路协商过程中发生了什么。下次用示波器或者抓取工具分析时,心里就有底了。