虚拟子层与物理硬件
虚拟子层与物理硬件
前言
前面我们聊过,IEEE 802.3 标准应该怎么查,也简单捋过 Clause、MAC、PHY、PCS、PMA、PMD 这些概念。
但如果只是盯着这些名词看,其实很容易越看越乱。因为标准里写的是一堆"子层"和"接口",而我们脑子里想的却是另一套东西:芯片、走线、光模块、连接器、铜缆、光纤。
问题就出在这里。
标准里的子层,并不等于真实硬件里的物理模块。
它们更多是在描述一种系统架构:
这个复杂系统应该怎么拆?
每个功能块负责什么?
上下层之间靠什么接口协作?
不同厂商的芯片、模块、线缆,为什么能插在一起工作?
所以这篇文章,我不想单纯从"哪个子层干什么"开始讲,而是想先从设计哲学的角度,重新理解以太网里的虚拟子层和物理硬件之间到底是什么关系。
一句话概括就是:
Ethernet 分层不是为了把硬件强行切成一块一块,而是为了把复杂通信系统抽象成一组稳定的功能边界。
标准定义的是功能边界,不是硬件边界。
这个点想明白以后,再看 MAC、xMII、PCS、PMA、PMD、MDI,逻辑就会顺很多。
分层的本质:把复杂系统变得可控
我突然觉得,OSI/802.3 这套分层思想,和软件工程里的架构设计非常像。
软件工程面对的是代码模块、服务、接口、依赖关系;以太网标准面对的是 MAC、PCS、PMA、PMD、介质这些通信功能块。对象不同,但背后的工程思想几乎一样。
核心都是这几句话:
不要让一个模块知道太多;
不要让一个模块承担太多;
不要让一个模块的变化牵连整个系统;
用接口规范隔离复杂性。
软件工程里会说:
1 | Controller 不应该关心数据库怎么存; |
以太网里也是类似的:
1 | MAC 不应该关心下面是铜缆还是光纤; |
所以,分层的真正价值不是"把系统画得更复杂",而是让复杂系统变得可控。
我觉得这里可以抓住三个关键词:
1 | 抽象 |
抽象,是把复杂硬件和信号过程抽象成几个稳定的功能层。比如 PCS 可以先被理解成"把 MAC 侧数据变成适合物理传输的码流"的层。至于它最终是在 ASIC 里、FPGA 里,还是在外部 PHY 芯片里实现,是后面的实现问题。
解耦,是让各层之间不要绑死。MAC 可以升级,PHY 可以换代,光模块可以从 100G 演进到 400G、800G,SerDes 可以从 NRZ 走向 PAM4,只要接口边界守住,上下层就不需要一起推倒重来。
互操作,则是标准化最直接的价值。不同厂商的交换芯片、PHY、光模块、线缆,只要遵守同一套接口和测试规范,就能连在一起工作。
这就很像软件里定义一个接口:
1 | interface UserRepository { |
调用方只关心 findUserById() 能不能返回用户,并不关心底层是 MySQL、PostgreSQL、MongoDB,还是 Redis。
以太网里也是一样:
1 | MAC |
MAC 只关心一件事:我把帧交给你,你能不能发出去;你收到帧以后,能不能交还给我。
至于下面到底是:
1 | 1000BASE-T 双绞线 |
对 MAC 来说,都应该是被抽象掉的实现细节。
这就是分层架构真正厉害的地方:底层技术可以不断变化,但系统边界保持稳定。
802.3 的 Clause,也是一种工程模块化
顺着这个逻辑再看 IEEE 802.3 的 Clause 结构,也会发现它不是随便堆规范,而是一个大型工程项目的模块化组织方式。
比如可以粗略理解成:
1 | Clause 1~7:整体框架、MAC、管理、基础定义 |
这有点像一个大型软件项目:
1 | core/ |
核心框架长期保持稳定,不同速率、不同介质、不同接口,作为新的模块不断往里扩展。
这也是为什么 Ethernet 能从 10 Mb/s 一路演进到 100G、400G、800G,甚至 1.6T,而不是每一代都重新发明一套完全不同的网络系统。
它的核心不是某一个具体硬件,而是这一整套可扩展的架构。
虚拟子层不是硬件切割线
理解了架构思想以后,再来看虚拟子层和硬件的关系,就比较清楚了。
OSI/802.3 里的子层,不是为了描述硬件本身,而是为了描述通信系统中各个功能边界之间的关系。
它关心的是:
1 | 这一层输入什么? |
所以这些子层本质上是功能抽象,不是硬件切割线。
在图上看,Ethernet 好像是一层一层堆起来的:
1 | MAC |
但真实硬件不一定这么切。
一种实现可能是:
1 | Switch ASIC / SoC |
另一种实现也可能是:
1 | CPU / FPGA / ASIC |
甚至在很多高速接口里,MAC、PCS、FEC、PMA 都可能在一个大 ASIC 里面,外面只接光模块、铜缆模块或者 retimer。
所以一个很关键的结论是:
一个虚拟子层可以由多个硬件模块共同实现;
一个硬件模块也可以同时实现多个虚拟子层。
这就是标准分层和真实硬件之间最容易混淆、但也最重要的区别。
标准关心的是功能边界,而硬件工程师关心的是怎样把这些功能边界落到真实电路、芯片、板卡和模块里。
分层模型给所有工程角色提供共同语言
有时候我们会误以为,这些抽象层级只是给架构师或者软件工程师看的,硬件工程师只管实现就行。
但其实不是。
这套分层模型更像是一套共同语言,所有参与系统协作的人都会用到它,只是每个人看的角度不同。
系统架构师关心的是:
1 | MAC 到 PHY 怎么分工? |
数字 IC 工程师关心的是:
1 | PCS 怎么做? |
SerDes 和模拟工程师关心的是:
1 | PMA 怎么实现? |
光模块工程师关心的是:
1 | PMD 光接口指标是什么? |
SI 工程师关心的是:
1 | AUI / PMD 电接口的走线损耗是多少? |
测试工程师关心的是:
1 | 应该在哪个测试点测? |
所以分层模型不是为了让某一个角色"发号施令",而是为了让所有人能围绕同一套边界讨论问题。
这有点像软件工程里的 Git 协作。每个人负责自己的功能模块,最后通过接口、测试和 review 合到同一个系统里。区别只是软件里的模块是代码,以太网里的模块可能是数字逻辑、模拟电路、SerDes、光器件、PCB 走线或者测试夹具。
从 MAC 到 Medium:以太网信号到底怎么走
最后把这套逻辑落到 Ethernet 的信号流程上。
从 OSI 模型看,Ethernet 主要覆盖两部分:
1 | 数据链路层:MAC |
当然,在真实 IEEE 802.3 里还会有 LLC、RS、管理接口、各种速率对应的 PCS/PMA/PMD 等更细的内容。但为了抓住主线,可以先这么看:
1 | MAC |
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 | 编码 / 解码 |
在高速 Ethernet 里,我们经常会看到 64b/66b、256b/257b、扰码、AM 插入、FEC 等概念。这些很多都和 PCS 相关。
所以 PCS 不只是为了直流均衡。直流均衡当然是一个重要目的,但更大的目标是:
让数据流变成物理层可以传、可以同步、可以恢复、可以纠错的形式。
PMA:SerDes、时钟和串并转换
PCS 再往下是 PMA,也就是 Physical Medium Attachment。
PMA 处在 PCS 和 PMD 中间,主要负责电气、时钟和串并转换相关的适配。
它常见的功能包括:
1 | 并串 / 串并转换 |
如果用高速链路的语言来说,PMA 和 SerDes、CDR、PLL、lane mux/demux 这些东西关系很密切。
不过这里也要注意,标准里的 PMA 是功能边界,真实芯片里的 slicer、FFE、CTLE、DFE、CDR 到底算在哪个电路模块里,可能会随实现而变化,不一定能和标准子层完全一一对应。
PMD:和具体介质强相关的发送/接收规范
PMA 再往下是 PMD,也就是 Physical Medium Dependent。
PMD 这个名字很关键:medium dependent,说明它已经和具体传输介质强相关了。
PMD 不是"接口本身",而是一个子层。它定义的是面向具体介质的发送/接收特性,比如:
1 | 电压摆幅 |
如果是铜缆、背板,PMD 更像是电气发送/接收和通道规范。
如果是光接口,PMD 就会涉及光发射机、光接收机、波长、光功率、消光比、灵敏度等指标。
所以对于光链路来说,激光器、调制器、driver、PD、TIA 这些实际硬件,都可以看作 optical PMD 实现中的一部分,或者说是为了满足 optical PMD 指标而设计出来的硬件结构。
MDI 与 Medium:真正接触介质的地方
PMD 再往外就是 MDI,也就是 Medium Dependent Interface。
MDI 可以理解成设备和真实介质之间的边界。
它可能对应:
1 | RJ45 连接器 |
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 | PCS |
所以如果我们讨论现代高速以太网、背板、铜缆、光模块、CPO/LPO 这些东西,我觉得不要把 MAU 放在主线里更好。可以知道它是历史术语,但真正分析链路时,还是应该沿着 PCS/PMA/PMD/MDI 这条线走。
总结
最后可以把整篇文章收束成一句话:
Ethernet 的虚拟子层,是为了描述通信系统的功能边界,而不是为了描述硬件的物理边界。
MAC 关心帧怎么收发;RS/xMII 关心 MAC 和 PHY 怎么对接;PCS 关心数据怎么编码成可传输、可同步、可恢复的码流;PMA 关心串并转换、时钟恢复和电气适配;PMD 关心信号如何满足具体介质的发送/接收要求;MDI 则是真正连接介质的边界。
真实硬件可以把这些功能拆开,也可以合在一起。一个子层可以由多个硬件共同实现,一个芯片也可以同时实现多个子层。
这正是分层模型的价值:它不把系统绑死在某一种硬件形态上,而是用稳定的接口和功能边界,把复杂系统变成可以协作、可以替换、可以演进的工程架构。
所以我现在更愿意这样理解以太网分层:
它不是一张简单的协议层级图,而是一种大型硬件通信系统的架构设计方法。它把 Ethernet 做成了一个可插拔、可替换、可扩展、可长期演进的工程体系。





