Auto-Negotiation 能力宣告:FLP 如何交换能力

咱们接着聊。上一节讲了 Auto-Neg 的握手流程,其中最关键的一步就是「能力宣告」。说白了,就是两个设备互相亮底牌:我能跑多快、我能用什么双工模式、我支不支持流控。你亮完我亮,达成一致就开工。这个过程全靠一种叫 FLP 的脉冲包来完成。

FLP 是什么?

FLP 的全称是 Fast Link Pulse,快速链路脉冲。别被名字吓到,它就是一组特定频率和宽度的脉冲串。工作的时候,设备以 16 ms ± 8 ms 的间隔,不停地往外发这种脉冲串。没协商起来之前,端口就靠这个来「打招呼」。

我在一些老交换机上见过 FLP 波形,用示波器一看,每个爆发包里有 33 个脉冲位置,其中 17 个是固定的时钟脉冲,剩下 16 个是数据脉冲。数据脉冲的排列方式,直接决定了设备宣告的能力有哪些。

FLP Burst 的结构

每个 FLP Burst 持续约 2 ms,内部包含 33 个脉冲槽位。时钟脉冲每隔一个就出现,数据脉冲则落在两个时钟脉冲之间。简单记:时钟脉冲告诉对方「我在发数据了」,数据脉冲携带具体的能力信息。

脉冲编号 作用 说明
1, 3, 5, …, 33 时钟脉冲 固定 17 个,保证双方同步
2, 4, 6, …, 32 数据脉冲 16 个,按位编码能力

数据脉冲的每一位对应一个能力。比如 D0(第 2 个槽位)如果为 1,就表示设备支持 10BASE-T 半双工。你想想看,16 个 bit 就能把速度、双工、流控、对称/非对称全包进来了。这种设计很紧凑,我喜欢。

能力位定义(802.3 Clause 28)

标准里把这些位安排得明明白白。我手边常备一张速查表,各位也最好记一下。注意:位编号从 0 开始,对应数据脉冲 D0 ~ D15。

数据位 能力 备注
D010BASE-T 半双工最古老的能力
D110BASE-T 全双工
D2100BASE-TX 半双工
D3100BASE-TX 全双工
D4100BASE-T4几乎绝迹,别纠结
D5Pause 流控对称暂停帧
D6不对称流控一端发暂停,另一端不发
D7保留(以前是远程故障)现在用于 1000BASE-T 扩展
D8确认(Ack)收到对方 FLP 后设置
D9 ~ D15下一页能力用于千兆、多速率扩展

你可能注意到了,千兆和 2.5G/5G 的能力不在这些位里,它们靠「下一页」机制传递。不过咱们日常排障 10/100/1000M 的时候,大多数情况就看 D0~D3 就够了。

能力交换流程

  1. 上电或连接变化:链路一开始是断的,设备开启 FLP 发送(每隔 16 ms 一个 Burst)。
  2. 持续宣告:每个 Burst 里是自己的能力位图,比如 100M 全双工 + 10M 半双工。对方收到后,解析并记录。
  3. 检测并回传:一旦收到 3 个连续的、有效的 FLP Burst,设备设置自己的 Ack 位(D8=1),并继续发 FLP,告诉对方「我收到了」。同时,自身也要在接下来的 Burst 中宣告自己的能力。
  4. 完成协商:双方都确认收到对方的能力后,进入优先级裁决,确定最终速度和双工模式。裁决算法是「谁快谁高」,全双工优先级高于半双工。
实战小技巧:我排障时常用“灯闪法”。如果端口灯一插线就狂闪,大概率是在发 FLP 但没能进入协商。停下所有流量,只保留 FLP,用抓包工具(比如 Wireshark 的 Auto-Neg 解码器)看 FLP 是否被正确解码。如果根本抓不到 FLP 脉冲,那问题可能是线缆断路或对端完全关闭了 Auto-Neg。

流控宣告:Pause 和 Asymmetric

流控能力通过 D5 和 D6 来宣告。D5=1 表示支持对称暂停帧(两边都能收发暂停帧)。D6=1 表示支持不对称流控,即自己可以发送暂停帧但不强求对方也发。实际部署中,很多交换机默认开启流控,但接入 PC 可能关掉。我曾经在数据中心遇到一台服务器网卡因为流控不匹配导致丢包,排查半天才发现是服务器没宣告 D5,交换机却坚持要流控。解决办法:要么关掉交换机端的流控,要么给网卡驱动加上流控能力。

上一页(Next Page)机制

当需要传递超过 16 个 bit 的能力时(千兆、多速率、EEE 等),设备会使用 Next Page。Base Page 里的 D9~D15 用来指示后续还有更多页。每页同样 16 个数据位,可以反复传,直到双方发完最后标记。这个机制很灵活,但也容易出问题:比如某些老型号网卡不支持 Next Page,千兆协商就会失败。我记得有一回排障,发现两个千兆交换机只能协商到 100M,一查代码,一个交换机固件把 Next Page 的标记位搞反了。

核心要点:能力宣告就是二进制位图的交换。排障时重点看对方有没有正确设置所需能力位,以及 Ack 位是否置位。Ack 没起来,说明 FLP 丢了或者链路有问题。
曾经踩过的坑:我在调测一款嵌入式设备时,发现 Auto-Neg 始终失败。示波器抓 FLP 一切正常,但对方就是不解码。后来发现是因为我们自己实现的 FLP 发送时间间隔超过了 24 ms(规范要求 16±8 ms),接收端认为这是非法信号直接丢弃了。所以 —— 发送定时一定要准,否则连正常协商的门都进不去。

本章知识结构

下面这张图概括了 FLP 如何传递能力、双方如何进行位图交换并最终决定速度与双工模式(注意:这是全章唯一的 SVG 图,放心看)。

FLP 能力宣告流程 设备A(发起方) 设备B(接收方) FLP (能力位图 D0-D15) FLP (Ack=1 + 自身能力) FLP (Ack=1, 能力位) 优先级裁决:速度优先 → 全双工优先 链路建立,确定协商模式

常见能力宣告故障一览

现象 可能原因 诊断方向
只有一侧亮灯对端没开 Auto-Neg 或 FLP 被阻断检查对端配置,测线缆连续性
协商到 10M 半双工能力位丢失,或者干扰导致位翻转抓 FLP 看 D0~D3 位图是否符合预期
流量单向丢包流控能力不匹配(D5/D6 问题)对比两端流控宣告,强制关闭流控或统一
千兆协商不到Next Page 未正确发送或接收检查千兆扩展位(D9~D15),查看下一页面内容

掌握了 FLP 的位图结构和交换流程,你就能在排障时一眼看出核心问题。能力宣告就像两家公司的谈判,把自己的底牌亮出来,再复述对方的条件。一旦哪个位没对齐,链路就谈崩。嗯,这段话我说了好多遍,但确实管用。

一句总结:Auto-Neg 能力宣告就是通过 FLP Burst 的 16 个数据位交换主机能力,靠 Ack 确认,最后裁决出双方都支持的、优先级最高的速度和双工。