1. 从一个让人抓狂的链路故障说起
机房里最让人头疼的问题,往往不是配置写错,而是链路时通时断、端口反复 up/down,日志里刷出一行Local Fault,然后就没有然后了。你查光模块、换跳线、重启设备,折腾半天,问题依旧。更麻烦的是,这类故障往往发生在物理层和链路层之间的灰色地带——PCS 层。很多工程师对 TCP 三次握手、VLAN 标签、路由协议倒背如流,但一提到 PCS(Physical Coding Sublayer,物理编码子层),脑子里就只剩一个模糊的概念。可真到了现场,恰恰是这个"模糊地带"决定了链路能不能起来。
这篇文章就围绕 PCS 层展开,把从Local Fault报错到链路最终建立的完整过程拆开来讲,同时结合 Wireshark 抓包分析,让你不仅知道现象,还能看懂背后的数据流。内容适合有一定网络基础、日常需要处理交换机/网卡链路问题的运维和测试工程师,也适合正在学习 IEEE 802.3 协议栈、想搞清楚物理层细节的读者。我会尽量用生活化的类比把抽象概念讲清楚,同时给出可以直接复现的抓包和排查步骤。
先说结论:Local Fault不是"坏了",而是 PCS 层在告诉你"我这边收不到可用的信号"。理解这句话,是排查所有 PCS 相关问题的起点。
2. PCS 层到底在干什么:位置、职责与核心机制
2.1 PCS 在协议栈中的位置
要理解 PCS,先得把它放回 IEEE 802.3 的架构里。以太网的物理层并不是铁板一块,它被细分成几个子层:
- PMD(Physical Medium Dependent,物理介质相关子层):直接跟光模块、铜缆打交道,负责电信号/光信号的收发。
- PMA(Physical Medium Attachment,物理介质连接子层):把 PMD 的串行信号做并串转换。
- PCS(Physical Coding Sublayer,物理编码子层):负责编码、解码、对齐、同步,是本文的主角。
- MAC(Media Access Control):再往上就是大家熟悉的 MAC 层了。
打个比方,PMD 像是快递员,负责把包裹(信号)送到你家门口;PMA 是分拣中心,把大件拆成小件;而 PCS 是翻译官,它把 MAC 层发来的数据"翻译"成适合在物理介质上传输的编码格式,反过来也把收到的编码"翻译"回数据。翻译官如果发现对方说的话根本听不懂(信号质量差、无法同步),就会喊一声"Local Fault"。
2.2 PCS 的核心职责
PCS 层主要干四件事:
- 编码与解码:把 MAC 层的数据按照特定规则编码。比如千兆以太网用 8B/10B 编码,万兆以太网用 64B/66B 编码。编码的目的是保证直流平衡、便于时钟恢复、提供足够的跳变。
- 同步与对齐:从收到的比特流里找到"帧边界",也就是确定哪里是一个编码块的开始。这一步靠的是特定的对齐标记(Alignment Marker)。
- 状态机管理:PCS 内部有一套状态机,负责链路建立、故障检测、故障恢复。
Local Fault和Remote Fault就是这套状态机输出的信号。 - 故障信令:当本地接收方向出问题,PCS 会向对端发送
Local Fault;当收到对端发来的故障信号,则识别为Remote Fault。
2.3 为什么编码方式这么重要
很多人会问:为什么不直接把 0 和 1 发出去,非要搞什么 8B/10B、64B/66B?这里涉及几个硬性需求:
- 直流平衡:长时间发同一电平会导致接收端基线漂移,交流耦合电容会"失忆"。编码保证 0 和 1 的数量大致均衡。
- 时钟恢复:接收端要从数据流里提取时钟,如果数据长时间不变,时钟就丢了。编码保证有足够的电平跳变。
- 错误检测:编码本身带有一定的冗余,可以检测部分传输错误。
8B/10B 把 8 位数据映射成 10 位,开销 25%;64B/66B 把 64 位数据加 2 位同步头变成 66 位,开销只有约 3%。这就是为什么高速以太网都转向 64B/66B——开销小,效率高。理解这一点,你就能明白为什么不同速率的链路,PCS 行为会有差异。
3. Local Fault 与 Remote Fault:故障信令的来龙去脉
3.1 Local Fault 是怎么产生的
Local Fault的本质是:本地 PCS 接收方向无法建立或维持同步。具体触发条件包括:
- 接收端长时间检测不到有效的对齐标记;
- 编码块同步丢失,误码率超过阈值;
- 光模块收不到光、收光功率过低;
- 对端根本没在发有效信号。
一旦触发,本地 PCS 状态机进入故障态,并做两件事:一是停止向 MAC 层上报有效数据,二是在对端的发送方向上插入Local Fault有序集(Ordered Set),告诉对方"我这边收不到你的信号了"。
这里有个容易混淆的点:Local Fault是"我发给你的",表示"我本地有问题";而你在日志里看到的Local Fault,往往是对端发过来的,意思是"对端本地收不到信号"。搞清楚方向,排查才不会南辕北辙。
3.2 Remote Fault 的识别
当本地 PCS 收到对端发来的Local Fault有序集时,会将其识别为Remote Fault,并上报给上层。此时本地会停止发送正常数据,转而发送Idle有序集,等待对端恢复。
所以一个典型的故障链条是这样的:
- A 端收光异常,A 的 PCS 进入 Local Fault;
- A 向 B 发送 Local Fault 有序集;
- B 收到后识别为 Remote Fault,B 停止发数据,改发 Idle;
- 双方链路 down,日志里 A 显示 Local Fault,B 显示 Remote Fault。
3.3 故障信令的有序集结构
在万兆以太网(10GBASE-R)中,Local Fault和Remote Fault都是通过特定的 64B/66B 控制块来传递的。控制块用同步头10标识,块类型字段区分是 Idle、Local Fault 还是 Remote Fault。这些控制块周期性地插入数据流中,接收端解析后就能知道对端状态。
注意:不同速率、不同标准的故障信令格式不完全一样。比如 1000BASE-X 用的是 8B/10B 的配置有序集(C1/C2),而 10GBASE-R 用的是 64B/66B 控制块。排查时一定要先确认链路速率和标准。
4. 链路建立的完整过程:从 Idle 到数据流通
4.1 链路建立的三个阶段
PCS 链路建立大致分三个阶段:
- 同步建立阶段:接收端通过搜索对齐标记,锁定块边界,实现块同步。
- 对齐与去偏斜阶段:多通道链路(如 4 通道的 40G/100G)需要把各通道的数据对齐,消除通道间偏斜。
- 状态交换与确认阶段:双方通过交换 Idle 有序集,确认彼此都同步成功,然后进入正常数据转发。
4.2 块同步是怎么实现的
以 10GBASE-R 为例,接收端不断扫描比特流,寻找 64B/66B 的同步头01或10。连续检测到一定数量的有效同步头后,认为块同步建立。这个过程有点像你在嘈杂的房间里听人说话,先要找到对方说话的节奏,才能听懂内容。
同步建立后,接收端开始解析控制块,识别对齐标记。对齐标记是每个通道周期性发送的特殊块,用于多通道对齐。单通道链路相对简单,多通道链路才是真正的挑战。
4.3 多通道对齐与去偏斜
40G/100G 链路通常由多个通道(Lane)组成,比如 100GBASE-R4 是 4 个 25G 通道。由于各通道的物理路径长度、器件延迟不同,到达接收端时会有时间差,也就是偏斜(Skew)。PCS 需要:
- 在每个通道上分别建立块同步;
- 检测各通道的对齐标记;
- 根据对齐标记的位置,把各通道数据重新对齐;
- 消除偏斜后,把数据合并成完整的数据流。
这一步如果失败,链路就起不来,或者起来后误码率极高。实际排查中,多通道链路的偏斜问题往往比单通道更隐蔽。
4.4 状态交换与链路 up
双方同步成功后,会持续交换 Idle 有序集。Idle 有序集里携带了状态信息,比如是否检测到故障、是否需要重新同步。当双方都确认对方状态正常,PCS 上报链路 up,MAC 层开始正常收发数据。
整个过程听起来简单,但每一步都有严格的时序和计数要求。比如块同步需要连续检测到多少个有效同步头才算成功,故障恢复需要等待多少个 Idle 周期,这些都在标准里有明确规定。理解这些计数,对排查"链路反复 up/down"特别有用。
5. Wireshark 抓包分析:怎么看到 PCS 层的行为
5.1 Wireshark 能抓到 PCS 层吗
这是很多人关心的问题。严格来说,普通网卡抓不到 PCS 层的原始编码块,因为网卡在把数据交给操作系统之前,已经完成了 PCS 解码,你看到的只是解码后的以太网帧。所以 Wireshark 里看不到 8B/10B 或 64B/66B 的原始块。
但是,Wireshark 依然能帮你分析 PCS 相关问题的间接证据:
- 链路 up/down 的时间点,对应抓包里的流量中断;
- 故障前后的 ARP、LLDP、STP 等协议报文变化;
- 误码导致的帧校验错误(FCS Error);
- 链路恢复后重传的 TCP 报文。
如果你需要看真正的 PCS 层数据,得用支持物理层抓包的专用设备,比如带光分路器的协议分析仪,或者某些交换芯片提供的调试接口。这部分成本较高,日常排查用 Wireshark 的间接证据已经够用。
5.2 Wireshark 安装与基础配置
先把工具准备好。Wireshark 官网下载对应平台的安装包,Windows 上安装时会提示安装 Npcap 驱动,这是抓包的核心组件,必须装。安装过程中有个选项"Install Npcap in WinPcap API-compatible Mode",建议勾上,兼容性更好。
安装完成后,打开 Wireshark,你会看到网卡列表。选择要抓包的网卡,双击开始抓包。如果列表里没有你要的网卡,检查 Npcap 是否安装成功,或者用管理员权限运行。
注意:网上有反馈说 Npcap 驱动在某些拨号上网场景下会触发系统异常。如果遇到,可以尝试更新到最新版 Npcap,或者在不需要抓包时暂时禁用该驱动。这是环境兼容性问题,跟 Wireshark 本身无关。
5.3 抓包前的关键设置
抓 PCS 相关问题,建议做以下设置:
- 抓包缓冲区调大:Edit → Preferences → Capture,把缓冲区设为 100MB 以上,避免丢包。
- 开启混杂模式:捕获选项里勾选"Promiscuous",确保能抓到所有经过网卡的帧。
- 设置抓包过滤器:如果只想看特定流量,可以在捕获过滤器里写
ether proto 0x88cc(LLDP)或arp,减少无关数据。 - 多网卡同时抓:如果怀疑是链路问题,可以在两端同时抓,对比时间戳。
5.4 用显示过滤器定位链路事件
抓完包,用显示过滤器快速定位关键事件。常用的过滤器:
| 目的 | 显示过滤器 | 说明 |
|---|---|---|
| 看 ARP 交互 | arp | 链路恢复后通常先有 ARP |
| 看 LLDP 邻居 | lldp | 链路 up 后 LLDP 会重新通告 |
| 看 TCP 重传 | tcp.analysis.retransmission | 误码导致的重传 |
| 看 FCS 错误 | eth.fcs_bad == 1 | 需要网卡支持上报 |
| 看 STP 拓扑变化 | stp | 链路抖动引发 STP 收敛 |
比如你怀疑链路抖动,可以先用arp过滤,看 ARP 请求/应答的时间间隔。如果发现 ARP 反复出现、间隔不规律,说明链路在反复 up/down。
5.5 一个真实的抓包分析案例
假设某台服务器网卡日志里反复出现Local Fault,我用 Wireshark 在服务器和交换机两端同时抓包,观察到以下现象:
- 服务器侧抓包显示,流量每隔约 30 秒中断一次,中断持续 2-3 秒;
- 中断期间没有任何帧,恢复后首先出现的是交换机的 LLDP 报文;
- 交换机侧抓包显示,中断期间交换机持续发送 LLDP,但收不到服务器的任何帧;
- 服务器日志里
Local Fault的时间点,正好对应流量中断的起点。
结合这些证据,可以判断是服务器侧接收方向出了问题,导致 PCS 进入 Local Fault,进而停止发送。进一步检查发现是光模块收光功率处于临界值,温度升高后收光进一步下降,触发同步丢失。更换光模块后问题消失。
这个案例说明,Wireshark 虽然看不到 PCS 原始块,但通过流量中断的时间模式、恢复后的协议行为,完全可以定位到 PCS 层的问题。
6. 常见问题与排查技巧实录
6.1 Local Fault 反复出现怎么查
这是最典型的场景。排查思路按以下顺序:
- 确认故障方向:看日志里是 Local Fault 还是 Remote Fault。Local Fault 说明本端收有问题,Remote Fault 说明对端收有问题。
- 检查物理层:光模块收光功率、发光功率、温度;铜缆的话检查线序、长度、干扰。
- 检查对端:对端是否在正常发送?对端有没有报错?
- 检查速率匹配:两端速率、双工是否一致?速率不匹配会导致 PCS 无法同步。
- 检查编码方式:某些场景下两端编码方式不一致(比如一端强制 8B/10B,一端自适应),也会导致同步失败。
6.2 链路能 up 但误码率高
链路起来了,但丢包严重、FCS 错误多。这种问题往往出在:
- 光功率过强导致接收端饱和;
- 多通道链路偏斜超标;
- 时钟抖动过大;
- 电磁干扰。
排查时先用光功率计测收发光,再看交换芯片的误码统计。多通道链路要特别关注各通道的偏斜值。
6.3 Wireshark 抓不到包怎么办
常见原因和解决:
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 网卡列表为空 | Npcap 未装或损坏 | 重装 Npcap |
| 抓不到任何包 | 选错网卡 | 确认网卡名称 |
| 只能抓本机流量 | 未开混杂模式 | 勾选 Promiscuous |
| 抓包卡顿 | 缓冲区太小 | 调大缓冲区 |
| 抓不到 VLAN 标签 | 网卡剥离了 VLAN | 关闭网卡的 VLAN 剥离功能 |
提示:有些网卡驱动默认会剥离 VLAN 标签,导致 Wireshark 里看不到 VLAN。需要在网卡高级设置里关闭"VLAN Offload"相关选项。
6.4 独家避坑经验
- 别只看日志:日志里的 Local Fault 只是结果,要结合抓包、光功率、误码统计一起看。
- 两端同时抓:单端抓包容易误判,两端对比才能确定故障方向。
- 注意时间同步:两端设备时间不同步,抓包时间戳对不上,分析会很痛苦。建议先做 NTP 同步。
- 保存原始抓包:分析时用显示过滤器,不要用捕获过滤器把数据过滤掉,否则可能漏掉关键证据。
- 记录环境变化:温度、湿度、供电变化都可能影响链路,排查时把这些因素记下来。
7. 从 PCS 视角重新理解链路稳定性
搞懂 PCS 之后,你会对"链路稳定"有全新的认识。链路 up 不代表稳定,PCS 层的同步维持、故障恢复机制才是关键。很多看似玄学的链路抖动,本质上是 PCS 状态机在反复切换。
我在实际项目里踩过几次坑之后,总结出一个习惯:遇到链路问题,先看 PCS 状态,再看 MAC 统计,最后才看上层协议。这个顺序能帮你快速缩小范围。另外,多通道高速链路一定要关注偏斜和对齐,这是单通道时代不会遇到的问题。
最后分享一个小技巧:如果你手头有支持 PCS 调试的交换芯片,可以通过芯片寄存器读取 PCS 状态机的当前状态和计数器。这些计数器能告诉你同步丢失了多少次、故障恢复花了多久,比日志精确得多。没有这个条件的话,Wireshark 加光功率计的组合,也能解决大部分问题。