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时序一个典型的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 优先级解析:到底用哪个模式?
两边能力列表都传递完了,怎么决定最终模式呢?说白了就是一个优先级裁决表。我做过不少兼容性测试,发现很多奇怪的问题都出在这个优先级机制上。
自动协商优先级规则:
- 速率优先:1000M > 100M > 10M。能千兆绝不用百兆,即使千兆只能跑半双工。
- 双工模式次之:同一速率下,全双工优先于半双工。
- 冲突时回退:如果两端最佳能力不匹配,选取双方都支持且优先级最高的组合。
举个例子:
- 本地PHY支持:1000M全双工、100M全双工、100M半双工
- 对端PHY支持:100M全双工、100M半双工、10M全双工
- 结果:100M全双工。因为1000M只有单方支持,只能降到双方共有的最高级别——100M全双工。
下表整理了常见的优先级排列:
| 优先级(高→低) | 模式 | 备注 |
|---|---|---|
| 1 | 1000BASE-T 全双工 | 最高优先级 |
| 2 | 1000BASE-T 半双工 | 千兆半双工很少用 |
| 3 | 100BASE-TX 全双工 | 百兆上常见 |
| 4 | 100BASE-TX 半双工 | 冲突域问题多 |
| 5 | 100BASE-T4 | 四对线,已淘汰 |
| 6 | 10BASE-T 全双工 | 十兆全双工 |
| 7 | 10BASE-T 半双工 | 最低优先级 |
2.4 完整协商流程
你想想看,两端PHY怎么从零开始达成一致?大致分这几步:
- 发起:一端PHY开始发送FLP Burst。如果另一端也在发,双方进入同步状态。
- 交互:双方互相发送Base Page,连续至少3个相同的Burst后,Ack位置1。
- 解析:收到Ack后,各自提取对方的能力信息。
- 裁决:根据本地能力和远端能力,按优先级表选出最佳模式。
- 应用:配置MAC侧的速率和双工设置,建立正常链路。
- 保持:链路建立后,继续每16ms发送FLP Burst维持协商状态。如果连续收到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、能力寄存器和优先级这三样,你就能看懂链路协商过程中发生了什么。下次用示波器或者抓取工具分析时,心里就有底了。