简介:这份PDF面向5G网络优化工程师、核心网与无线维护人员,聚焦VoNR端到端高掉话这一典型疑难问题,提供从指标异常发现到根因定位、优化验证的完整排查思路。资源为单文件PDF,压缩包约1.81MB,内容以案例文档形式呈现,便于随身查阅与团队内部分享。案例以AA市VoNR掉话率异常升高为切入点,逐层下钻厂家、区县与信令流程,揭示诺基亚MME处理TAU与X2切换冲突、MME与华为MSC位置更新时延过长、4G TDD语数分层功率诱发二次切换等关键成因,并给出关闭语数分层后的指标评估数据。读者可借此掌握注册超时类掉话的过滤规则、SEQ与S1口信令关联分析方法、A4事件与频点PCI等参数解读技巧,以及跨厂家设备协同排障的框架。目前已有501人学习,适合需要提升VoNR语音质量与切换优化能力的中高级网优人员参考。
1. VoNR 高掉话为什么总在“最后一公里”翻车
VoNR 是 5G SA 架构下用 IMS 承载语音的最终形态,理论上接续更快、音质更清晰,但一线优化里最头疼的往往不是“打不通”,而是“说着说着就断了”。掉话率这个指标在 5G 网络优化里属于典型的“一票否决项”——用户感知极差,投诉率高,但排查起来又横跨无线、核心网、IMS 三大域,很多人拿到端到端信令就懵了。这篇笔记围绕一个真实的 VoNR 端到端高掉话排查案例展开,把从指标定义、信令分段、参数核查到根因定位的完整路径拆开讲。适合已经接触过 5G 网络优化、能看懂基本信令流程、但遇到跨域掉话问题时缺少系统方法的从业者。读完你至少能拿到一套可复现的排查顺序,而不是每次靠“玄学”猜。
2. 先搞清楚 VoNR 掉话到底断在哪一段
2.1 VoNR 端到端链路的分段拆解
VoNR 的语音链路比 VoLTE 更长,因为它完全跑在 5G SA 上,没有 LTE 锚点兜底。一条完整的 VoNR 通话要经过:UE → gNB(NR 空口)→ AMF/SMF(5G 核心网控制面)→ UPF(用户面)→ IMS 核心网(P-CSCF/S-CSCF/MTAS)→ 对端。任何一段出问题都表现为掉话,但根因完全不同。
我一般把这条链路分成四段来看:
| 分段 | 涉及网元 | 典型掉话特征 |
|---|---|---|
| 空口段 | UE、gNB | RRC 重建、无线链路失败、切换失败 |
| 核心网段 | AMF、SMF、UPF | PDU 会话释放、QoS Flow 异常 |
| IMS 段 | P-CSCF、S-CSCF、MTAS | SIP 超时、注册态丢失、媒体协商失败 |
| 对端/传输段 | 承载网、对端网络 | 单通、媒体面中断 |
排查的第一步不是抓包,而是先看掉话发生在通话的哪个阶段。是振铃前断、接通后几秒断、还是通话中随机断?这三种对应的排查方向完全不同。接通前断,重点看 IMS 注册和 SIP 信令;接通后立即断,重点看媒体面 QoS 和 UPF 配置;通话中随机断,重点看空口质量和切换。
2.2 从 KPI 到信令:掉话指标的拆解方法
很多人拿到“掉话率 3.2%”这种数字就直接去翻信令,效率很低。正确的做法是先做指标下钻。VoNR 掉话率在网管上通常有几个关联计数器:
- VoNR 呼叫建立成功率:如果建立成功率本身低,掉话率高可能是建立阶段遗留问题
- QoS Flow 释放原因:区分是正常释放、异常释放还是核心网发起释放
- RRC 连接异常释放次数:定位空口问题
- IMS 注册成功率:注册态不稳会导致通话中 SIP 超时
我一般会先拉一个时间维度的趋势图,看掉话是突发的还是持续的。突发性掉话往往和某个网元割接、参数变更、传输闪断相关;持续性掉话则更可能是配置类问题,比如定时器不匹配、QoS 参数配错。
提示:不要只看全网掉话率,要按 gNB、按小区、按 AMF 池分别聚合。很多时候全网指标正常,但某个 gNB 下掉话率飙到 10% 以上,这种局部问题反而更容易定位。
2.3 端到端信令跟踪的抓取点与关联方法
VoNR 端到端排查的核心手段是多接口信令关联。你需要同时在以下几个接口抓包:
- Uu 口:看空口 RRC 消息和 NAS 消息
- N1/N2 口:看 AMF 与 gNB 之间的 NGAP 消息
- N4 口:看 SMF 与 UPF 之间的 PFCP 会话管理
- Gm 口:看 UE 与 P-CSCF 之间的 SIP 信令
- ISC/Mw 口:看 IMS 内部 SIP 路由
实际操作中,最有效的方法是用一个统一的呼叫标识(比如 IMSI 或 SIP Call-ID)把各接口的包串起来。我通常先在 Gm 口找到异常掉话的 SIP BYE 或超时消息,拿到 Call-ID,再反查 N4 口的 PFCP 会话释放原因,最后回到 Uu 口看有没有 RRC 重建或 RLF。
# 用 tshark 按 IMSI 过滤多接口抓包文件并合并时间线 tshark -r uu_capture.pcap -Y "nas_5gs.mm.imsi == 460XXXXXXXXXXXX" -T fields -e frame.time -e _ws.col.Info > uu_timeline.txt tshark -r n4_capture.pcap -Y "pfcp.ies.imsi == 460XXXXXXXXXXXX" -T fields -e frame.time -e _ws.col.Info > n4_timeline.txt tshark -r gm_capture.pcap -Y "sip.Call-ID" -T fields -e frame.time -e sip.Call-ID -e _ws.col.Info > gm_timeline.txt # 合并后按时间排序,人工比对掉话时刻各接口的动作 cat uu_timeline.txt n4_timeline.txt gm_timeline.txt | sort -k1,2 > merged_timeline.txt这段脚本的作用是把三个接口的抓包按统一时间轴拉平。关键参数是-Y后面的显示过滤器,IMSI 要替换成实际测试卡的号码。合并后的时间线能让你一眼看出掉话瞬间哪个接口先出异常——比如 N4 口先发了 PFCP Session Deletion,然后 Gm 口才出现 SIP 超时,那根因大概率在核心网侧而不是 IMS 侧。
3. 高掉话排查的实操路径:从告警到根因
3.1 第一步:确认掉话的网元归属
拿到高掉话投诉或 KPI 异常后,第一步不是抓包,而是先做网元归属判断。具体做法是拉取该时段内所有异常释放的 QoS Flow 记录,按释放原因分类统计。
常见的释放原因码和对应方向:
| 释放原因 | 可能根因 | 排查方向 |
|---|---|---|
| 正常释放 | 用户主动挂断 | 排除 |
| 空口异常释放 | RLF、切换失败 | gNB 侧 |
| 核心网发起释放 | 策略触发、会话超时 | SMF/UPF |
| IMS 发起释放 | SIP 超时、注册态丢失 | P-CSCF/S-CSCF |
| 传输异常 | GTP-U 丢包、路径中断 | 承载网 |
如果异常释放集中在“核心网发起释放”,那就要重点看 SMF 的会话管理日志和 UPF 的 PFCP 会话状态。如果集中在“空口异常释放”,则优先排查 gNB 的切换参数和无线覆盖。
我一般会先用网管的“异常释放原因”计数器做一个 Top N 排序,找出占比最高的那一类,再针对性深入。这一步能把排查范围从“端到端”缩小到“某一段”,效率提升非常明显。
3.2 第二步:空口侧关键参数核查
空口是 VoNR 掉话的高发区,尤其是切换场景。VoNR 对时延和丢包比数据业务敏感得多,因为语音帧不能等。以下是我每次必查的空口参数:
切换相关参数:
A3 事件偏置:VoNR 场景下建议比数据业务更激进,让切换更早触发TTT(Time to Trigger):太长会导致切换不及时,太短会导致乒乓切换切换判决门限:要结合 VoNR 的 QoS Flow 5QI=1 的承载特性调整
无线链路监测参数:
RLF 定时器 T310:VoNR 场景下如果 T310 过长,UE 在弱覆盖下迟迟不触发重建,语音直接断N310/N311 计数器:控制 RLF 触发的灵敏度
# 通过 gNB 网管命令行查询当前切换参数配置(以常见厂商命令风格为例) # 查询 A3 事件偏置和 TTT get parameter gNBFunctionId=1,NRCellId=1,MeasConfig=A3 # 查询 RLF 相关定时器 get parameter gNBFunctionId=1,NRCellId=1,RLFConfig # 修改 T310 为 1000ms(VoNR 建议值,需根据实际场景验证) set parameter gNBFunctionId=1,NRCellId=1,RLFConfig,T310=1000参数调整的逻辑是:VoNR 的语音包对中断容忍度极低,T310 如果设成 2000ms 甚至更长,UE 在弱覆盖下会一直等,等到定时器超时再触发重建,这期间语音已经断了。把 T310 缩短到 1000ms 左右,能让 UE 更快触发重建,虽然会增加一些不必要的重建次数,但对语音连续性更有利。TTT 同理,VoNR 场景下我一般会从默认的 320ms 降到 160ms 甚至 128ms,让切换更果断。
注意:这些参数调整必须结合路测验证,不能只看 KPI。缩短 TTT 可能导致乒乓切换增加,反而恶化掉话。建议先在单站或单簇验证,确认掉话率下降且切换成功率没有明显恶化后再推广。
3.3 第三步:核心网与 IMS 侧定时器对齐
如果空口参数没问题,掉话仍然高,那就要往核心网和 IMS 侧查。VoNR 掉话里有一类非常隐蔽的问题:定时器不匹配。比如:
- AMF 的隐式去注册定时器与UE 的周期性注册定时器不匹配
- SMF 的 PDU 会话空闲定时器过短,通话中会话被释放
- P-CSCF 的 SIP 会话定时器与MTAS 的会话刷新定时器不一致
这类问题的典型现象是:通话进行到某个固定时长(比如 30 秒、60 秒)就断,非常规律。如果你看到掉话时长分布集中在某个值附近,基本可以锁定是定时器问题。
排查方法是抓取 N1 口的 NAS 消息和 Gm 口的 SIP 消息,对比注册更新和会话刷新的时间间隔。我遇到过一例:SMF 的 PDU 会话空闲定时器设成了 30 秒,但 VoNR 的 SIP 会话刷新周期是 60 秒,结果每次通话到 30 秒时 UPF 就把会话释放了,语音直接断。把 SMF 定时器改成 120 秒后问题消失。
# 在 SMF 侧查询 PDU 会话空闲定时器配置 # 常见命令风格:查询 SMF 的会话管理参数 get smf-config session-idle-timer # 修改为 120 秒 set smf-config session-idle-timer=120 # 在 P-CSCF 侧查询 SIP 会话刷新定时器 get p-cscf-config sip-session-refresh-timer # 确保 P-CSCF 的刷新定时器小于 SMF 的空闲定时器这里的核心原则是:IMS 侧的 SIP 会话刷新周期必须小于核心网侧 PDU 会话的空闲释放定时器。否则核心网会在 IMS 还没刷新之前就把承载释放了,语音必断。一般建议 SMF 空闲定时器至少是 SIP 刷新周期的 2 倍。
3.4 第四步:媒体面 QoS 与 UPF 配置核查
媒体面问题导致的掉话往往表现为“单通”或“无声后断话”。VoNR 的语音承载是 5QI=1 的 GBR 承载,对丢包和时延有严格要求。如果 UPF 的 QoS 配置有问题,比如 GBR 没生效、QoS Flow 映射错误,语音包会被丢弃或延迟过大,最终触发 IMS 侧的超时释放。
必查项:
- 5QI=1 的 QoS 参数:GBR、MBR、包延迟预算是否配置正确
- UPF 的 QoS 执行开关:有些场景下 UPF 的 QoS 执行没打开,GBR 形同虚设
- N3/N9 接口的 DSCP 标记:语音包的优先级标记是否正确,传输网是否按标记调度
- UPF 的 PFCP 会话日志:看有没有 QoS Flow 异常释放的记录
我一般会在 UPF 侧抓 N4 口的 PFCP 包,重点看 Session Establishment 和 Session Modification 消息里的 QoS 参数。如果发现 5QI=1 的 QFI 对应的 GBR 是 0,那基本可以确认是 QoS 配置问题。
4. 排查中容易翻车的几个坑
4.1 坑一:只看掉话率不看掉话时长分布
现象:掉话率 2.8%,但排查了很久找不到规律。
原因:掉话时长分布里藏着关键信息。如果掉话集中在通话前 5 秒,那是建立阶段问题;如果集中在 30 秒或 60 秒,那是定时器问题;如果随机分布,那更可能是空口覆盖或切换问题。很多人只看总数,忽略了时长维度。
解决:拉取掉话时长分布直方图,按 5 秒、10 秒、30 秒、60 秒、120 秒分桶统计。规律一旦出来,排查方向立刻清晰。
4.2 坑二:空口参数改了但没做单站验证
现象:调整了 TTT 和 T310 后,全网掉话率反而上升。
原因:参数调整没有经过单站或单簇验证,直接全网推送。不同场景(密集城区、郊区、高铁)对切换参数的要求完全不同,一套参数打天下必然翻车。
解决:任何空口参数调整都必须先在 1-3 个站验证,观察至少 24 小时,确认掉话率和切换成功率都达标后再分批推广。我一般会先改一个簇,观察一周,再决定是否扩大。
4.3 坑三:IMS 侧 SIP 超时被误判为空口问题
现象:掉话信令里看到 RRC 重建,以为是空口问题,查了很久没结果。
原因:IMS 侧的 SIP 超时会导致 MTAS 发起 BYE,UE 收到 BYE 后可能触发 RRC 重建或释放。表面看是空口异常,实际根因在 IMS。如果只看 Uu 口信令,很容易被误导。
解决:掉话排查必须多接口关联。看到 RRC 异常释放时,一定要反查 Gm 口有没有对应的 SIP 消息。如果 SIP BYE 先于 RRC 释放,那根因在 IMS 侧。
4.4 坑四:UPF 的 QoS 执行开关没打开
现象:5QI=1 的 GBR 参数配置正确,但语音质量仍然差,掉话率高。
原因:UPF 的 QoS 执行功能默认可能是关闭的,配置了 GBR 但实际不生效。语音包和普通数据包一样被尽力转发,拥塞时直接丢包。
解决:在 UPF 侧确认 QoS 执行开关状态,确保 GBR 承载的包被正确调度。同时检查 N3 接口的 DSCP 标记,确保传输网能识别语音包的优先级。
4.5 坑五:测试卡和商用卡行为不一致
现象:测试卡验证时掉话率正常,商用后掉话率飙升。
原因:测试卡的签约数据、IMS 注册策略、QoS 授权可能和商用卡不同。比如测试卡可能签了更高的 GBR,或者 IMS 侧对测试卡有特殊处理。
解决:最终验证必须用商用卡,且要覆盖不同套餐类型。测试卡的数据只能作为参考,不能作为最终结论。
5. 用自动化脚本把掉话排查周期从三天压到半天
前面讲的排查路径,如果全靠人工翻信令,一个案例至少两三天。我后来把这套流程做成了半自动化脚本,核心思路是:自动拉取多接口数据 → 按 IMSI 关联 → 按掉话时长分类 → 输出可疑根因排序。
import pandas as pd from datetime import datetime, timedelta # 读取各接口的异常释放记录(实际使用时替换为网管 API 或 CSV 导出) uu_release = pd.read_csv("uu_abnormal_release.csv") n4_release = pd.read_csv("n4_session_release.csv") gm_release = pd.read_csv("gm_sip_release.csv") # 统一时间格式 for df in [uu_release, n4_release, gm_release]: df["timestamp"] = pd.to_datetime(df["timestamp"]) # 按 IMSI 关联,找出同一通话在各接口的释放时间 merged = uu_release.merge(n4_release, on="imsi", suffixes=("_uu", "_n4")) merged = merged.merge(gm_release, on="imsi", suffixes=("", "_gm")) # 计算掉话时长(从接通到释放) merged["call_duration"] = (merged["timestamp"] - merged["answer_time"]).dt.total_seconds() # 按时长分桶 bins = [0, 5, 10, 30, 60, 120, 300, 9999] labels = ["0-5s", "5-10s", "10-30s", "30-60s", "60-120s", "120-300s", "300s+"] merged["duration_bucket"] = pd.cut(merged["call_duration"], bins=bins, labels=labels) # 统计各时长段的掉话占比 bucket_stats = merged.groupby("duration_bucket").size().reset_index(name="count") bucket_stats["ratio"] = bucket_stats["count"] / bucket_stats["count"].sum() # 判断根因方向 def guess_root_cause(row): if row["duration_bucket"] in ["0-5s", "5-10s"]: return "建立阶段问题:查 IMS 注册和 SIP 信令" elif row["duration_bucket"] in ["30-60s", "60-120s"]: return "定时器问题:查 SMF 空闲定时器和 SIP 刷新周期" elif row["duration_bucket"] == "300s+": return "空口覆盖或切换问题:查 RLF 和切换参数" else: return "需进一步关联信令分析" merged["root_cause_hint"] = merged.apply(guess_root_cause, axis=1) # 输出可疑根因排序 result = merged.groupby("root_cause_hint").size().sort_values(ascending=False) print(result) print("\n掉话时长分布:") print(bucket_stats)这段脚本的关键逻辑是:用掉话时长分布来反推根因方向。0-5 秒断话,大概率是 IMS 注册或 SIP 建立阶段的问题;30-60 秒断话,高度怀疑定时器不匹配;300 秒以上断话,更可能是空口覆盖或切换导致。脚本输出的root_cause_hint能帮你快速缩小排查范围,不用一上来就翻全量信令。
参数说明:bins的分桶边界可以根据实际网络调整,比如如果你的网络里定时器问题是 45 秒触发的,就把 30-60 秒这个桶再细分。answer_time字段需要从 CDR 或信令里提取接通时刻,如果拿不到,可以用 SIP 200 OK 的时间代替。
我现在的习惯是:每次拿到高掉话投诉,先跑一遍这个脚本,十分钟内拿到根因方向排序,然后再针对性抓包验证。比起以前盲目翻信令,效率提升非常明显。这套方法不复杂,但关键是坚持先做指标下钻再做信令关联,别一上来就扎进包海里。希望帮到你。
本文还有配套的精品资源,点击获取