简介:IEEE Std 802.3-2022《以太网标准》官方PDF文档,面向网络工程师、协议开发人员及通信专业师生,用于查阅以太网局域网从1 Mb/s到400 Gb/s各速率的规范细节。资源包内仅含1个PDF文件,大小约48.86MB,完整收录标准正文,涵盖CSMA/CD媒体访问控制协议、半双工与全双工操作、媒体独立接口(MII)、多种物理层设备(PHY)以及管理信息库(MIB)等核心章节。文档还涉及多段共享接入网络的中继器系统考量、城域网PHY应用、双绞线供电等扩展能力,并附有摘要与关键词索引,便于按速率和PHY类型快速定位。目前已有188人学习下载,适合需要对照官方标准开展协议实现、设备选型或教学备课的读者,可作为案头查阅与规范引用的权威依据。
1. 拿到 IEEE STD 802.3-2022 之后,先搞清楚它到底能帮你解决什么
很多人第一次接触 IEEE 802.3-2022 是在一个很具体的场景里:板子回来了,PHY 芯片焊上去,MAC 侧寄存器也配了,但链路就是起不来,或者起来了丢包。硬件同事说“时序没问题”,驱动同事说“寄存器按手册写的”,最后锅甩到“以太网标准”上。这时候你需要的不是从头读一遍几千页的 PDF,而是知道 802.3-2022 里哪一章定义了 PCS、PMA、SGMII 这些你正在调的层,以及哪些参数是标准锁死的、哪些是厂商可以自己发挥的。
IEEE 802.3 就是 Ethernet 的母标准,2022 版把从 1 Mb/s 到 400 Gb/s 的物理层和 MAC 层规范整合在一份文档里。它解决的核心问题是:让不同厂商的 MAC、PHY、光模块、线缆能在同一个链路上互操作。适合谁看?做交换芯片验证的、写网卡驱动的、调 FPGA 以太网 IP 的、以及需要给 1G/2.5G Ethernet PCS/PMA 或 SGMII 接口做一致性测试的工程师。如果你只是调 i219-v 的 VLAN 配置,标准本身不会直接告诉你寄存器地址,但它会告诉你 VLAN tag 的帧格式和优先级字段定义,这是你判断驱动行为对不对的依据。
2. 从 802.3-2022 的目录结构定位你真正要读的那几页
2.1 先看 Clause 1 和 Clause 30,别一上来就翻物理层
802.3-2022 的体量摆在那里,直接从头读是效率最低的做法。我一般会先看两个地方:Clause 1 的 Scope 和 Clause 30 的 Management。Clause 1 告诉你这份标准覆盖了哪些速率和介质,帮你确认你手上的 2.5G 背板链路到底属于哪个子条款。Clause 30 定义了标准的管理对象(Managed Object),也就是那些通过 MDIO 或寄存器暴露出来的计数器、状态位、控制位。你调 i219-v 时看到的 VLAN 过滤、链路状态、速率协商结果,背后对应的就是 Clause 30 里的属性定义。
Clause 30 里有一张表列出了所有标准管理属性,包括 aFramesTransmittedOK、aFramesReceivedOK、aFrameCheckSequenceErrors 这些计数器。当你的驱动报告“收包正常但上层收不到”时,先对照这张表确认 MAC 侧计数器有没有增长。如果 aFramesReceivedOK 在涨但协议栈没收到,问题大概率在 DMA 描述符或中断,不在以太网标准本身。
2.2 用 Clause 22/45 的寄存器映射去对 PHY 行为
Clause 22 定义了 MII 管理接口的寄存器映射,Clause 45 定义了 MDIO 可寻址设备的寄存器空间。你调 1G/2.5G Ethernet PCS/PMA 或 SGMII 时,PHY 的很多行为是通过这些寄存器控制的。比如 Clause 22 的 Register 0(BMCR)里的 bit 12 是 Auto-Negotiation Enable,bit 9 是 Restart Auto-Negotiation。如果你发现链路一直停在 100M 而不是 1G,先读 Register 1(BMSR)看 Link Status 和 Auto-Negotiation Complete 位,再读 Register 9(1000BASE-T Control)确认 Advertise 的速率能力。
# 用 mdio-tools 读取 Clause 22 寄存器(以 Linux 为例) # 假设 PHY 地址为 0x01,MDIO 总线为 0 mdio-read /dev/mdio0 0x01 0x00 # BMCR mdio-read /dev/mdio0 0x01 0x01 # BMSR mdio-read /dev/mdio0 0x01 0x09 # 1000BASE-T Control mdio-read /dev/mdio0 0x01 0x0A # 1000BASE-T Status这几条命令读出来的值要对照 802.3-2022 Clause 22 的寄存器定义表逐位解释。BMCR 的 bit 12 如果为 0,说明自协商被关掉了,链路只能靠固定配置;BMSR 的 bit 2 是 Link Status,读两次之间如果翻转,说明链路不稳定。1000BASE-T Status 的 bit 11 是 Link Partner 的 1000BASE-T 能力,如果为 0,说明对端不支持 1G,你这边再怎么配也没用。
2.3 用 Clause 36/49 理解 PCS 和 PMA 的分层
1G/2.5G Ethernet PCS/PMA 或 SGMII 这个热搜词背后,对应的是 802.3-2022 里的 Clause 36(1000BASE-X PCS/PMA)和 Clause 49(10GBASE-R PCS/PMA)。PCS 负责编码/解码、同步、载波侦听,PMA 负责串并转换和模拟前端。SGMII 本身不是 802.3 标准里的一个 Clause,它是 Cisco 提的串行千兆媒体独立接口,但它的 PCS 行为大量借用了 Clause 36 的定义。
你调 FPGA 的 1G/2.5G Ethernet PCS/PMA IP 时,IP 核的寄存器手册里会引用 Clause 36 的同步状态机。如果链路一直无法同步,先看 IP 核输出的 sync_status 信号,再对照 Clause 36 的 Figure 36-9 状态图,确认是 loss of sync 还是 sync acquired 后又被打破。常见原因是参考时钟频偏超过 ±100 ppm,或者 SGMII 的 8b/10b 编码里出现了非法码字。
3. 把标准里的参数落到 i219-v 和 SGMII 的实际配置上
3.1 i219-v 的 VLAN 配置:标准怎么说,驱动怎么做
Intel i219-v 的 VLAN 配置是热搜里很具体的一个需求。802.3-2022 Clause 3.2.1 定义了 VLAN tag 的格式:TPID(0x8100)+ TCI(PCP 3 bit + DEI 1 bit + VID 12 bit)。i219-v 的硬件支持 VLAN 过滤和插入/剥离,但具体寄存器不在 802.3 标准里,而在 Intel 的 datasheet 里。标准能帮你的是:确认 VLAN tag 的字节序和位置,以及当帧长超过 1518 字节时,VLAN tag 是否计入 MTU。
// 802.3-2022 Clause 3.2.1 的 VLAN tag 结构 struct vlan_tag { uint16_t tpid; // 0x8100 uint16_t tci; // PCP(3) | DEI(1) | VID(12) }; // 注意:tpid 和 tci 在网络字节序下传输在 i219-v 上配 VLAN 时,驱动通常会操作两个寄存器:VLAN Ether Type Register(设置 TPID)和 VLAN Filter Table(设置允许的 VID)。如果你发现配了 VLAN 后收不到包,先确认 TPID 是不是 0x8100,再确认 VID 是否在过滤表里。标准里没有“i219-v 的 VLAN 寄存器地址”,但标准里的帧格式定义是你判断驱动行为是否正确的基准。
3.2 SGMII 的 8b/10b 编码和 Clause 36 的同步状态机
SGMII 在 1G 模式下使用 8b/10b 编码,速率是 1.25 Gbps(线速率),有效数据速率 1 Gbps。802.3-2022 Clause 36 定义了 1000BASE-X 的 PCS 同步状态机,SGMII 借用了这套机制。你调 SGMII 时,如果 IP 核报告 sync_status 一直为低,按以下顺序排查:
- 确认参考时钟频率和频偏。Clause 36 要求接收端能在 ±100 ppm 的频偏下完成同步。
- 用示波器看差分对上的信号幅度和共模电压,PMA 层的电气规范在 Clause 38 里。
- 检查 8b/10b 解码器的 error 计数器。如果 error 持续增长,说明有非法码字,通常是发送端时钟抖动太大或均衡器没配好。
// 一个简化的 8b/10b 同步检测逻辑(示意) // 实际 IP 核会输出 sync_status 和 error_count always @(posedge clk) begin if (rx_disparity_error || rx_not_in_table) error_count <= error_count + 1; if (error_count > THRESHOLD) sync_status <= 1'b0; end这段逻辑说明的是:同步不是一次性的,而是一个持续监测的过程。Clause 36 的状态机允许在检测到一定数量的非法码字后重新进入 loss of sync 状态。你调链路时如果看到 sync_status 周期性抖动,先看 error_count 的增长速率,再回头查发送端的时钟质量。
3.3 2.5G 模式下的 PCS 差异:Clause 36 和 Clause 49 之间
2.5G Ethernet 在 802.3-2022 里对应的是 2.5GBASE-T 和 2.5GBASE-X。2.5GBASE-X 的 PCS 借用了 10GBASE-R 的 64b/66b 编码,而不是 1000BASE-X 的 8b/10b。这意味着你从 1G SGMII 切到 2.5G 时,PCS 层的编码方式变了,同步状态机也不同。如果你用的 FPGA IP 核同时支持 1G 和 2.5G,切换速率时需要重新配置 PCS 的编码模式,否则会出现“链路 up 但丢包”的现象。
常见做法是:在 IP 核的配置寄存器里有一个 speed_select 位,切到 2.5G 时把它置 1,同时确认参考时钟从 125 MHz 切到 312.5 MHz(或者 IP 核内部有 PLL 倍频)。如果切完速率后 sync_status 能拉高但误码率很高,先查 64b/66b 的 gearbox 配置,再查 PMA 的均衡器参数。
4. 避坑与排查:调以太网链路时最容易翻车的几个地方
4.1 现象:链路能 up,但 ping 大包必丢
原因:MTU 和 VLAN tag 的字节数没对齐。802.3-2022 Clause 3.2.1 规定 VLAN tag 占 4 字节,如果驱动在计算 MTU 时没把这 4 字节算进去,大包会被硬件丢弃。另外,某些 PHY 在 1G 模式下对超过 1518 字节的帧直接丢,不产生任何计数器。
解决:先确认驱动里的 MTU 设置是否包含了 VLAN tag 的 4 字节。用ping -s 1472和ping -s 1473对比,如果 1472 通、1473 不通,说明 MTU 卡在 1500 字节(1472+28=1500)。如果配了 VLAN,把 MTU 调到 1496 再试。
4.2 现象:i219-v 配了 VLAN 后,收不到任何带 tag 的包
原因:VLAN Filter Table 没配,或者 TPID 被改成了非 0x8100。i219-v 的硬件默认可能只接受 TPID=0x8100 的帧,如果你对端发的 TPID 是 0x88A8(QinQ),硬件直接过滤掉。
解决:读 i219-v 的 VLAN Ether Type Register,确认 TPID 值。如果对端用 QinQ,要么改对端,要么把 i219-v 的 TPID 改成 0x88A8。注意:改 TPID 后,所有 VLAN 配置都要重新做。
4.3 现象:SGMII 链路 up 后,误码率随时间上升
原因:PMA 层的均衡器没适配线缆长度,或者参考时钟频偏在温度变化后超出 ±100 ppm。Clause 36 的同步状态机允许一定程度的频偏,但长期运行后温漂会导致采样点偏移。
解决:先测参考时钟的频偏,用频率计在常温下测,再加热到 70°C 测。如果频偏超过 ±50 ppm,换晶振。如果频偏正常,调 PMA 的均衡器参数,通常 IP 核会提供一组预设值,从短距离到长距离逐个试。
4.4 现象:2.5G 模式下 sync_status 拉高但 error_count 持续增长
原因:64b/66b 的 gearbox 配置错误,或者 PMA 的串并转换位宽不匹配。2.5GBASE-X 的线速率是 3.125 Gbps,64b/66b 编码后有效速率 2.5 Gbps。如果 IP 核的 datapath 位宽还是按 1G 的 10 bit 配的,就会出问题。
解决:确认 IP 核的 datapath 位宽在 2.5G 模式下是 32 bit 或 64 bit(取决于 IP 实现),而不是 10 bit。同时确认参考时钟频率是否正确。如果 IP 核手册里写了“2.5G 模式下参考时钟为 312.5 MHz”,就别用 125 MHz。
4.5 现象:MDIO 读寄存器返回 0xFFFF 或 0x0000
原因:MDIO 总线的上拉电阻没接,或者 PHY 地址配错。Clause 22 规定 MDIO 是开漏输出,需要 1.5kΩ 上拉。如果上拉缺失,读回来的数据全是 1。如果 PHY 地址配错,读回来的是 0 或者随机值。
解决:用示波器看 MDIO 线上的波形,确认空闲时是高电平。如果一直是低,查上拉电阻。如果波形正常但读回来不对,用mdio-read扫描 0x00 到 0x1F 的所有地址,找到实际响应的 PHY 地址。
5. 用 Clause 30 的计数器做链路健康度基线
调通链路只是第一步,长期稳定运行需要一套基线。802.3-2022 Clause 30 里的标准计数器就是你做基线的依据。我一般会在链路 up 后先读一遍所有计数器,记录初始值,然后跑 24 小时流量,再看增量。如果 aFrameCheckSequenceErrors 或 aFramesLostDueToIntMACRcvError 在 24 小时内增长超过 0.01%,说明链路有隐患。
# 用 ethtool 读取标准计数器(Linux) ethtool -S eth0 | grep -E "rx_errors|rx_crc_errors|rx_length_errors|tx_errors" # 用 mdio-tools 读取 Clause 45 的 PMA/PMD 状态寄存器 mdio-read /dev/mdio0 0x01 0x0001 # PMA/PMD Status 1 mdio-read /dev/mdio0 0x01 0x0008 # PMA/PMD Receive Signal DetectClause 45 的 PMA/PMD Status 1 寄存器里,bit 2 是 Receive Signal Detect,bit 5 是 Receive Link Status。如果这两个位在流量运行时频繁翻转,说明模拟前端有问题,不是数字逻辑能解决的。我自己的习惯是:每次改完 PHY 配置或换线缆后,先跑 10 分钟 iperf3,同时用脚本每 10 秒采一次计数器,看有没有突增。这个习惯帮我提前发现过好几次线缆接触不良和均衡器配置错误。
希望帮到你。
本文还有配套的精品资源,点击获取