概述:VoNR试商用局未接通率莫名抬升、NRF注册偶发超时、政企专线“网页只开一半”——三路看似不相干的现象,最后竟然指向同一个根因:一次回传扩容割接漏配了MTU,叠加防火墙误伤ICMP,构成了教科书级的PMTUD黑洞。本文以一线真实故障(已脱敏改编)为主线,完整还原38小时的排查路径,讲透MTU/MSS/PMTUD的原理账本,并给出5G时代四种处置方案的选型建议。本文回答的问题是:为什么“ping得通、网页打不开”,以及如何把MTU问题从排查噩梦变成割接清单上的固定动作。
那天早上九点二十,省公司网管的大屏上,VoNR试商用局的未接通率曲线开始抬头,从0.3%左右爬到了1.8%。起初没人当回事——试商用局嘛,用户少、话务模型怪,波动是常态。
但到了下午,另外两路异常凑齐了:一是政企专线的投诉工单突然多起来,用户反馈高度一致——“网页能打开一半,图片刷不出来,视频一直转圈”;二是核心网侧的运维同事发现,新割接的某个NF向NRF的注册请求偶发超时重试,日志里整段整段的HTTP2 GOAWAY和重连记录。
这三个现象分布在无线、传输、核心网三个专业域,按传统分工要开三个问题单,分给三拨人。但干过十几年运维的人都有一种直觉:当“小业务正常、大业务异常”这个模式同时出现在多个专业域时,八成是承载网出问题了。无线故障不会同时让政企专线的网页开一半,核心网软件问题也不会挑包的大小下手。
这个“怪病”的典型症状,后面被同事们戏称为“半张网页综合症”:TCP握手能成,小包请求能通,凡是需要连续传输大数据量的操作——加载图片、TLS协商大证书链、SIP大消息、NFProfile大JSON——全都卡死。这是MTU黑洞最经典的脸谱。
先交代完整时间线,再展开过程。
timeline
title 38小时故障处置时间线
section 第一天
09:20 : VoNR未接通率抬升至1.8
14:00 : 政企专线投诉集中涌入
19:30 : 怀疑NF负荷与license 全部排除
section 第二天
02:10 : 服务器侧抓包发现大包反复重传
05:40 : traceroute逐跳定位路径MTU骤降
11:00 : 确认割接漏配MTU叠加ICMP被过滤
16:30 : MSS钳位与放行ICMP生效
section 第三天
00:30 : 夜间窗口恢复链路jumbo配置
08:00 : 指标回落基线 转入复盘
值得一提的是第一天的19:30。当时值班团队把方向押在了“NF负荷高、license不足”上,还为此紧急申请了扩容审批——方向错了,动作越快越浪费。这个弯路在后面的“复盘”一节里要重点讲。
第一步:话统分析,排除无线侧。VoNR未接通的话单原因值分布很散,没有集中在某个RRC释放原因或某个基站簇上。CQT(呼叫质量测试)在市区各点位复测,无线信号满格,切换正常。如果问题在空口,CQT不可能全身而退。无线侧出局的判断做得很干脆。
第二步:信令跟踪,找到“中断点”。在IMS核心侧开SIP信令跟踪,对比成功呼叫与失败呼叫的时序,发现失败的呼叫普遍卡在同一个位置:INVITE收到183之后,本应到来的UPDATE/180消息迟迟不见,主叫侧等到超时放音。同样,5GC侧跟踪NRF接口,超时的注册请求清一色是NFProfile体积大的那类(订阅了多个业务特性、携带完整能力列表的NF),小体量的心跳和查询类请求从未超时。
到这里,“挑包大小下手”的特征已经非常明显了。但当时我们已经带着错误方向跑了半天,这个信号被淹在了各种负荷曲线里。
第三步:抓包,拿到铁证。凌晨两点,在一台NF的服务器侧做了镜像抓包。Wireshark里打开的那一刻,答案就写在脸上:同一批TCP报文,同一序列段,反复重传;每个重传报文的IP头里DF(Don't Fragment)位全部置1;而网卡上没有任何ICMP "fragmentation needed"报文进来。
这就是教科书上的PMTUD黑洞:发送端按MTU 1500(其实是1348字节这种更小的有效负载,因为SBA接口还有TLS封装)发大包,路径上某跳的MTU小于报文长度,路由器依规丢包并应回ICMP告知——但这个ICMP被中间的防火墙清洗策略吞了。发送端收不到反馈,只能依赖超时重传,重传的还是同样大小的大包,于是无限循环,直到应用层超时放弃。
第四步:ping验证,量化边界。在同一台服务器上向对端做分段长度测试:ping -M do -s 1200通,-s 1300通,-s 1350开始丢,-s 1400全丢。把边界再往细里收,路径有效MTU大约卡在1340字节附近。这个数字很有信息量:如果链路MTU是标准的1500,正常PMTUD会探测到1500并放行;卡在1340,说明路径上有一段链路的MTU被配成了更小的值,或者隧道封装吃掉了余量。
第五步:逐跳定位,锁定期末考试的那一跳。用traceroute --mtu(Linux下tracepath也行)逐跳探测,路径MTU在第七跳从1500直接掉到1300出头。第七跳对应的正是上周新割接入网的回传汇聚环——两台汇聚设备间的某条链路。
第六步:比对割接记录,水落石出。上传输网管核查配置:一期工程时,这张回传网全链路按jumbo 9000字节设计(为的是给N3接口的GTP-U封装留足余量);上周扩容,新增链路的割接脚本模板里没有携带MTU配置,端口落成了默认1500。更糟的是,为这张承载网做安全加固时,防火墙策略把ICMP全协议进了清洗黑名单——PMTUD赖以工作的“退信”通道,被我们自己堵死了。
两个独立的小疏漏,单独看都不致命;叠在一起,就是一场跨三个专业域的怪病。
flowchart TD
A["业务异常 小包通大包断"] --> B["话统分析 无线侧无特征"]
B --> C["信令跟踪 中断于大消息"]
C --> D{"镜像抓包看重传"}
D -->|DF置位反复重传无ICMP反馈| E["确认PMTUD黑洞"]
D -->|无规律随机丢包| F["转拥塞与硬件排查"]
E --> G["分段ping量化边界"]
G --> H["traceroute逐跳定位"]
H --> I["第七跳路径MTU骤降"]
I --> J["比对割接记录 汇聚链路漏配jumbo"]
J --> K["MSS钳位加放行ICMP frag needed"]
K --> L["夜间窗口恢复链路MTU 指标回落"]
把原理讲透,才能举一反三。
MTU与分片的基本盘。每条链路都有MTU(最大传输单元),以太网默认1500字节。IP报文超长时,IPv4路由器可以分片,但这个行为代价高且被普遍嫌弃,所以发送端通常直接把IP头的DF位置1,声明“别给我分片,超了就退回来告诉我”。这就是路径MTU发现(PMTUD,RFC 1191定义)的运行前提:发送端先按乐观值发大包,被丢之后靠路由器回的ICMP "fragmentation needed and DF set"(类型3代码4)得知路径上最小的MTU,再收着发。IPv6更进一步:路由器压根不分片,超长一律丢弃并回ICMPv6 Packet Too Big(类型2),PMTUD从“可选优化”变成了“生存必需”。
黑洞是怎么形成的。PMTUD是一个依赖“退信”的协议。它假设那个ICMP报文能穿过整条路径回到发送端。现实中有两堵墙专拆这个假设:一是安全设备把ICMP当成侦察探针统一过滤——早期的安全教条确实建议禁ICMP,很多单位的防火墙策略至今还留着这条祖训;二是NAT、负载均衡等中间盒子对ICMP的错误处理。RFC 2923专门给这个病起了名字:PMTUD Black Hole(PMTUD黑洞)。它的临床表现极其固定:TCP握手(小包)正常,数据传输(满MTU的包)卡死——正是我们看到的“半张网页”。
为什么握手能过、数据过不去。TCP三次握手报文只有几十字节,SIP的INVITE如果没带大SDP也不大。只有当应用真正开始灌数据——TLS证书链(几KB)、NFProfile(几KB的JSON)、带完整媒体协商的SIP消息——TCP分段才会顶到MSS的上限,也就是接近路径MTU。小包走的通的路径,大包走一步就被掐,发送端还在傻乎乎地全量重传。Wireshark里那句经典的TCP Previous segment not captured加一串TCP Retransmission,就是黑洞现场的照片。
彻底解法在端侧。业界后来给出了不依赖ICMP的方案:包层路径MTU发现(PLPMTUD,RFC 4821)——发送端主动用递增大小的探测包试探,靠ACK确认来推断路径MTU,ICMP爱来不来。Linux内核的tcp_mtu_probing开关就是它的落地。QUIC更是从设计上就采用了DPLPMTUD(RFC 8899),这也是QUIC在复杂网络里“比TCP皮实”的原因之一。Cloudflare的工程师在一篇广为流传的博客里详细推演过PMTUD在真实互联网上的种种翻车现场,结论和我们在通信网里踩的坑完全一致——互联网和电信网,在MTU这条暗礁上是同一个姿势搁浅的。
为什么5G时代MTU问题更凶?因为封装层数更多了。用户的一个1500字节报文,从UE到UPF,外面要套好几层“信封”,每层都吃掉几十字节。不预留余量,内层1500的报文出门就超长。
| 场景 | 封装栈构成 | 附加开销(约) | 内层1500所需链路MTU |
|---|---|---|---|
| S1-U(4G用户面,IPv4) | 外层IP 20 + UDP 8 + GTP-U 8 | 36字节 | ≥1536 |
| N3(5G用户面,IPv4+QFI) | 外层IP 20 + UDP 8 + GTP-U 8 + 扩展头4 | 40字节 | ≥1540 |
| N3(5G用户面,IPv6) | 外层IPv6 40 + UDP 8 + GTP-U 8 + 扩展头4 | 60字节 | ≥1560 |
| IPSec隧道(传输加密) | 外层IP + ESP头 + IV + 完整性校验值 | 约70~100字节 | ≥1570~1600 |
| VXLAN(数据中心互联) | 外层以太网14 + IP 20 + UDP 8 + VXLAN 8 | 50字节 | ≥1550 |
| GRE隧道 | 外层IP 20 + GRE头4起 | 24字节起 | ≥1524 |
注:GTP-U封装构成依据3GPP TS 29.281,开销随扩展头与外层IP版本变化;IPSec开销随算法与对齐方式浮动。上表为设计用估算值,工程上以实测为准;标准允许多种实现,具体行为以各厂家官方文档为准。
把账算清楚就明白了:一张按1500设计的回传网,承载5G用户面天生就是错配。这就是为什么正经的5G承载设计都会把链路MTU抬到jumbo(常见9000),或者强制把用户侧MTU压到1458甚至更低。我们这次故障的一期设计其实是懂行的——全网jumbo 9000;坏就坏在扩容割接的脚本模板没把这个设计意图继承下去。
回看我们的案例,路径有效MTU卡在1340左右:1500的链路MTU,减去该段叠加的传输封装,再减去安全设备的处理余量,数字完全对得上。
现场按“先止血、后根治”的两步走:白天下发临时措施保住指标,凌晨窗口做根治割接。过程中把业界常用的四种处置方案摆在一起比了一轮:
| 方案 | 具体做法 | 优点 | 局限 | 适用场景 |
|---|---|---|---|---|
| 修复链路MTU(根治) | 汇聚链路恢复jumbo配置,全网对齐 | 一劳永逸,吞吐不受损 | 需要割接窗口,涉及传输专业 | 有窗口期的计划内整改 |
| 放行ICMP 3/4与ICMPv6类型2 | 防火墙策略放行这两类报文 | 让PMTUD恢复工作,改动极小 | 依赖中间设备都守规矩,IPv4下有伪造攻击面需限速 | 任何场景都应做的基础动作 |
| MSS钳位 | 在隧道端点或防火墙把SYN里的MSS改小 | 立竿见影,TCP业务立刻恢复 | 只管TCP;UDP业务(DNS大响应、QUIC、部分信令)不受益 | 应急止血首选 |
| 降低用户侧MTU | UE/企业网关侧MTU压到1400~1458 | 简单,覆盖所有协议 | 略降有效吞吐,无法覆盖网内自生大包 | 封闭场景或作为兜底 |
现场的选择:白天上了MSS钳位加防火墙放行"fragmentation needed",政企专线投诉半小时内消失,VoNR未接通率回落到0.4%;凌晨窗口把汇聚链路MTU恢复为9000并全网复核,周一话统确认所有指标回到基线。那台出问题的NF对NRF的注册超时,在临时措施生效后自动消失——它从头到尾就不是一个核心网问题。
值得一提的是长期机制:核心网服务器侧统一开启了tcp_mtu_probing,让SBA接口的HTTP/2长连接具备不依赖ICMP的自愈能力;QUIC类业务天然受益于RFC 8899的探测机制。端侧多一层保险,网侧少半夜电话。
这单故障的根因没有任何高深之处——两个低级疏漏的乘积。但它暴露的管理漏洞,比技术漏洞更值得写下来。
其一,割接脚本必须有“设计意图继承”检查。一期的jumbo设计写在可研报告里,但扩容割接模板是从别的项目拷来的,MTU这条配置在模板里根本不存在。整改动作很朴素:把“链路MTU与设计文件一致”写进割接检查清单的硬性项,割接脚本报审时必须附MTU/VLAN/QoS三项与设计文件的比对截图。设计意图只存在于文档里,等于不存在。
其二,验收测试必须包含大包测试。这次割接后的验收只测了连通性(ping默认32字节小包)和业务抽测(恰好都是小包业务),大包路径从未被验证。整改后,割接验收基线里固定加入两条:分段ping测试到链路MTU上限、iperf大帧打流十分钟。小包通不等于通,MTU测试通过才算通。
其三,跨专业故障要按“特征”而不是“专业域”分派。这次故障的第一天被拆给了三个专业,各自排查各自的,没人把“挑包大小”这个共同特征拼出来。后续在故障管理流程里加了一条:跨专业疑难故障先开半小时合诊会,先归纳症状模式,再分派方向。“小包通大包断”这种特征一旦被点破,老运维五分钟就能想到MTU——难的不是技术,是没人把拼图凑到一起。
其四,安全加固要有“协议功能影响评估”。当年一刀切封ICMP的策略,让PMTUD这个依赖退信的机制全网裸奔。安全策略调整也应过技术评估:封ICMP echo可以理解,但"fragmentation needed"和ICMPv6 Packet Too Big是维系路径MTU发现的生命线,限速放行才是正解。这类知识点,值得写进每个传输与数通工程师的入职第一课。
在Cloudflare那篇讲PMTUD的博客里,作者最后说:这类问题的麻烦不在于难,而在于它伪装成各种不相干的症状,让你在错误的层上耗费时间。通信网又额外加了一层封装的复杂度——从S1-U到N3,从IPSec到VXLAN,每加一层信封,MTU的账就要重算一遍。运维十八年,我见过的“灵异故障”十有八九最后都落在了最朴素的物理约束上:时钟、接地、线序、MTU。它们不性感,不前沿,但每一次轻视它们,它们都会在最要命的夜里找回来。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
