ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

万兆以太网物理层深度解析:从64B/66B编码到信号完整性调试

万兆以太网物理层深度解析:从64B/66B编码到信号完整性调试 1. 先说结论:万兆以太网并不是给千兆提速那么简单1.1 为什么万兆一步跨进全双工时代你翻过百兆和千兆以太网的资料,一定对CSMA/CD和半双工模式有印象。那时候的以太网,还要考虑多个设备共享一根同轴电缆或者集线器,发数据前先侦听信道,撞上了就退避重发。到了万兆以太网(10G Ethernet),这件事直接被划掉了。IEEE 802.3ae标准里根本不再讨论半双工和冲突检测,万兆链路只保留一种工作模式:全双工、点对点。原因并不复杂。10G的数据速率下,如果还保留CSMA/CD,那为了满足冲突检测的最短帧长和最大传输距离约束,要么延长帧长,要么把冲突域半径压到几十厘米,工程上完全没有意义。实际部署的万兆链路基本就是交换机到服务器、交换机到交换机这种一对一连接,每根链路的发送和接收各走各的通道,互不干扰。所以从物理层简化掉载波侦听和冲突退避,是顺理成章的选择。这个变化带来的连锁反应是,物理层不再需要维持共享介质的时序关系,可以把精力全部放在一件事上:如何在10.3125Gbps这条高速串行链路上把数据可靠地传过去。千兆以太网还能靠一对差分线凑合,万兆则直接切换到光模块、高速SerDes、时钟数据恢复(CDR)、编码加扰这些更底层的技术。也就是说,万兆的真正难点不在MAC层,而在物理层。1.2 万兆以太网适合谁、用在哪我最初接触万兆,是在FPGA上做高速数据采集传输。那时要往远端服务器传原始采样数据,1G带宽完全不够,算下来至少要5G以上,于是只能上10G。做完这个项目再回头看,我发现万兆目前最集中的使用场景大概有三类。第一类是数据中心内部的服务器接入和汇聚,这是最大的基本盘。第二类是高带宽嵌入式系统,典型表现是FPGA万兆光口,做视频处理、雷达信号采集、AI推理加速卡的互联。第三类是高端测试测量仪器和存储网络,尤其是NVMe over Fabric这类应用,万兆几乎成了标配。如果是刚开始学,你不需要立刻吃透所有子层的每个寄存器,但一定要建立起万兆物理层的整体拓扑感:MAC层是怎么把数据交给物理层的、物理层内部又怎么把并行数据变成串行光信号、接收端又是怎么恢复时钟并还原数据的。这篇文章就按这个顺序来拆解。2. R、X、W:万兆物理层标准里的三个字母,怎么选2.1 三种编码方案对比万兆以太网物理层标准看起来一堆,10GBASE-SR、10GBASE-LR、10GBASE-LX4、10GBASE-CX4、10GBASE-T,但归归类就清楚多了——它们其实分属三大体系:R系列、X系列、W系列。这三个字母代表的是完全不同的编码方式和线路速率设计思路。先看10GBASE-R系列。这是当前最主流的串行万兆方案,编码采用64B/66B,单通道线路速率10.3125Gbps。SFP光模块走的几乎都是这条路,后面会重点讲。再看10GBASE-X系列。它把10G拆成4条通路,每路2.5G数据速率,用8B/10B编码后每路线路速率变成3.125Gbps,合计12.5Gbps。应用代表是10GBASE-CX4(短距离铜缆)和曾经的10GBASE-LX4(多波长光模块)。这个方案的好处是每个通道速率低、信号好处理,缺点是编码开销大、线缆数量多,现在基本被R系列取代了。最后是10GBASE-W系列。它的特殊之处在于加了一个WIS(WAN Interface Sublayer)子层,把万兆以太网帧封装进类似OC-192/STM-64的SDH帧结构,线路速率从10.3125Gbps降到9.95328Gbps,从而可以直接接入运营商的SDH传输网络。在很多年前,这个设计是为了让以太网数据能走电信级传输网,今天实际部署已经非常少,但协议栈里仍然会提到它。物理层类型编码方式有效数据速率线路速率典型场景10GBASE-R64B/66B10 Gbps10.3125 GbpsSFP光模块、数据中心、背板10GBASE-X8B/10B10 Gbps4×3.125 Gbps早期LX4光口、CX4铜缆10GBASE-W64B/66B WIS约9.58 Gbps9.95328 Gbps接入SDH/SONET网络10GBASE-TLDPC PAM10 Gbps4对线2.5G/对Cat6a/Cat7双绞线布线选型时我的经验是:非特殊需求优先选10GBASE-R。它结构简单、光模块生态成熟、调试工具多。X系列只有在特定老旧设备对接时才需要考虑。W系列,除非你明确知道要和电信SDH设备互联,否则完全不用碰。2.2 光纤和铜缆怎么挑确定了R系列之后,接下来要考虑的是介质,也就是光口还是电口、多模还是单模、能传多远。这个选择直接影响光模块和线缆的成本。先看光口。10GBASE-SR是短距离,850nm多模光模块,配合OM3/OM4多模光纤,典型距离300米,OM4可以到400米,适合机房内部互联。10GBASE-LR是长距离,1310nm单模光模块,配合单模光纤能到10公里。10GBASE-ER是超长距离,1550nm单模,理论40公里,主要给运营商或园区骨干用。如果你的应用场景是数据中心同机柜或跨几个机柜,SR基本够用;如果是厂区两栋楼之间,直接上LR,别省这个钱。再看电口。10GBASE-T是双绞线方案,用Cat6a以上屏蔽或非屏蔽铜缆,最长100米,优点是可以复用现有结构化布线,缺点是模块功耗大、延迟高,在数据中心里已经逐渐被SFP光模块替换。10GBASE-CX4是专用铜缆,直连距离15米左右,适合设备内部背板或极短距离跳线,后来被SFP直连铜缆(DAC)替代了。另外还有一个容易被忽略的10GBASE-LRM,它用1310nm光源配合多模光纤,最大支持220米,专门用于老旧的FDDI多模光纤。如果你需要利旧历史布线,这个型号可以关注,但新项目直接上OM4配SR模块更省心。3. 从MAC到光口,一条报文在PHY里走完的路3.1 PCS、PMA、PMD各管哪一段万兆物理层在标准里被拆成了好几个子层,第一次看的人很容易被缩写绕晕。我用一条实际数据包的旅行路线来讲,应该就清楚多了。假设MAC层已经组装好一个以太网帧,从MAC出来第一个碰到的是调和子层(RS),它负责把MAC和外部接口在逻辑上对齐。接着数据进入XGMII接口,这是一个32位并行总线,后面会专门说。从XGMII进来就是物理层的地盘了,首当其冲的是PCS(物理编码子层),它负责把MAC层过来的并行数据做编码——R系列是64B/66B编码,同时还负责加扰、多通道分配、时钟补偿这些脏活。编码完成后的数据交给PMA(物理介质附加子层)。PMA的主要工作是把并行的编码数据转换成高速串行数据,同时做时钟恢复和时钟生成。这句话听起来简单,实际是芯片里最难搞的模拟部分:锁相环PLL、CDR、高速差分驱动器都在这一层。PMA往下就是PMD(物理介质相关子层),它负责把电信号变换成光信号或者驱动铜缆,像SFP模块里的激光器驱动和光电接收就属于PMD。最末端就是物理接口MDI,也就是你插入光纤的那个连接器。这个结构可以用快递来类比:MAC是寄件人,只负责把包裹写清楚;PCS是分拣中心,给包裹打包贴码;PMA是运输干线,把不同地址的包裹合并到一辆辆大卡车上;PMD是卡车,沿着不同路线发出去。每一层只处理自己负责的部分,和上下层通过规定的接口对接。3.2 XGMII 和 XAUI:为什么万兆要多出来两个接口千兆以太网有GMII接口,把MAC和PHY连接起来。到了万兆,同样需要一个类似的并行接口,这就是XGMII。它数据总线32位,工作时钟156.25MHz,但采用双沿(DDR)采样,一个时钟周期能传64位,算下来速率正好是10Gbps。XGMII在概念上很直接,但工程实现上有个头疼的问题:32根并行数据线加上时钟控制线,在PCB上要近距离同步到达接收端,对应的时钟频率又很高,布线约束非常严格,实际传输距离只有几厘米。如果MAC和PHY分属不同芯片,板级布线甚至封装设计都会很难受。于是标准里设计了XGMII的延伸接口XAUI。XAUI的思路是把这个32位并行总线先经过一个XGXS子层,变成4条串行通路,每路速率3.125Gbps,用8B/10B编码。这样PCB上需要面对的只是4对高速差分线,传输距离可以拉到50厘米左右,板卡和板卡之间的互联轻松很多。这也是为什么很多万兆PHY芯片对外提供的是XAUI接口而不是XGMII,你用FPGA做设计时,看到的也是XAUI这种接口形态居多。所以记住一个关系:XGMII是MAC和PHY之间的并行接口,可选;XAUI是XGMII的串行延伸,为了布线方便。两者之间通过XGXS子层互相转换。实际调试中,如果PHY芯片侧出现对齐错误,很多时候就出在这个XAUI通道的偏移和同步上。4. 64B/66B:万兆以太网效率提升的关键一招4.1 从8B/10B到64B/66B,省下的到底是什么千兆以太网和早期的万兆X系列,用的都是8B/10B编码。8B/10B的意思是每8位数据需要编码成10位在线路上传输,多出来的2位用来保证直流平衡和足够的跳变沿,便于接收端恢复时钟。但代价很明显:20%的开销。也就是说,物理层虽然跑了3.125Gbps,实际有效数据只有2.5Gbps。到了10GBASE-R,标准把编码方案换成了64B/66B。乍一看,66位里只有2位同步头,开销大约3%,比8B/10B节省太多了。但问题也随之而来:只有2位同步头,如何保证接收端能可靠地找到块边界?如何保证长串的0或1不会引起直流漂移和时钟恢复失败?8B/10B是靠编码表保证跳变稀少的组合不会出现,64B/66B不可能用查表法去穷举64位的组合,于是引入了一个关键部件:加扰器。简单说,发送端在数据块上运行一个自同步的扰码器(多项式为x的58次方加x的39次方加1),把原始数据序列随机化。随机化之后,0和1的分布趋于均匀,长串的连0连1被打破,接收端CDR就能稳定恢复时钟。接收端拿到数据后先做解扰,再恢复出原始的64位数据。这个思路后来被25G、100G以太网继续沿用,这也是为什么搞懂64B/66B之后,理解25G/100G编码会容易很多。那2位同步头是什么作用呢?它是一个固定的模式:数据块的同步头是01,控制块的同步头是10,00和11是非法状态。接收端一旦进入块同步状态,就会持续检测同步头,如果连续出现大量非法同步头,就认定失步并重新搜索。这2位不仅是块边界标记,也是错误检测的一层手段。4.2 一个66位块里藏了什么把64B/66B的一个块拆开看,结构很有意思。块总共66位,最前面是2位同步头,后面跟着64位负载。如果同步头是01,这64位全部是用户数据,也就是一个数据块。如果同步头是10,这是一个控制块,64位负载里有一个8位的块类型字段,用来标记这个控制块到底是什么内容。控制块的类型很多。比如0x1E表示纯空闲(idle),也就是两个以太网帧之间的间隔;0x87表示这一块里有帧的开头(SFD)信息,紧接着就是数据;还有帧结束、错误指示等等。这些控制码的作用是让接收端能够准确还原出XGMII接口上32位数据线和4位控制线的时序。所以在PHY层,一台设备收到的并不是完整的帧,而是由一个个66位块组成的连续比特流,帧和帧之间通过空闲块隔开。这里有个很实际的工程问题:MAC侧恢复出来的时钟和线路侧的接收时钟不一定完全同频,芯片里不同模块的时钟域之间会有微小频差。为了消除这个频差,接收端会调整收到的空闲块数量——多了就删除几个空闲块,少了就在两个帧之间插入几个空闲块。因为空闲块本身不携带有效信息,增删不会影响数据完整性。如果你在做FPGA万兆收发设计,这个空闲块处理逻辑经常会成为对齐和流控的坑。4.3 10GBASE-T为什么又走另一条路有人可能会问:既然64B/66B这么高效,为什么10GBASE-T不直接用,而要搞一套更复杂的LDPC纠错编码?原因是信道条件完全不同。光缆是理想的传输介质,信噪比高,R系列可以依赖简单的扰码完成差错控制。双绞线则是一个严重受限的信道:有回波、有串扰、有衰减,还必须在100米内维持10G速率,光靠64B/66B和均衡器根本不够。10GBASE-T的PCS会对数据进行更强的线路编码,配合LDPC前向纠错和汤姆林森预编码等均衡技术,同时在4对双绞线上并行传输。这样做的好处是利用了Cat6a布线的存量优势,缺点是功耗高、延迟大。实际对比中,10GBASE-T模块的功耗通常比SFP光模块高好几瓦,端到端延迟也会多出几微秒。对于高性能计算和数据中心这种对延迟敏感的场景,这个差异是致命的。所以我的建议是,能在机柜内用光,就尽量不要用10GBASE-T做核心链路。5. 从方案到调通:一条万兆链路的实操记录5.1 硬件平台怎么搭讲完协议,来看实际怎么把一条万兆链路跑起来。这里以FPGA开发板为例,因为这是很多嵌入式工程师最容易上手验证10G的平台。硬件上最少需要这几样:一块带高速SerDes的FPGA、一个SFP连接器,以及配套的参考时钟电路。Xilinx 7系列以及更新的器件,GTX/GTH这类高速收发器都能跑到10.3125Gbps,完全满足10GBASE-R需求。参考时钟一般用156.25MHz,这是10.3125Gbps链路的常用参考源,当然也可以由PLL通过其他频率合成,但最好按官方参考设计选。FPGA内部需要例化三层IP核:最上层是10G Ethernet MAC,完成数据包的发包和收包解析;中间是64B/66B的PCS层,负责编码和加扰;最底层是高速SerDes,对应PMA/PMD的电接口部分。不同厂商的IP核划分不一样,但逻辑上基本就是这三段。如果你用的是带内置MAC的高端SoC,那MAC层已经被芯片集成,只需要把PCS和SerDes配置好就行。做PCB设计时,务必把SFP的差分走线当成射频信号来对待,阻抗按100欧差分控制,尽量短、少打孔、避免并行长走线。SFP连接器到FPGA的高速引脚之间可以直接连接,但要注意供电引脚上必须加上足够的去耦电容。很多自己画板子的朋友,上来就发现10G链路不稳定,十有八九是高速走线或者电源纹波的问题。5.2 上电后的初始化与自检硬件焊好,上电后的第一步不是急着灌代码,而是检查光模块有没有被系统识别。SFP模块通过I2C接口和主板通信,标准里规定了A0h和A2h两组地址,里面存着模块型号、序列号、生产信息,以及实时监测的数字诊断信息DDM——比如模块温度、供电电压、光发射功率、光接收功率等。在Linux系统下,先用ethtool eth0查看当前网口状态,确认Speed是10000Mb/s。接着用ethtool -m eth0读取SFP模块的EEPROM信息,确认模块型号识别正确。如果这里显示Unknown或者No module,先检查I2C线路和模块引脚硬件,不像软件问题。链路up起来之前,最值得做的验证是回环测试。回环分好几级:最底层是SerDes的PMA近端回环,信号从发送端直接环回接收端,不经过光模块,用来验证FPGA内部收发通路;再往上是PCS回环,验证编码解码逻辑;最后是光路上一根光纤跳线把TX和RX短接,验证完整的物理链路。每级回环通过,才说明本级功能正常,这样可以大大缩小排查范围。Xilinx的IBERT就是专门做SerDes级验证的工具,可以在不跑业务的情况下通过JTAG扫描眼图和误码率。FPGA内部如果调试MACPCS,还需要把回环模式配置到正确的PMA/PCS层级,普通初学者往往会混淆这个配置。我建议先把链路层回环都过一遍,再上真实的网络数据包,这样遇到问题不会一头雾水。5.3 用示波器和误码仪验收信号跑通链路只是第一步,如果想在可靠性和量产上站得住脚,信号质量的测试不能省。严格来说,10G信号需要做一致性测试,包括眼图、抖动、模板测试等。通用做法是用高速实时示波器配合光模块测试夹具,或者直接用带光口的误码仪BERT打PRBS31码流,长时间跑误码。眼图能够直观反映信号的幅度、上升沿和抖动余量。10GBASE-R的眼图必须落在规定的模板之外,如果眼宽和眼高不足,说明信号裕量不够,温度变化后很容易出现零星误码。抖动测试主要看总抖动(TJ)和固有抖动,CDR恢复能力差会导致高频抖动增大。实际操作中,如果发现眼图闭合,优先检查光模块的驱动电流、参考时钟的相位噪声、PCB过孔和连接器的回损。误码率测试更直接:发送端持续发送PRBS31伪随机序列,接收端逐位比较,记录错误比特数和误码率。万兆以太网的接收灵敏度要求通常是10的-12次方误码率以下,而且要连续测一段时间确保稳定。如果你手头没有BERT,也可以借助FPGA内部的PRBS发生器和Checker来测试,很多高速收发器都内置了这个自测功能,用法比外置误码仪省事得多。6. 链路起不来、错包多?这份排查清单直接抄6.1 链路状态异常怎么定位我拿到一个10G链路不起来的问题,一般按顺序排查四件事:光模块识别、光功率、线路极性和参考时钟。光模块识别是第一关。SFP模块兼容性很刁钻,很多光模块虽然外观一样,但内部固件不标准,导致交换芯片或FPGA初始化失败。遇到这种情况,优先换一个验证过的原厂模块,别一开始就纠结协议问题。光功率是第二关。用光功率计分别测TX和RX,注意单位是dBm。RX功率必须在模块的灵敏度范围之内,常见10GBASE-SR模块的灵敏度约-14.4dBm,如果实测低于这个值,说明光纤损耗太大或者对端没发光。一个经常被忽略的问题是光纤端面脏了,拧下来用光纤清洁笔擦一下,问题往往就解决了。极性是第三关。光模块的TX/RX必须交叉连接:本端TX接对端RX。多芯MPO光纤跳线如果A/B方向搞反,整个链路都不会通。电口DAC线缆如果内部是直连而非交叉,也可能造成TX/RX链路配对错误。参考时钟是第四关。FPGA的GTX/GTH参考时钟频率必须匹配PLL配置,如果10.3125G的链路用了125MHz参考频率而没有正确分频,速率偏了几百ppm,链路上看就是同步失败、PCS不能锁定。6.2 有link但丢包、错包不断链路状态起来了,说明PCS同步和CDR锁定成功了,但仍然有CRC错包或者丢包,这种情况更多是软故障,排查起来比完全不通更累。先在接收方向看统计计数。用ethtool -S eth0查看rx_crc_errors、rx_fcs_errors、rx_symbol_errors这类计数器,能区分错误是发生在MAC层的CRC校验,还是发生在物理层的符号错误。如果rx_symbol_errors增长明显,说明物理层传输过程中出现了比特错误,根源大概率是信号完整性。信号完整性的潜在杀手很多:SFP连接器虚焊、高速差分线阻抗不连续、光模块本身老化、光纤弯折半径过小、电源纹波偏大。温度变化时出现零星错包的场景尤其像电源或焊接问题。还有一种容易被忽视的是SFP插座的锁定弹片松动,导致模块金手指接触不良,开始时链路正常,跑一段时间高温膨胀后就出错。回环法在这里也好用:在链路两端分别做PMA近端回环和远端光口回环。如果近端回环零误码,而光路回环出错,问题在光模块或光纤;如果近端回环都出错,问题在FPGA/SERDES侧或PCB。逐级缩小范围后,你基本不会做无用功。6.3 其他值得注意的细节万兆模块的发烫问题经常被新手忽视。SFP模块内部有激光器驱动和时钟电路,壳体温度超过70度后,光发射功率会漂移,长期高温工作还可能导致激光器加速老化。所以散热设计一开始就要考虑,特别是在无风扇的密闭盒子里。热插拔方面,SFP支持热插拔,但插入时一定要先锁好卡扣,等待系统重新探测。不要在模块发光工作的时候随意拔插光纤,虽然现在收发端都有保护,但多次带电操作容易损坏激光器ESD防护结构。粉尘问题也别掉以轻心,光纤连接器怕灰尘,脏污端面在10G光路中带来的损耗会比千兆时代明显得多。我养成一个习惯:任何光口没有插光纤的时候,都盖上防尘帽;插拔前先用光纤显微镜检查端面,不给灰尘机会。7. 从万兆到100G:物理层思路还能怎么复用7.1 40G/100G对万兆技术的继承做完一个10G项目,再看40G和100G,你会发现整套思路非常眼熟。40G以太网最常用的是QSFP模块,内部就是4条10G通道并行,物理层相当于把4个10GBASE-R的链路绑在一起。100G的第一代方案也用过10×10G,把10条10G通道并行跑,不过后来为了降低成本和功耗,主流转向了4×25G,也就是QSFP28。但多通道并行带来了万兆时代不需要面对的问题:多个通道之间的数据偏斜。同一帧数据被均匀分散到4条甚至20条通道上传输,接收端必须把这些通道的数据重新对齐,才能还原出正确的顺序。这就是为什么PCS层出现了对齐标记(Alignment Mark)机制——每隔固定数量的块,在每条通道上插入一段特殊的未加扰标记,接收端靠识别这些标记来测量并补偿通道间偏斜。这个概念在10G时代隐患不大,但到了40G/100G就完全离不开它了。还有一个趋势是FEC的大规模应用。10G光口基本可以靠干净的物理信号满足10的-12次方误码率,25G及以上由于串扰、色散和功耗预算更紧张,默认就需要开启RS-FEC。我以前不太理解为什么25G/100G模块动不动要看FEC纠正计数,后来明白,这相当于给物理层加了一道纠错兜底,纠正次数能直接反映链路质量。做100G调试时,看FEC统计比看经典眼图更直观。7.2 给嵌入式工程师的进阶建议如果你是从STM32这类MCU上的百兆以太网起步,想一步跨到万兆,中间建议先补两门课:高速SerDes基础和64B/66B编码原理。MCU上常用的RMII/MII接口,说白了就是低速并行总线,逻辑简单;到了10G,你面对的是串行高速信号、CDR恢复、阻抗匹配、参考时钟噪声,这些全是硬件和物理层的事。没有这些基础,直接调10G光模块会非常吃力。技术选型上,如果你是先做验证,不需要一上来就买成品网卡,一只带SFP底板的FPGA开发板加一个SFP模块、两根光纤跳线,几百块钱就能搭一个最小验证环境。软件方面,Linux系统里用ethtool、wireshark足够应对90%的调试场景;FPGA里学会用ILA抓内核信号和IBERT扫眼图,能省掉大量瞎猜的时间。另外,车载以太网这几年也成了热词,很多人问车载要不要上10G。目前车内主流的PHY还是100BASE-T1和1000BASE-T1这种非屏蔽双绞线方案,主打线束轻量化和低成本;但随着智驾摄像头和中央计算平台的数据量暴涨,10G甚至更高速率的以太网进入车内只是时间问题。但车载以太网的物理层形态和标准走的是一条更贴近可靠性和电磁兼容的路线,和你现在学的数据中心万兆并不完全一样,不要把两者搞混。做万兆以太网,我自己的感受是:掌握协议标准只是门槛,真正的功夫在信号完整性和系统调试上。你能把阻塞点从MAC和PCS对不对顺利转移到光模块和PCB好不好的问题,就已经越过大部分人卡住的阶段了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进