详解以太网自协商中的FLP机制

以太网自协商能“猜”出对端的能力,靠的是一串看似随机的脉冲——FLP(快速链路脉冲)。这东西藏在物理层的最深处,平时没人注意它,可一旦链路起不来或者速率对不上,十有八九就是FLP在“闹脾气”。

FLP的结构与编码

FLP本质上是一组精心编排的电压脉冲序列,每16毫秒发送一次。每个FLP Burst包含17到33个脉冲位置,其中奇数位置固定为时钟脉冲,偶数位置才是真正携带信息的“数据位”。时钟脉冲让接收端能准确对齐时序,数据位则通过曼彻斯特编码或简单的脉冲有无来表示0或1。一个完整的FLP Burst可以承载16位数据,这16位就是自协商的核心——Base Page,里面封装了设备支持的速度(10M、100M、1000M)、双工模式(半双工、全双工)以及流控能力。

有意思的是,这些数据位并不是随便填的。802.3规范给每个能力分配了固定的比特位置:比如A0位代表10BASE-T半双工,A1位代表10BASE-T全双工,A2位代表100BASE-TX半双工,以此类推。设备发送FLP时,把自己支持的所有能力对应的位都置1,对端收到后就能知道对方“会什么”。

协商过程:从FLP到握手

自协商启动后,两端会连续发送FLP Burst。接收端收到3个连续的、内容一致的FLP后,会认为信息可信,然后从Base Page中提取对端的能力列表。接下来,本端会计算“双方都支持的最高优先级组合”——优先级顺序是:1000BASE-T全双工 > 1000BASE-T半双工 > 100BASE-TX全双工 > 100BASE-TX半双工 > 10BASE-T全双工 > 10BASE-T半双工。一旦确定,本端会在后续的FLP中设置Ack位(Base Page的第14位),告诉对端“我收到了,咱们就按这个来”。对端收到带Ack的FLP后,双方锁定模式,链路建立。

这个握手过程看似简单,但有个关键细节:Ack位必须在连续3个FLP中都出现,才算确认。如果中间丢了一个脉冲,计数器重置,双方就得重新协商。所以实际中,偶尔插拔网线后链路恢复慢,往往是因为FLP在传输过程中被干扰,导致Ack迟迟无法稳定。

FLP与NLP的兼容性

老式10BASE-T设备不会发FLP,只会发NLP(普通链路脉冲)——一种周期为16毫秒的单脉冲信号,用于检测链路是否连通。当自协商设备收到NLP而不是FLP时,它会自动降级为10BASE-T模式(半双工或全双工取决于对端能力)。这种兼容机制让新旧设备能混用,但代价是速度被锁死在10M。很多工程现场遇到的“百兆网卡只跑10M”,排查下来往往是对端是个不支持自协商的旧Hub,或者网线质量差到FLP被衰减成了NLP。

实际部署中的陷阱

FLP机制最容易被忽视的坑,是它和强制模式的互操作。强制模式(比如手动设置100M全双工)的端口根本不发FLP,只发空闲码流(IDLE)。自协商端收到IDLE后,会认为对方是10BASE-T设备(因为NLP都没收到),于是把自己降级到10M半双工。这就是为什么“一端强制、一端自协商”时,链路虽然能通,但速率和双工全错。更隐蔽的是,有些交换机在强制模式下依然会偶尔发送FLP,导致自协商端误判——比如先协商成100M全双工,过一会儿又掉到10M半双工,网络时断时续。

要避免这类问题,最直接的办法就是两端都开自协商,或者都强制成相同参数。但现实网络里设备五花八门,理解FLP的脉冲细节,至少能让你在抓包分析时,一眼看出是脉冲没对上,还是能力表不匹配。

THE END