首页/新闻资讯/正文详情

NPO近封装光学重构AI集群互联:从4.8万光模块到5500个光引擎

发布时间:2026/9/25 20:42:18 来源:云帆数科 栏目:资讯中心
NPO近封装光学重构AI集群互联:从4.8万光模块到5500个光引擎
这几天圈子里被一个数字刷屏了5500个NPO替代4.8万个光模块华为用近封装光学重构AI互联。很多人第一反应是“数量少了9倍那盒子里到底发生了什么”。我可以直接给你答案这不只是光模块换了个形态而是AI集群整个光电互联架构换了条腿走路。NPONear Package Optics近封装光学把光引擎从面板上挪到了交换芯片的封装基板旁边光信号不必再在PCB、面板、模块之间来回折腾。这篇文章我会把NPO为什么能省下这么多光模块、省掉之后组网和运维会变成什么样、以及一线的光模块诊断工具该怎么用一次性讲透。做AI集群网络的朋友应该都有体会规模一上来光模块的数量和故障率是双高。你调一条光纤可能得先翻二十个模块状态。而NPO这种方案恰好把“模块”这个概念从你的运维流程里抹掉了一层。这篇内容适合两类人看一类是正在规划AI智算中心网络架构的网络工程师另一类是手里有不少Mellanox网卡、被光模块DDM数字诊断监控输出搞得头疼的运维。前者能看到方向后者能带走工具用法。1. AI集群到底卡在哪——从“电到光、光到电”的老路说起1.1 一张卡打完再找邻居AI网络里光模块为什么成了命根子AI训练的本质是成千上万张GPU/加速卡协同算同一个模型。单卡算完一批数据立刻要把中间结果送给下一层或对端卡。这决定了算力集群内部存在海量东西向流量。一个10万卡级别集群每卡按1个400G连接算全网需要几十万条物理链路而每条链路两端通常各有一个可插拔光模块。光模块在整个链路里的角色就是“电→光”和“光→电”的翻译官。问题在于这个翻译官现在越来越难做了。早期100G时代光模块的速率提升走的是调制码型的路线电接口从10G升级到25G模块内部还勉强能靠CMOS工艺搞定。到了400G/800G单通道电信号速率冲到112G甚至224G信号完整性问题开始成倍放大。PCB板材损耗、连接器串扰、模块金手指接触阻抗任何一个环节不干净眼图就一塌糊涂。很多实测项目里光模块插到交换机PCIe笼子之后SerDes跑不满速率、误码率压不下去最后查出来是PCB走线到面板这一段损耗超标——光模块本身明明没有任何问题。这种背景下光模块的数量和位置就变成了一层“甜蜜的负担”。没有它AI集群组不起来有它功耗、散热、信号劣化、故障维护全都要兜着。1.2 可插拔光模块的三大死穴功耗、空间、时延可插拔光模块在AI互联里横行霸道了很多年但架不住三个死穴。第一是功耗。一颗800G OSFP/QSFP-DD光模块的典型功耗是12到15W单台128端口交换机光是模块就要吃掉1.5到1.9千瓦。一个机柜塞4台交换机光模块功耗直接顶掉一台高配服务器的功率预算。这还没算交换芯片本身上千瓦的发热两者加在一起液冷都快压不住。第二是空间。面板的高度是有限的1U交换机最多放32到64个QSFP-DD笼子。端口密度提不上去就只能靠更高速率来弥补可速率越高模块功耗和信号完整性挑战越狠。800G时代已经有不少人开始喊“每端口功耗预算不够了”到1.6T时代可插拔的方案会非常吃力。第三是时延。传统可插拔结构信号从交换芯片出发走PCB、过连接器、进模块内部DSP再驱动激光器发光中间经过的物理节点很多。DSP的编解码和CDR恢复会引入纳秒级时延单看一次没啥可AI集群里数据要跨几十跳交换机累积起来对训练同步效率和分布式通信就有影响了。这三个死穴不是“忍一忍就过去”的小毛病它们直接决定AI集群能组多大、跑多快、省多少电。NPO的出现就是冲着这三个痛点去的。2. NPO解决的“最后一厘米”靠近芯片才是终极答案2.1 光引擎的位置从面板到基板NPO到底动了什么传统光模块在面板上信号要穿越整块PCB才能到交换芯片。NPO做的事情非常直观把光引擎Optical Engine挪到交换芯片的封装基板上和交换芯片做在同一个封装载板上电信号从交换芯片出口到光引擎的路径从原来的“分米级”缩短到“毫米级”。这跟人走路是一个道理你想让数据跑得快方案不是把路修宽而是把起点跟终点搬到隔壁。电信号在PCB高速铜箔上每走一厘米都有损耗和串扰走线越短信号质量越好、DSP纠错压力越小、功耗越低。NPO把“最后一厘米”的问题解决了光引擎吃到的电信号干净了对外连接直接就是光纤不再经过传统连接器。从架构图上看NPO交换机内部大概是这个逻辑交换芯片旁边放一排硅光引擎每个引擎负责4通道或者8通道的光信号收发然后通过光纤连到前面板MPO连接器再连到对端设备。光引擎本体和交换芯片之间用的是封装基板上的短距走线链路预算宽松SerDes速率更容易跑满。这件事对AI互联的直接影响是单机端口密度可以做得更大单端口的功耗预算也能降下来。我补充说明一点目前主流方案里“NPO”和“传统可插拔”并非完全二选一。很多设备是混合形态——面板上保留少量可插拔口用于对外互联和灵活性而盒内大部分高密度互连走NPO光引擎。所以5500个NPO替代4.8万个光模块并不是说可插拔光模块会立刻消失而是核心的高密度互联场景里被替代的那部分不必再占用面板空间和模块功耗。2.2 NPO、CPO、LPO三个容易混淆的名字一次讲清跟厂商交流的时候我发现很多朋友会把NPO、CPO、LPO放在一起聊然后越聊越糊涂。这里我按从“远”到“近”的集成度给你排个序。LPOLinear-drive Pluggable Optics线性驱动可插拔光模块其实还是在面板上的可插拔模块但它砍掉了模块内部的DSP信号直接线性直驱靠交换芯片侧的SerDes做均衡。优点是功耗比传统可插拔低缺点是链路预算变严对光模块和PCB要求更高。它本质上没有改变“模块在面板”这件事。CPOCo-Packaged Optics共封装光学是终极集成方案光引擎和交换芯片封装在同一个芯片封装里甚至在同一个基板上紧贴交换Die。它的优点是信号路径最短密度最高功耗最优缺点是制造良率挑战大光引擎一旦出问题整颗交换芯片跟着报废后期维护和返修难度极高。NPONear Package Optics近封装光学正好站在中间光引擎不是和交换芯片融合到一个Die里而是放在同一个封装基板或非常近的位置通过基板走线互联。光引擎坏了理论上还有机会单独更换不用整片交换芯片返厂。对比CPONPO把制造难度和可维护性平衡了一下这也是它能先于CPO规模落地的原因。所以你看5500个NPO替代4.8万个光模块本质是用“近封装”的集成度换掉了“面板可插拔”的灵活性。苹果从iPhone 7开始去掉3.5mm耳机孔遭人骂但后来整个行业都跟着做因为体验和空间收益摆在那里。NPO去掉可插拔光模块笼子逻辑是一样的空间收益和功耗收益太大了运维习惯上的“不习惯”可以慢慢调。3. 5500 vs 48000这组数字背后的架构重构3.1 4.8万个模块怎么来5500个NPO又怎么算有必要把数字拆开看看不然很多人会误读成“NPO一个顶九个光模块的能力”。实际上4.8万个可插拔光模块对应的是一个数量级庞大的AI集群。以常见的三层无阻塞组网GPU接入层、汇聚层、脊层来算每个GPU卡需要一条或多条网络链路每一跳的交换机侧和网卡侧都需要光模块。一万多张卡的集群全网含冗余链路光模块数量冲到4.8万并不夸张。NPO方案里交换机侧的光模块大量被板载光引擎替代。交换机不再需要一个笼子一个笼子地插模块而是出厂时板上就集成好了光引擎光纤直接预连接到面板MPO。这样一来单台交换机的模块相关故障点少了一大半面板留给维护人员的“可插拔口”锐减整个集群需要常备的模块库存量也随之下降。5500这个数字代表的就是板载光引擎或主互连端口的数量。这件事真正的价值不在“少买4万个模块”带来的硬件成本节省上而在整网稳定性。可插拔光模块是AI集群里故障率相对高的器件金手指氧化、连接器松动、高温老化、拔插过程中静电损伤都是运维头疼的问题。模块少了故障样本自然少链路可用性就上来了。加上NPO省下来的功耗可以转化成更多的GPU算力或者更少的制冷电费这笔账实际算下来比单纯省模块采购费要划算得多。3.2 盒式到背板式光纤走向、维护方式和故障模式全变了传统可插拔光模块的物理形态让运维人员习惯了“面板即界面”哪里坏了拔哪里换根光纤、换个模块几分钟搞定。NPO方案落地以后这个肌肉记忆得改。首先是光纤走向变了。过去是模块插在面板笼子里光纤从模块尾部出来走线架、走蜘蛛网线材管理。到NPO光纤是预接到交换机背板/前面板MPO座的你看到一个交换机端口里面连的可能是板上光引擎已经“钦定”好的某根光纤。这根光纤不能随便换它的另一头是焊接在板子上的光引擎而不是你能拆除的模块。其次是故障域变了。以前模块坏了故障域是一只模块换掉就恢复NPO时代光引擎坏了可能要整机更换或者返修故障域扩大到整台交换机。这就要求设备冗余设计和网络设计更扎实不能让单台交换机变成致命单点。对网络工程师来说设计组网时要多做一层“设备级冗余”的考量而不是靠修模块来兜底。再一个是故障表现变了。老传统模块故障常表现为光功率异常、DDM告警、模块不识别NPO的光引擎故障可能表现为设备日志里的SerDes误码上升、光引擎温度异常、链路反复训练失败。排障手段从拿光功率计怼模块变成了登录设备读引擎的健康状态。所以别以为技术演进是“把运维变简单”它只是把运维复杂度从物理层挪到了系统层。4. 和光模块有关的基础课单模多模、耦合、驱动电路4.1 多模短距离遇上高速率为什么NPO要用单模既然聊到光互联有几个热搜词绕不开单模和多模光模块。很多接触过接入网的朋友都熟多模模块便宜、用VCSEL激光器适合几百米短距离单模模块贵、用FP/DFB激光器适合几公里长距离。以前AI机房内部因为距离短大量用多模OM3/OM4/OM5配合SR4/SR8光模块成本友好。但速率一上来多模的日子就不好过了。多模光纤的色散和模式间串扰在112G/lane甚至224G/lane时代对眼图预算消耗很大VCSEL的调制带宽也快见顶。业界一边在推多模的“新调制”方案一边在往单模迁移。到了NPO这种高密度封装场景光引擎里的硅光芯片天然更适合单模工作硅光波导的尺寸和单模光纤的模式更匹配耦合效率更容易做高波分复用CWDM/LWDM也更顺手。简单说短距离多模这套“便宜大碗”的思路正在被高速率和高密度的趋势逼退。你现在去采购新设备能看到越来越多的800G/1.6T模块或光引擎是单模设计哪怕只跑20米的机柜内互联。这不是技术洁癖是物理规律逼出来的。4.2 耦合和驱动光引擎上硅光封装工艺决定良率与功耗热搜词里有“光模块耦合”和“光模块驱动电路”这两块在NPO方案里比传统模块更重要而且难的级别不是一个量级。传统光模块的耦合是激光器TO座或封装好的TOSA/ROSA与光纤插芯对准用主动耦合或者半自动耦合设备调位置对精度要求高但成熟度高。NPO光引擎是硅光芯片和激光器光源、光纤阵列FAU之间的耦合。硅光波导的模场直径特别小FAU里的一根光纤和波导对准哪怕偏个1-2微米插损就上去。这个耦合精度直接决定良率良率直接决定成本和可量产性。华为能把NPO推到规模部署说明在FAU加工和对准工艺上已经跨过了量产门槛。驱动电路方面传统模块里有独立的Driver芯片和TIA芯片负责把电信号抬到激光器需要的偏置电流和调制电流水平并把微弱的光电流放大。NPO光引擎则是把这些电路尽可能和硅光调制器、探测器集成到同一个模块里有的方案用无封装Transistor再做一级驱动电路复杂度高对供电和热设计压力大。激光器还怕温度飘移——NPO光引擎密集排列发热源集中在小小一块基板上散热路径设计不好波长会漂、功率会掉。这也是为什么NPO设备普遍要配更激进的散热方案。这些技术细节拿到实际项目里意义是你评估一个NPO设备供应商时不要只听“端口数、速率、功耗”这几个参数更要问良率、耦合工艺、FAU方案、激光器老化策略。这些藏在“黑盒”里的硬功夫才是决定设备稳定性的关键。5. 实操MLXLink诊断光模块和线缆的实战5.1 -m参数读取模块数字诊断监控DDM说了这么多架构层面的东西回到一线来点能直接上手用的。在Mellanox/NVIDIA网卡的Linux环境里MLXLink是排查光模块和线缆故障最趁手的工具。前提是先装好MFTMellanox Firmware Tools并保证mst服务在跑。拿到网卡设备名的方式很简单执行mst status输出里能看到类似mlx5_9这样的设备名。接下来读取光模块DDMmlxlink -d mlx5_9 -m输出会包含模块类型光模块还是铜缆、支持的速率、厂商OUI、PN、SN、以及一组关键监控值电压、模块温度、TX偏置电流、TX/RX光功率、Pre-FEC BER。这组数据就是光模块的“体检报告”。看参数有几个经验温度接近或超过70°C说明模块散热环境差优先排查风扇和风道路径。TX偏置电流Laser Bias明显上升但TX光功率没变化大概率是激光器老化这种模块虽然“还能用”但迟早出问题。RX光功率偏低但TX正常重点查对端、光纤、这端的接收端灵敏度。如果模块显示Fault状态且RX功率为-40dBm以下基本可以判断是光纤断了或对端没发光。Pre-FEC BER的数字直接反映了链路质量。好的短距链路通常BER在1e-6甚至更低如果看到1e-3量级说明链路已经高度劣化只是FEC还在硬扛。建议趁早处理别等业务报障。5.2 -c参数跑线缆与链路自检只看DDM还不够尤其遇到“模块识别正常但link起不来”的情况需要用线缆/链路测试功能。mlxlink -d mlx5_9 -c这个测试会读取线缆的类型、长度、通道数并对电口或光口的链路状态做检测。对于直连铜缆DAC/AEC它会读取线缆EEPROM里的信息判断是否有线缆兼容性问题。对于光模块它会尝试协商链路并对每个通道做检测。实际项目中cable测试最常见的用处是判“线缆到底是不是好的”。我曾经处理过一个挺诡异的故障IB链路每天固定凌晨闪断查了三天换模块换光纤都没用后来跑mlxlink -c发现某条通道的cable Equalization参数异常再一查是这根AOC线缆在机柜理线时被压出了“内伤”但外观根本看不出来。换线后彻底恢复。如果排查到这一步还是不行可以加码用mlxlink -d mlx5_9 -t做回环测试将链路在网卡内部做loopback判断故障是在网卡本身还是在外部的线缆/对端。这个顺序很重要先看模块健康再看线缆信息再跑回环能层层切开故障域不会一通乱查。5.3 真实排查流程示例和常见报错处理给你一套我常用的标准排查流程适合链路起不来或者误码高的场景mst status确认设备在线不在就查驱动和固件。mlxlink -d mlx5_9 -m看模块状态与DDM确认模块识别、温度、光功率。mlxlink -d mlx5_9 -c跑线缆自检确认线缆类型、长度和通道状态。dmesg | grep -i mlx5看有无SerDes或link training相关报错。用ethtool -m enp3s0如果用的是以太网口交叉对比读取同一模块的DDM排除工具层面读数的差异。如果以上都没结论最后一招是拿光功率计物理量一下光纤两端别怀疑工具直接测量最干脆。常见报错和对应处理方向的速查表现象可能原因排查方向模块不识别兼容性列表不匹配、金手指接触不良查HCL列表、重新插拔、换模块验证模块识别但link down线缆损坏、对端未up、端口配置错误跑-c测试、查对端、查端口配置RX光功率过低光纤脏污/断裂、对端TX异常清洁端面、用光功率计分段定位温度异常过高风道阻塞、散热失效、机柜温度高检查风扇、调整机柜气流Pre-FEC BER劣化信号完整性疲劳、模块老化、线缆受损换线缆/模块验证、结合-c测试定位就我的使用体验来说MLXLink的DDM读取比ethtool -m更细化尤其在InfiniBand场景里它几乎是唯一能给出完整链路质量视图的工具。别嫌命令行枯燥真到故障收敛的时候能救命的往往就是这些“土得掉渣”的日常操作。6. 从可插拔到近封装运维思维也要跟着升级6.1 光模块时代靠“插拔替换”NPO时代靠“整机维护”传统光模块的运维哲学可以概括为“哪里坏了换哪里”。这种哲学的建立基础是光模块是独立可更换的标准化部件。从SFP到QSFP-DD接口标准化让不同厂商模块可以互相替代库存备件、现场拔插、换模块验证这套流程早已刻在运维团队的肌肉记忆里。NPO要动这个根基光引擎不是标准可插拔件坏了不能现场换。这倒不完全是坏事——板载光引擎由于省去了连接器、金手指和可插拔接口损耗整体的平均无故障时间理论上更高。但真碰上故障修复模式可能变成整机替换、返厂维修或者干脆靠冗余链路先把流量绕开。所以运维团队要从“单点替换”思维转向“冗余设计”思维。网络上要保证设备级冗余出现光引擎故障时能不砸业务、顶住压力备件策略上要考虑储备整机或光引擎模组巡检策略上要把光引擎温度、偏置电流这些原来在模块侧看的数据纳入设备日常监控。这要求现有的监控系统能对接交换机/设备的内部传感器和日志接口而不是只盯着SNMP里的端口计数器。6.2 给想跟进NPO的人几条实操建议准备迎接NPO设备的团队我建议可以提前做四件事全是我踩过坑之后的经验。第一先把现网光模块的DDM数据收集机制跑通。现在很多团队还在用“出了问题再去查模块状态”的被动模式。趁光模块时代把DDM数据、日志、故障事件全部采集到统一监控平台形成一套“光链路健康档案”。这套数据资产未来NPO设备落地时照样能用只是数据源从“模块”变成了“引擎”。第二开一个实验环境跑NPO交换机的长稳测试别只信厂商的Demo。重点观察高负载下光引擎的温度、误码率变化以及长时间运行后的性能衰减。如果条件允许让厂商提供可拆解的故障演练明确出问题后是返板还是换机响应时间多久。第三在采购层面把“光引擎可替换性”列入硬性评估项。不同的NPO产品在引擎可维护性上差异很大有的能做到单引擎维护有的只能整机更换。别被“端口多、功耗低”的参数吸引维护模型和应用场景必须对齐否则上线三个月后哭的是运维。第四全员补“光路基础课”。NPO时代网络工程师不再直接拔光模块但要判断光纤、MPO连接器、板载引擎的状态。看懂PIC光子集成电路框图、理解FAU耦合损耗、知道单模光纤端面清洁流程这些“旧知识”反而变成了“新门槛”。团队里至少要有一个人能把光路讲明白。我在实际项目里的体会是无论NPO还是CPO智算集群的光互联迟早都要走向更高集成度。眼前真正重要的不是纠结名词而是把光模块时代该建的监控、该沉淀的排障方法、该培养的团队能力都修炼到位。架构可以换代但基本功不过期。先把MLXLink这类工具用熟把DDM数据看透等NPO铺到你的机房那天至少你不会觉得“光”变成了一个更陌生的东西。

相关推荐

Atlas 300V部署YOLO全流程:从环境准备到推理调优
Atlas 300V部署YOLO全流程:从环境准备到推理调优

在AI推理这块摸爬滚打久了,你会发现一个很有意思的现象:一聊到目标检测部署,大家脑子里第一反应就是CUDA、TensorRT、GPU显存够不够。但真到了工业现场、边缘机房、国产化项目里,硬件选型往往没那么free——这时候你会频繁听到一个… · 2026/9/25 20:41:59

Atlas 300V 24G部署YOLOv8实战:从CANN工具链到ACL推理全流程解析
Atlas 300V 24G部署YOLOv8实战:从CANN工具链到ACL推理全流程解析

最近后台好几个做安防和工业检测的朋友都在问同一件事:Atlas 300V 24G到底算不算运算加速卡?能不能拿来部署YOLO?先把结论说清楚:它当然是运算加速卡,而且就是专门干AI推理这活的。但它不是NVIDIA那种GPU,驱… · 2026/9/25 20:41:59

MoE为何比Dense更怕重复数据?机制与正则化调优指南
MoE为何比Dense更怕重复数据?机制与正则化调优指南

如果你同时拿同一份语料去训一个参数量相当的 Dense 模型和一个 MoE 模型,前期几乎看不出差别,甚至 MoE 在训练集上的 loss 掉得更快一些。但只要把语料里的重复文本比例调上去,局面很快就会反转:Dense 的验证集 loss 还在慢慢爬&… · 2026/9/25 20:41:59

【八八股股 | 第二篇】Java注解原理
【八八股股 | 第二篇】Java注解原理

Java 注解的运行原理:从定义到运行时读取 文章摘要 Java 注解用于把元数据附加到类、方法、字段等程序结构上。本文以 JDK 8 为基础,沿着一条连续的示例说明注解成员如何声明和赋值、RetentionPolicy 如何决定注解的保留范围、javac 如何把注解写入 Cl… · 2026/9/25 21:16:12

元器猫硬件笔记:P沟道MOSFET NCE4435沟槽工艺国产化替代与实测验证
元器猫硬件笔记:P沟道MOSFET NCE4435沟槽工艺国产化替代与实测验证

在智能硬件、消费电子电源保护电路设计中,进口MOSFET器件普遍存在交期不稳定、价格上浮、供应链受限等问题。在智能锁电源保护电路项目迭代中,原进口SI4435DY器件采购成本持续上涨、交付周期大幅延长,亟需一款可引脚兼容、性能对等的国产替代… · 2026/9/25 21:15:53

没有项目管理经验可以考PMP吗
没有项目管理经验可以考PMP吗

完全没有任何项目领导经验,不能报考 PMP;但不一定非要岗位叫 “项目经理”,只要你在项目里做过统筹、规划、协调、交付这类「领导 / 指导项目」的工作,就算有效经验。PMP 官方报考条件(国内现行)同时还需要… · 2026/9/25 21:15:34

docker-k8s安装实践记录
docker-k8s安装实践记录

一、在线安装docker、harbor 在线安装docker # 安装yum工具集 yum install -y yum-utils # 安装docker源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 更新yum缓存 yum makecache fast # 安装docker yum install -y docker-ce #… · 2026/9/25 21:15:22

2026年国内Claude API聚合平台实测:词元之河企业级稳定调用表现领跑
2026年国内Claude API聚合平台实测:词元之河企业级稳定调用表现领跑

2026年4月,一份覆盖国内15款主流Claude聚合平台的横向评测报告发布,从稳定可用性、数据安全、延迟性能、合规资质、成本透明五个维度展开,测试模型覆盖Claude-Opus-4.6、Sonnet-4.6、Haiku全系列,验证场景包括国内网络直连、接口兼… · 2026/9/25 21:14:51

AI大模型推理平台完整测评:七家主流聚合服务对比分析
AI大模型推理平台完整测评:七家主流聚合服务对比分析

2026年5月,主流AI大模型推理平台在模型覆盖度、定价、速度、合规四个维度上已形成明显分工。本文对七家主流聚合服务做一轮对比分析,帮助开发者按要广度、要速度、还是要稳定合规来匹配自己的需求。 总体格局与平台分工 OpenRouter聚合全球厂商模型&… · 2026/9/25 21:14:44

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码