虚拟子层与物理硬件

前言

前面我们聊过,IEEE 802.3 标准应该怎么查,也简单捋过 Clause、MAC、PHY、PCS、PMA、PMD 这些概念。

但如果只是盯着这些名词看,其实很容易越看越乱。因为标准里写的是一堆"子层"和"接口",而我们脑子里想的却是另一套东西:芯片、走线、光模块、连接器、铜缆、光纤。

问题就出在这里。

标准里的子层,并不等于真实硬件里的物理模块。

它们更多是在描述一种系统架构:

这个复杂系统应该怎么拆?
每个功能块负责什么?
上下层之间靠什么接口协作?
不同厂商的芯片、模块、线缆,为什么能插在一起工作?

所以这篇文章,我不想单纯从"哪个子层干什么"开始讲,而是想先从设计哲学的角度,重新理解以太网里的虚拟子层和物理硬件之间到底是什么关系。

一句话概括就是:

Ethernet 分层不是为了把硬件强行切成一块一块,而是为了把复杂通信系统抽象成一组稳定的功能边界。
标准定义的是功能边界,不是硬件边界。

这个点想明白以后,再看 MAC、xMII、PCS、PMA、PMD、MDI,逻辑就会顺很多。

分层的本质:把复杂系统变得可控

我突然觉得,OSI/802.3 这套分层思想,和软件工程里的架构设计非常像。

软件工程面对的是代码模块、服务、接口、依赖关系;以太网标准面对的是 MAC、PCS、PMA、PMD、介质这些通信功能块。对象不同,但背后的工程思想几乎一样。

核心都是这几句话:

不要让一个模块知道太多;
不要让一个模块承担太多;
不要让一个模块的变化牵连整个系统;
用接口规范隔离复杂性。

软件工程里会说:

1
2
3
4
Controller 不应该关心数据库怎么存;
Service 不应该关心前端怎么展示;
API 调用方不应该关心服务内部怎么实现;
模块之间通过接口契约协作。

以太网里也是类似的:

1
2
3
4
5
MAC 不应该关心下面是铜缆还是光纤;
PCS 不应该关心激光器是 DML、EML、MZM 还是微环;
PMA 不应该关心上层帧格式;
PMD 不应该关心 MAC 地址和 FCS;
光模块只要满足 PMD/MDI 对应的接口指标,就可以接入系统。

所以,分层的真正价值不是"把系统画得更复杂",而是让复杂系统变得可控。

我觉得这里可以抓住三个关键词:

1
2
3
抽象
解耦
互操作

抽象,是把复杂硬件和信号过程抽象成几个稳定的功能层。比如 PCS 可以先被理解成"把 MAC 侧数据变成适合物理传输的码流"的层。至于它最终是在 ASIC 里、FPGA 里,还是在外部 PHY 芯片里实现,是后面的实现问题。

解耦,是让各层之间不要绑死。MAC 可以升级,PHY 可以换代,光模块可以从 100G 演进到 400G、800G,SerDes 可以从 NRZ 走向 PAM4,只要接口边界守住,上下层就不需要一起推倒重来。

互操作,则是标准化最直接的价值。不同厂商的交换芯片、PHY、光模块、线缆,只要遵守同一套接口和测试规范,就能连在一起工作。

这就很像软件里定义一个接口:

1
2
3
4
interface UserRepository {
findUserById(id)
saveUser(user)
}

调用方只关心 findUserById() 能不能返回用户,并不关心底层是 MySQL、PostgreSQL、MongoDB,还是 Redis。

以太网里也是一样:

1
2
3
4
5
MAC
↓ xMII / AUI
PHY
↓ MDI
Medium

MAC 只关心一件事:我把帧交给你,你能不能发出去;你收到帧以后,能不能交还给我。

至于下面到底是:

1
2
3
4
5
1000BASE-T 双绞线
10GBASE-KR 背板
100GBASE-DR 光纤
400GBASE-FR4 光模块
800GBASE-CR8 铜缆

对 MAC 来说,都应该是被抽象掉的实现细节。

这就是分层架构真正厉害的地方:底层技术可以不断变化,但系统边界保持稳定。

802.3 的 Clause,也是一种工程模块化

顺着这个逻辑再看 IEEE 802.3 的 Clause 结构,也会发现它不是随便堆规范,而是一个大型工程项目的模块化组织方式。

比如可以粗略理解成:

1
2
3
4
Clause 1~7:整体框架、MAC、管理、基础定义
Clause 22/45:PHY 管理接口
Clause 36/49/82/119/172...:不同速率下的 PCS/PMA/PMD
各类 Annex:测试方法、参数、预算、实现建议

这有点像一个大型软件项目:

1
2
3
4
5
6
core/
interfaces/
drivers/
adapters/
plugins/
tests/

核心框架长期保持稳定,不同速率、不同介质、不同接口,作为新的模块不断往里扩展。

这也是为什么 Ethernet 能从 10 Mb/s 一路演进到 100G、400G、800G,甚至 1.6T,而不是每一代都重新发明一套完全不同的网络系统。

它的核心不是某一个具体硬件,而是这一整套可扩展的架构。

虚拟子层不是硬件切割线

理解了架构思想以后,再来看虚拟子层和硬件的关系,就比较清楚了。

OSI/802.3 里的子层,不是为了描述硬件本身,而是为了描述通信系统中各个功能边界之间的关系。

它关心的是:

1
2
3
4
5
6
这一层输入什么?
输出什么?
向上一层提供什么服务?
向下一层依赖什么服务?
这一层需要满足什么行为?
不同厂商的实现怎么互通?

所以这些子层本质上是功能抽象,不是硬件切割线。

在图上看,Ethernet 好像是一层一层堆起来的:

1
2
3
4
5
6
7
8
MAC
RS
xMII / AUI
PCS
PMA
PMD
MDI
Medium

但真实硬件不一定这么切。

一种实现可能是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Switch ASIC / SoC
├── MAC
├── RS
├── PCS
├── FEC
└── SerDes / PMA

Optical module / Retimer / PHY chip
├── PMA
├── PMD
├── CDR
├── Driver
├── Laser / Modulator
├── PD
└── TIA

另一种实现也可能是:

1
2
3
4
5
6
7
8
CPU / FPGA / ASIC
├── MAC
└── PCS

External PHY
├── PCS
├── PMA
└── PMD

甚至在很多高速接口里,MAC、PCS、FEC、PMA 都可能在一个大 ASIC 里面,外面只接光模块、铜缆模块或者 retimer。

所以一个很关键的结论是:

一个虚拟子层可以由多个硬件模块共同实现;
一个硬件模块也可以同时实现多个虚拟子层。

这就是标准分层和真实硬件之间最容易混淆、但也最重要的区别。

标准关心的是功能边界,而硬件工程师关心的是怎样把这些功能边界落到真实电路、芯片、板卡和模块里。

分层模型给所有工程角色提供共同语言

有时候我们会误以为,这些抽象层级只是给架构师或者软件工程师看的,硬件工程师只管实现就行。

但其实不是。

这套分层模型更像是一套共同语言,所有参与系统协作的人都会用到它,只是每个人看的角度不同。

系统架构师关心的是:

1
2
3
4
5
MAC 到 PHY 怎么分工?
芯片和模块怎么切?
接口选 XGMII、CAUI、AUI 还是 SerDes?
FEC 放在哪里?
retimer / redriver 放在哪里?

数字 IC 工程师关心的是:

1
2
3
4
5
PCS 怎么做?
scrambler 怎么实现?
FEC 怎么编码和解码?
alignment marker 怎么插入?
lane deskew 怎么处理?

SerDes 和模拟工程师关心的是:

1
2
3
4
PMA 怎么实现?
CDR 怎么做?
PLL 怎么设计?
slicer、FFE、CTLE、DFE 放在哪里?

光模块工程师关心的是:

1
2
3
PMD 光接口指标是什么?
OMA、ER、TDECQ、RIN、光功率、接收灵敏度怎么满足?
激光器、调制器、PD、TIA 应该怎么配合?

SI 工程师关心的是:

1
2
3
4
AUI / PMD 电接口的走线损耗是多少?
测试点在哪里?
插损、回损、串扰、抖动预算怎么分?
通道模型应该怎么建?

测试工程师关心的是:

1
2
3
应该在哪个测试点测?
测的是 MAC 侧、PCS 侧、PMA 侧,还是 PMD/MDI 侧?
眼图、BER、TDECQ、插损、回损,对应哪个标准条款?

所以分层模型不是为了让某一个角色"发号施令",而是为了让所有人能围绕同一套边界讨论问题。

这有点像软件工程里的 Git 协作。每个人负责自己的功能模块,最后通过接口、测试和 review 合到同一个系统里。区别只是软件里的模块是代码,以太网里的模块可能是数字逻辑、模拟电路、SerDes、光器件、PCB 走线或者测试夹具。

从 MAC 到 Medium:以太网信号到底怎么走

最后把这套逻辑落到 Ethernet 的信号流程上。

从 OSI 模型看,Ethernet 主要覆盖两部分:

1
2
数据链路层:MAC
物理层:PHY

当然,在真实 IEEE 802.3 里还会有 LLC、RS、管理接口、各种速率对应的 PCS/PMA/PMD 等更细的内容。但为了抓住主线,可以先这么看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MAC

RS

xMII / AUI

PCS

PMA

PMD

MDI

Medium

MAC:负责帧怎么收发

MAC 是 Ethernet 在数据链路层里的核心。

它关心的是帧格式、源/目的 MAC 地址、FCS、流控、MAC Control、全双工/半双工行为等。简单说,MAC 负责的是"以太网帧怎么收、怎么发"。

但 MAC 不应该关心下面到底是铜缆、背板、光纤,还是芯片间互连。

这就是分层的第一层抽象。

RS 与 xMII:把 MAC 和 PHY 接起来

MAC 往下通常不是直接连 PCS,而是先经过 RS,也就是 Reconciliation Sublayer。

RS 可以理解为一个适配层:它把 MAC 看到的逻辑接口,映射到某种媒体独立接口上。

这时候就会出现 MII、GMII、XGMII、CGMII、XLGMII,以及高速系统里的 AUI、CAUI、LAUI 等各种接口名字。

这里最容易误解的是 xMII。xMII 的重点不是"某一种具体铜线",而是 media independent。也就是说,它的目的是让 MAC 和 PHY 之间形成一个与具体传输介质无关的接口。

如果 xMII 被做成一个可观察的芯片间接口,它当然可能表现为一组板级并行或串行电信号走线。但它不等于 CPU 直接发出来的 TTL 信号,也不等于最终传输介质。

更准确地说,它是 MAC/RS 与 PHY/PCS 之间的逻辑接口或芯片间接口。

PCS:把数据变成适合物理层处理的码流

进入 PHY 以后,首先会遇到 PCS,也就是 Physical Coding Sublayer。

PCS 的作用不是简单"传比特",而是把 MAC 侧来的数据转换成适合物理层传输和恢复的码流。

它可能包含:

1
2
3
4
5
6
7
编码 / 解码
扰码 / 解扰
块同步
lane 分发与重组
alignment marker 插入与检测
FEC 相关处理
本地 / 远端故障指示

在高速 Ethernet 里,我们经常会看到 64b/66b、256b/257b、扰码、AM 插入、FEC 等概念。这些很多都和 PCS 相关。

所以 PCS 不只是为了直流均衡。直流均衡当然是一个重要目的,但更大的目标是:

让数据流变成物理层可以传、可以同步、可以恢复、可以纠错的形式。

PMA:SerDes、时钟和串并转换

PCS 再往下是 PMA,也就是 Physical Medium Attachment。

PMA 处在 PCS 和 PMD 中间,主要负责电气、时钟和串并转换相关的适配。

它常见的功能包括:

1
2
3
4
5
6
并串 / 串并转换
CDR / PLL
lane multiplexing / demultiplexing
clock recovery
electrical interface adaptation
部分均衡或采样判决相关功能

如果用高速链路的语言来说,PMA 和 SerDes、CDR、PLL、lane mux/demux 这些东西关系很密切。

不过这里也要注意,标准里的 PMA 是功能边界,真实芯片里的 slicer、FFE、CTLE、DFE、CDR 到底算在哪个电路模块里,可能会随实现而变化,不一定能和标准子层完全一一对应。

PMD:和具体介质强相关的发送/接收规范

PMA 再往下是 PMD,也就是 Physical Medium Dependent。

PMD 这个名字很关键:medium dependent,说明它已经和具体传输介质强相关了。

PMD 不是"接口本身",而是一个子层。它定义的是面向具体介质的发送/接收特性,比如:

1
2
3
4
5
6
7
8
9
10
11
电压摆幅
输出模板
接收灵敏度
光功率
OMA
ER
TDECQ
插损 / 回损
抖动
测试点
通道要求

如果是铜缆、背板,PMD 更像是电气发送/接收和通道规范。

如果是光接口,PMD 就会涉及光发射机、光接收机、波长、光功率、消光比、灵敏度等指标。

所以对于光链路来说,激光器、调制器、driver、PD、TIA 这些实际硬件,都可以看作 optical PMD 实现中的一部分,或者说是为了满足 optical PMD 指标而设计出来的硬件结构。

MDI 与 Medium:真正接触介质的地方

PMD 再往外就是 MDI,也就是 Medium Dependent Interface。

MDI 可以理解成设备和真实介质之间的边界。

它可能对应:

1
2
3
4
5
RJ45 连接器
背板连接器
QSFP / OSFP 模块电接口
光纤连接器
twinax cable 接口

MDI 是边界,不一定是一个复杂功能模块。

MDI 外面才是真正的 Medium,也就是实际传输介质:铜缆、背板、双绞线、twinax、光纤等等。

到了这里,信号就真正离开设备,进入物理世界传播了。

接收端则沿着相反方向,把介质中的电信号或光信号恢复回来,经过 PMD、PMA、PCS,再交还给 MAC,最终变回 Ethernet 帧。

再看 MAU:它不是现代高速以太网的主线

这里顺便补一句 MAU。

早期 Ethernet 里,MAU,也就是 Medium Attachment Unit,是一个很重要的概念。比如 10BASE5、10BASE2 那个时代,MAU 更像是连接主机和传输介质的收发单元。

但到了现代高速 Ethernet,尤其是 10G、100G、400G、800G 这些体系里,主线术语更多是:

1
2
3
4
5
PCS
PMA
PMD
MDI
Medium

所以如果我们讨论现代高速以太网、背板、铜缆、光模块、CPO/LPO 这些东西,我觉得不要把 MAU 放在主线里更好。可以知道它是历史术语,但真正分析链路时,还是应该沿着 PCS/PMA/PMD/MDI 这条线走。

总结

最后可以把整篇文章收束成一句话:

Ethernet 的虚拟子层,是为了描述通信系统的功能边界,而不是为了描述硬件的物理边界。

MAC 关心帧怎么收发;RS/xMII 关心 MAC 和 PHY 怎么对接;PCS 关心数据怎么编码成可传输、可同步、可恢复的码流;PMA 关心串并转换、时钟恢复和电气适配;PMD 关心信号如何满足具体介质的发送/接收要求;MDI 则是真正连接介质的边界。

真实硬件可以把这些功能拆开,也可以合在一起。一个子层可以由多个硬件共同实现,一个芯片也可以同时实现多个子层。

这正是分层模型的价值:它不把系统绑死在某一种硬件形态上,而是用稳定的接口和功能边界,把复杂系统变成可以协作、可以替换、可以演进的工程架构。

所以我现在更愿意这样理解以太网分层:

它不是一张简单的协议层级图,而是一种大型硬件通信系统的架构设计方法。它把 Ethernet 做成了一个可插拔、可替换、可扩展、可长期演进的工程体系。