以太网 (Ethernet) MAC/PCS/PMA/PMD 底层完整深度笔记

本文基于 IEEE 802.3 标准,整理 MAC 层、PHY 全子层、接口(RGMII/XGMII)、SerDes、CDR、编码、VLAN、抓包原理、硬件状态机、电口光口差异、Linux DTS & 驱动相关全部对话知识点,适合嵌入式网络驱动、网卡底层调试备查。

目录

目录

以太网 (Ethernet) MAC/PCS/PMA/PMD 底层完整深度笔记

目录

1 MAC 子层详解

1.1 标准以太网帧结构

1.2 VLAN 标签原理、硬件剥离 / 添加、抓包看不到 tag 根因

1.3 FCS CRC32 校验归属

1.4 最小以太网帧大小

1.5 前导码 Preamble + SFD 帧起始定界符

1.6 MAC 接收状态机完整逻辑,规避载荷 0x55+0xD5 误判

2 IEEE802.3 PHY 三层模型 PCS / PMA / PMD

3 MAC 与 PHY 之间并行接口:RGMII、XGMII

3.1 RGMII(1G)

3.2 XGMII(10G 并行接口)

3.3 XGMII K 控制字符、有序集 /S//T//I/

3.4 为什么 PCS 不能复用 MAC 前导码做帧定界

3.5 IDLE 有序集说明

4 SerDes 详细解析

4.1 SerDes 是什么,属于哪一层

4.2 片内 SerDes 职责,不做什么

4.3 RJ45 网线上有没有 SerDes 信号

5 CDR 时钟数据恢复完整原理

5.1 为什么跨设备通信必须 CDR

5.2 哪些场景需要 CDR,哪些不需要

5.3 BASE‑T 铜缆 PHY 是否带 CDR

5.4 CDR 靠什么锁定频率,没有前导码如何锁定

6 PCS 编码详解 4B/5B + NRZI + 64B/66B

6.1 4B/5B 编码

6.2 NRZI 编码原理,为什么需要 4B/5B

6.3 4B/5B 最大连续 0 限制

6.4 64B/66B 编码(10GBASE‑R)

6.5 64B/66B 与前导码分工(非常重要)

7 RJ45 双绞线电口体系

7.1 差分信号

7.2 1000BASE‑T PAM5 五电平信号

7.3 Cat8 线缆规格

7.4 RJ45 理论最大速率

7.5 10GBASE‑T vs 10GBASE‑R 是否可以混用

8 光口、光纤、光模块基础

8.1 光纤传输的信号,有没有电压电流

9 SerDes、CDR、DSP 三者区分

10 Linux 以太网驱动 & Device‑Tree (DTS) 配置

11 完整数据流串联(发送方向,10G 光口例子)

12 完整数据流串联(接收方向,10G 光口例子)

13 高频易错坑点汇总


1 MAC 子层详解

MAC:介质访问控制子层,属于数据链路层(L2),IEEE802.3 定义。MAC 负责帧组装、FCS 计算、帧接收过滤、前导码生成剥离、MAC 状态机。

1.1 标准以太网帧结构

物理线路上完整发送序列: [前导码 7 字节][SFD 1 字节][MAC 帧头 14 字节][Payload][PAD 填充][FCS 4 字节]

MAC 帧头(交给上层的帧,不含前导 SFD) DMAC 目的 MAC,6 字节,目标硬件地址 SMAC 源 MAC,6 字节,发送方硬件地址 TPID (VLAN 可选),4 字节,VLAN 标签,存在即插入此处 EtherType,2 字节,上层协议类型 IPv4/ARP 等 Payload 载荷,46~1500 字节,业务数据 PAD 填充,0~46 字节,不足 46 字节自动填充 0 FCS,4 字节,CRC32 校验

1.2 VLAN 标签原理、硬件剥离 / 添加、抓包看不到 tag 根因

VLAN 标签共 4 字节,属于 MAC 头部扩展,不属于 Payload 业务数据。 位置:源 MAC 之后,EtherType 之前。 TPID 固定 0x8100,TCI 包含优先级、CFI、VLAN ID。

TX 方向:VLAN tag add(硬件卸载) 网卡 MAC 硬件支持 VLAN HW offload:CPU 构造不带 VLAN 标签报文,传给 MAC;MAC 硬件自动在帧头插入 4 字节 VLAN 标签,再发出到 PHY。CPU 不需要手动拼接 tag。

RX 方向:VLAN 剥离 PHY/MAC 硬件收到带 VLAN 的帧,硬件识别 TPID,把 VLAN tag 提取出来,存到描述符,从报文流中剥离 tag,再把不带 tag 的 skb 上报内核协议栈。

Wireshark 抓包看不到 VLAN 标签三大原因

  1. 网卡硬件 VLAN 卸载开启(最常见):硬件剥离 tag,内核 socket/libpcap 拿到的报文已经去掉 VLAN;wireshark 看不到原始帧。
  2. 交换机端口配置为 Access 口:交换机收到带 tag 帧,剥离 tag 之后发给主机。
  3. 只有交换机 Trunk 口 + 关闭网卡 VLAN 硬件卸载,才能抓到完整带 VLAN 原始帧。

Wireshark 底层 libpcap socket 位置:工作在 MAC 层之上,拿到的是经过网卡硬件处理后的报文,不是线路原始比特流。硬件做了卸载,上层抓包就看不到原始比特。

1.3 FCS CRC32 校验归属

FCS (CRC32) 属于 MAC 层,不属于 PHY 层 发送:MAC 硬件计算整帧(DMAC~Payload/PAD)CRC32,追加 FCS4 字节。 接收:MAC 硬件做 CRC 校验;校验失败直接丢弃该帧。 PHY/PCS/PMA 只处理比特流、码块,不做以太网帧 CRC 校验。PHY 只管比特是否合法,不管帧内容对错。

1.4 最小以太网帧大小

  1. MAC 层帧(DMAC ~ FCS)最小:64 字节 头 14 + payload 最小 46 + FCS4 = 64 字节。 payload 不足 46 字节,MAC 自动 PAD 填充 0。
  2. 物理线路完整报文(包含前导码 + SFD)最小: 7+1+64 =72 字节

历史来源:半双工 CSMA/CD 冲突检测,保证信号往返线缆时间,能够识别冲突。现在全双工不再冲突,但标准保留最小帧限制。

1.5 前导码 Preamble + SFD 帧起始定界符

Preamble 前导码:7 字节 0x55,二进制交替 10101010,提供比特跳变沿。 SFD 帧起始定界符:1 字节 0xD5,二进制 11010101,标志以太网 MAC 帧正式开始。

功能分为两部分:

  1. PHY 侧:早期低速电口,前导码提供足够比特跳变,辅助 CDR 锁定发送方比特速率。
  2. MAC 侧:标记以太网帧边界,告诉 MAC:后面就是 MAC 帧。

重要:每一个以太网帧都必须携带完整前导码 + SFD,不是仅仅 IDLE 转发送的时候发一次;帧与帧之间即使连续发送,每一帧头部都重新生成前导 + SFD。

风险:业务 Payload 载荷内部,随机完全有可能出现一串 0x55...0xD5 字节序列,如果没有状态机保护,会被误判为新帧起始。

1.6 MAC 接收状态机完整逻辑,规避载荷 0x55+0xD5 误判

MAC 接收有两套独立硬件电路:

  1. 前导 / SFD 检测电路:负责识别帧什么时候来。
  2. 前导 / SFD 剥离电路:识别 SFD 之后,吃掉 7+1 字节,把真正 MAC 帧送给上层。

两个核心状态:

  1. IDLE 空闲状态 当前没有接收帧;开启前导码 + SFD 检测;等待 SFD 到来。
  2. 接收帧状态 一旦检测 SFD,立刻切换进入接收帧状态;关闭前导 SFD 检测逻辑。 此时就算 Payload 里面出现一模一样 0x55 0xD5 序列,检测电路已经关闭,不会误判新帧。 持续接收字节流,直到帧结束,检测帧结束条件,回到 IDLE 状态;回到 IDLE 才重新打开 SFD 检测。

关键点:检测和剥离是两套硬件。进入接收帧状态只是关闭检测,剥离电路已经完成工作。 只有回到 IDLE,才重新开启 SFD 检测,天然规避载荷内部相同序列带来歧义。

2 IEEE802.3 PHY 三层模型 PCS / PMA / PMD

MAC 输出并行数据给到 PHY,PHY 内部再拆三层:

  1. PCS 物理编码子层 Physical Coding Sublayer 块编码:4B/5B、8B/10B、64B/66B。 有序集、K 控制字符、IDLE 码块、帧起始 / 帧结束标记。 码块同步、速率补偿。
  2. PMA 物理介质附属子层 Physical Medium Attachment 并行 ↔ 串行转换(SerDes) CDR 时钟数据恢复电路。
  3. PMD 物理介质相关子层 Physical Medium Dependent 模拟驱动电路、差分输出。 RJ45 驱动、光模块激光驱动。 处理线缆介质信号。

层级记忆:MAC → PCS → PMA → PMD → 物理线缆 / 光纤。

3 MAC 与 PHY 之间并行接口:RGMII、XGMII

这是芯片与芯片之间的板上并行接口,不是网线上面的信号。

3.1 RGMII(1G)

Reduced Gigabit Media Independent Interface,精简 GMII。 数据线 4bit,双向;自带独立随路时钟线(TX_CLK / RX_CLK)。 时钟由 PHY 供给 MAC;板上并行,接收端直接采样外部时钟,接口内部不需要 CDR。 MAC 输出 RGMII 给到外部 PHY 芯片;PHY 内部完成 PCS、PMA、DSP、PMD,输出 RJ45 差分信号。

3.2 XGMII(10G 并行接口)

10G Media Independent Interface,MAC ↔ PCS 之间的并行接口。 32bit 数据通路 + 4bit 控制信号 + 独立 TX_CLK、RX_CLK 时钟线。 芯片内部板间接口,有独立时钟走线,XGMII 接口本身不需要 CDR;接收端直接使用发送端提供的同步时钟采样。 XGMII 接口不再依靠前导码 / SFD 做接口层面帧分界;改用 K 控制字符有序集标记帧边界。

注意:MAC 内部帧依然会生成前导码 + SFD,作为业务数据流过 XGMII 数据线;但 PCS 层不拿它做帧边界识别。

3.3 XGMII K 控制字符、有序集 /S//T//I/

XGMII 控制线标记当前字节是【数据 D】还是【控制 K】。 /S/ Start:帧开始有序集,标记以太网帧的起始。 /T/ Terminate:帧结束有序集,标记帧结束。 /I/ IDLE:链路空闲有序集,没有业务帧时持续发送。

有序集 = K 控制码字 + 特定数据码字组合。 K 码的核心:控制线 + 码字值二元标记,业务数据永远不会产生 K 标记,不会和业务载荷产生歧义。单纯数据字节会出现 0x55+0xD5,但业务数据永远不会把控制线置为 K。

3.4 为什么 PCS 不能复用 MAC 前导码做帧定界

PCS 只看到一串连续 D 数据码,没有 MAC 状态机上下文。 MAC 层有 IDLE / 接收帧状态机,可以关闭 SFD 检测规避歧义。 PCS 没有这套帧状态机;PCS 拿到的是 MAC 送过来的原始字节流,如果仅靠 0x55+0xD5 识别帧起点,载荷内部出现相同序列就会误判帧起始。

所以 PCS 层面必须引入独立 K 控制有序集 / S / 做帧边界;和 MAC 层前导码两套机制各司其职。

3.5 IDLE 有序集说明

IDLE 有序集(/I/)链路空闲时 PCS 持续发送。 IDLE 有序集不包含以太网前导码。 作用:维持链路码块同步、维持 CDR 信号跳变,填充帧间隙 IFG。

4 SerDes 详细解析

4.1 SerDes 是什么,属于哪一层

SerDes = Serializer / Deserializer 串化器 / 解串器,归属 PMA 子层。 Serializer:把并行比特流转为高速串行差分比特流。 Deserializer:收到串行差分信号,恢复成并行比特流。

重点区分: SerDes 只做并行↔串行比特转换;SerDes 本身不做 PCS 编码(4B/5B、64B/66B)。编码、K 码、有序集全部是 PCS 完成之后,再送入 SerDes。

4.2 片内 SerDes 职责,不做什么

做:

  1. 并行数据转高速串行差分信号输出。
  2. 接收差分串行信号,恢复并行输出。

不做:

  1. 不做 64B/66B / 8B/10B 编码;编码属于 PCS。
  2. 不识别以太网帧、不识别前导码、不识别 VLAN。
  3. 不做 CRC/FCS 校验。

工程实现:很多 PHY/MAC IP 把 PCS+SerDes (PMA) 封装在同一个 IP 核内部;逻辑分层上两者依然独立模块。

4.3 RJ45 网线上有没有 SerDes 信号

RJ45 对外网线上面没有 SerDes 串行信号! SerDes 信号只存在芯片内部、SFP + 光模块电接口。 RJ45 BASE‑T 对外输出是经过 DSP 处理的多电平模拟差分信号(PAM5/PAM3)。

数据流:MAC → PCS → SerDes (片内串行) → PMA/PMA‑DSP → PMD,转换成多电平模拟信号输出到 RJ45 双绞线。网线侧已经不再是 SerDes 串行比特流。

5 CDR 时钟数据恢复完整原理

5.1 为什么跨设备通信必须 CDR

两台 PC / 交换机,两端各自使用独立晶振;晶振存在 ppm 级频率偏差。 网线 / 光纤线缆没有单独时钟信号线,只有差分数据线。 接收端不能直接拿到发送端时钟;必须从收到串行比特流的信号跳变沿,恢复出发送端比特时钟,这个电路就是 CDR Clock Data Recovery。

5.2 哪些场景需要 CDR,哪些不需要

不需要 CDR:XGMII、RGMII 板上并行接口。 芯片之间走线,有独立时钟线;接收端直接采样发送端提供的时钟。

必须 CDR

  • SerDes 对外串行链路(SFP + 光口)
  • 1000BASE‑T、10GBASE‑T RJ45 铜缆电口。

误区:CDR 不是 SerDes 专属。BASE‑T RJ45 PHY 内部同样集成 CDR 电路。

5.3 BASE‑T 铜缆 PHY 是否带 CDR

是的。1000BASE‑T、10GBASE‑T PHY 内部都有 CDR,从双绞线差分模拟信号恢复发送端比特时钟。

5.4 CDR 靠什么锁定频率,没有前导码如何锁定

  1. 老低速(100BASE‑FX):依靠前导码大量 0/1 跳变沿训练 CDR。
  2. 高速 10GBASE‑R(64B/66B):不再依赖以太网前导码做 CDR 锁定 PCS 持续发送码块:业务帧或者 IDLE 控制码块。 每个 66bit 码块头部 2bit 同步头,持续提供比特跳变沿。 CDR 依靠源源不断码块跳变完成频率锁定。

分工再次强调: 64B/66B 码块同步头 → PCS/CDR 比特时钟锁定。 前导码 + SFD → MAC 层以太网帧边界识别。 二者不能互相替代。即使 SerDes+64B/66B 链路,MAC 帧依然保留完整前导码 + SFD。

6 PCS 编码详解 4B/5B + NRZI + 64B/66B

6.1 4B/5B 编码

应用:100BASE‑FX(百兆光纤) 将 4bit 业务数据映射为 5bit 固定码字。 5bit 码字集合经过挑选,避免出现长连续 0。 同时预留一部分特殊码字,用作链路 IDLE、链路状态指示。 带宽开销:5/4 = 25% 额外开销。

6.2 NRZI 编码原理,为什么需要 4B/5B

NRZI:Non‑Return‑to‑Zero Inverted 反向不归零编码 规则:电平翻转代表逻辑 1;电平不翻转代表逻辑 0。

问题:如果数据流出现大量连续 0,NRZI 电平不会翻转,没有跳变沿。CDR 电路缺少跳变沿,会丢失时钟锁定,造成采样错误。

单纯 NRZI 不能限制长连 0;所以上层增加 4B/5B 块编码:保证输出比特流不会出现很长连续 0,给 CDR 提供足够跳变沿。

4B/5B 是 PCS 块编码;输出之后再送给 PHY 做 NRZI 电平调制。

6.3 4B/5B 最大连续 0 限制

单个 5bit 码字内部不会出现连续 3 个 0。 两个码字拼接最坏情况,最多出现连续 3 个 0。 保证一定的信号跳变密度,防止 CDR 失锁。

6.4 64B/66B 编码(10GBASE‑R)

用于 10GBASE‑R 光口 PCS 层。 64bit 业务数据块,加上 2bit 块同步头,组成 66bit 码块。 2bit 头部标记该码块是【数据块】还是【控制 K 码块(有序集 IDLE/S/T)】。 链路空闲不停发送 IDLE 控制码块。 带宽开销:66/64 ≈3.125%,开销远小于 4B/5B、8B/10B,适合高速以太网。

64B/66B 有全局加扰,进一步打散比特,避免长时间相同比特序列。

6.5 64B/66B 与前导码分工(非常重要)

很多人误区:用了 64B/66B 就不需要前导码。错误

  1. 64B/66B 码块同步头:PCS 层,负责码块对齐、CDR 时钟锁定。
  2. 前导码 + SFD:MAC 层,负责识别以太网帧的帧边界。

MAC 层协议逻辑依然要求每帧带前导 + SFD,这是 802.3 帧标准,和底层 PCS 编码无关。PCS 只管码块,不懂以太网帧语义。

7 RJ45 双绞线电口体系

7.1 差分信号

RJ45 全部速率以太网使用差分信号传输:一对双绞线,发送极性相反的两个信号;接收端取差值。优点:抗共模干扰,抑制 EMI 噪声。

1000BASE‑T /10GBASE‑T:4 对差分线,每一对同时双向收发,依靠 PHY‑DSP 回声消除分离收发信号。

7.2 1000BASE‑T PAM5 五电平信号

1000BASE‑T 使用 4D‑PAM5 调制,一个符号 5 种电平。 4 对线双向同时收发,所以会看到 5 种电平。不是 5 对线,是 4 对双绞线,调制方式 5 电平。

7.3 Cat8 线缆规格

Cat8 网线固定 4 对双绞线;没有更多线对。Cat8 针对 40GBASE‑T 短距离。

7.4 RJ45 理论最大速率

Cat8 标准,RJ45 接口理论最高 40Gbps(40GBASE‑T)。

7.5 10GBASE‑T vs 10GBASE‑R 是否可以混用

不能混用 10GBASE‑T:RJ45 铜缆 PHY 标准,PCS/PMA/PMD 整套针对双绞线多电平 PAM 调制。 10GBASE‑R:光口 PCS 标准,64B/66B 编码,给 SerDes 光模块使用。 两者编码、信号、介质完全不兼容;10G‑R 不能直接跑 RJ45 网线。

8 光口、光纤、光模块基础

8.1 光纤传输的信号,有没有电压电流

光纤内部传输模拟光强信号,没有电压、没有电流。 光模块内部:SerDes 串行电信号输入光模块;模块内部完成电信号转激光光信号。 光纤只传递光;接收端光模块把光转回电差分 SerDes 信号。

9 SerDes、CDR、DSP 三者区分

SerDes,所属 PMA,核心功能:并行比特流 ↔ 高速串行差分比特流;只做并串转换 CDR,所属 PMA,核心功能:从收到串行数据流恢复发送端比特时钟;解决两端晶振偏差 DSP,所属 PMD 模拟部分,核心功能:专用于 BASE‑T 双绞线;信号均衡、回声消除、噪声补偿、PAM 信号处理

关系: SerDes 负责比特串并转换;CDR 负责采样时钟恢复;DSP 只用于铜缆 RJ45 模拟信号处理。三者独立硬件模块。 光模块不需要 DSP;RJ45 BASE‑T PHY 必须 DSP。

10 Linux 以太网驱动 & Device‑Tree (DTS) 配置

以太网驱动分为两大部分:

  1. MAC 控制器驱动(SoC 内置 MAC)
  2. PHY 驱动(libphy 子系统,管理外部 PHY 芯片)

DTS 关键节点示例 eth0: ethernet@10000000 { compatible = "xxx,mac-controller"; reg = <0x10000000 0x1000>; interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;

phy‑handle = <&phy0>; phy‑mode = "rgmii‑id"; mac‑address = [00 11 22 33 44 55];

};

mdio { phy0: ethernet‑phy@0 { reg = <0>; }; };

重点参数说明:

  1. phy‑mode:极其关键,定义 MAC 与外部 PHY 之间接口时序。配置错误直接网络不通、丢包。 可选:rgmii、rgmii‑id、sgmii、10gbase‑r。
  2. phy‑handle:关联 MDIO 总线上的 PHY 设备。
  3. mac‑address:MAC 硬件地址。

抓包 VLAN 标签消失,除了硬件,内核 ethtool 可以查看 / 关闭 VLAN HW offload。 ethtool ‑k eth0 查看网卡卸载特性 ethtool ‑K eth0 rx‑vlan‑offload off 关闭 VLAN 硬件剥离

11 完整数据流串联(发送方向,10G 光口例子)

应用层 Socket → 内核协议栈 → skb 报文

  1. MAC 子层: 组装 MAC 帧头;如果需要硬件 VLAN add,记录 VLAN ID 到描述符。 生成前导码 7B + SFD 1B;计算 FCS CRC32 追加帧尾。
  2. MAC 输出 XGMII 并行数据流给到 PCS。
  3. PCS 子层: 插入 PCS 有序集:/S/ 帧开始,/T/ 帧结束;空闲发送 / I/IDLE。 执行 64B/66B 块编码,添加 2bit 同步头;全局加扰。
  4. PMA(SerDes): 并行码块送入 Serializer,转为高速串行差分电信号。
  5. SFP + 光模块: 电信号转为激光光信号。
  6. 光纤传输。

12 完整数据流串联(接收方向,10G 光口例子)

  1. 光纤光信号进入光模块,转换为串行差分电信号。
  2. PMA SerDes Deserializer: CDR 电路从串行比特流恢复发送端时钟;串行转并行。
  3. PCS 子层: 64B/66B 码块同步;识别 2bit 块头;识别 K 有序集 / S//T//I/;解扰。 把码块还原为字节流,XGMII 并行输出送给 MAC。
  4. MAC 子层: MAC 状态机 IDLE 状态等待 SFD;检测 SFD 进入接收帧状态。 硬件剥离前导码 + SFD。 FCS CRC32 校验;错误帧直接丢弃。 如果开启 VLAN HW offload:硬件剥离 VLAN tag,tag 存入 rx 描述符,skb 报文不带 VLAN。
  5. skb 上报 Linux 内核协议栈;libpcap/wireshark 抓包。

13 高频易错坑点汇总

  1. 每一个以太网帧都必须携带完整前导码 + SFD,不是链路空闲转发送才发送一次。
  2. Payload 载荷可以出现 0x55+0xD5;MAC 依靠 IDLE 状态机,只有 IDLE 才检测 SFD,避免载荷误判新帧。
  3. 64B/66B 码块同步头解决 PCS 码块同步、CDR 锁定;不能替代 MAC 层前导码 / SFD,两套机制分工不同。
  4. SerDes 属于 PMA;SerDes 只做并串转换,不做 PCS 编码,编码是 PCS 模块。
  5. RJ45 网线对外传输没有 SerDes 信号;SerDes 只存在芯片内部与光模块电口。
  6. VLAN 硬件卸载会造成 wireshark 抓包看不到 VLAN tag;需要关闭 rx‑vlan‑offload 才能抓到原始带 tag 帧。
  7. CDR 不是 SerDes 独有;1000BASE‑T /10GBASE‑T RJ45 铜缆 PHY 内部同样具备 CDR。
  8. XGMII/RGMII 板上并行接口带独立时钟线,接口层面不需要 CDR;对外线缆没有时钟线,必须 CDR 恢复时钟。
  9. FCS CRC32 属于 MAC 层,PHY 不做以太网帧校验。
  10. 10GBASE‑R 是光口 PCS 标准,不能直接跑 RJ45 双绞线;10GBASE‑T 才是 RJ45 10G 电口标准。
  11. IDLE 有序集不包含以太网前导码。
  12. K 控制字符 / S / 依靠【控制线标记 K】+ 码字,业务数据无法模拟,不会产生歧义;单纯字节数据会出现和前导码一样序列。
  13. 光纤内部只有光信号,不存在电压电流。
  14. Cat8 网线依旧 4 对双绞线,不是更多线对。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐