ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

5G网络国际长途呼叫失败排查:IMS路由与VoNR回落实战解析

5G网络国际长途呼叫失败排查:IMS路由与VoNR回落实战解析 简介一份围绕“5G网络中的国际长途与漫游实现”展开的技术文档重点面向通信工程师、5G核心网运维人员及高校网络专业学生解决读者对5G漫游协议、架构交互及语音服务流程的理解问题。文档从漫游引入目的与运营商间连接方式出发解释了直接连接与国际枢纽连接的差别随后详细叙述5GS与EPS互通漫游架构中UE注册、AMF查询NRF、AUSF认证、UDM数据管理以及SEPP安全保护代理等关键组件的分工。语音部分比较了EPS回退和VoNR两种漫游语音方案指出漫游时VoNR可减少额外呼叫设置延迟紧急服务则涵盖本地提供和回退到EPS的机制。整份资料以单个docx文档呈现大小约291KB层次分明、名词解释到位适合作为5G漫游知识的系统入门或查漏补缺。目前已有两百二十人学习是理解国际长途背后网络原理的实用参考。1. 5G网络里打通国际长途先从一次“拨不出去”的复现说起你拿到一张5G卡数据飞快但拨一个49号码时听筒里只有“嘟”两秒就断退回4G反而能通。这不是手机玄学而是5G语音回退和IMS路由没有对齐。今天要拆的这份docx是从网元配置到号码路由把“5G网络下拨国际长途失败”逐步拆解开来的实战记录。适合核心网工程师、5G运维和对接VoNR的企业通信人员照着配置能复现也能解释为什么部分5G SA覆盖下国际长途会翻车。2. 原理先行IMS网元分工和VoNR回落机制决定国际路由是否通国际长途在5G网络里能不能打通决定性因素不是“信号好”而是核心网里IMS这条语音链路的完整性。很多人只盯着空口的RSRP和SINR忽略5G SA架构已经拆分出独立的语音通道。要理解怎么配置先得知道这条路线上每个网元到底在干什么。2.1 谁在替你“拨号”P-CSCF、S-CSCF与AS的职责边界5G注册后手机和网络之间除了数据PDU会话还会建立一条承载SIP信令的IMS会话。这条会话的入口是P-CSCF接纳用户附着时的注册请求转发呼叫信令。可以把它理解成“接入门卫”它知道你的手机从哪个基站进核心网也知道你注册的SPI安全参数。往上一层是S-CSCF它负责真正的呼叫状态机检查用户是否注册、校验业务权限、把符合条件的消息触发给应用服务器。S-CSCF存的是用户签约数据和会话路由表比如国际长途用户有没有被标记为“允许拨打”就靠S-CSCF调签约数据来判断。再往后是AS国际长途业务的控制往往挂在AS上做对号码做前缀分析、去掉国际长途中转前缀、改写被叫号码甚至做反欺诈限制。这三级分工决定了配置顺序先保证P-CSCF可达再检查S-CSCF订单权限最后确认AS是否覆盖你拨打的号段。我当时复现这份docx时第一反应是抓SIP信令但看到INVITE消息没有触发到AS才意识到问题出在S-CSCF没加载对应iFC规则。2.2 号码与协议从E.164到SIP URI国际长途如何被识别和转发国际长途在IMS核心网里的启动条件很明确手机发出的INVITE消息Request-URI要么是tel:49...要么是sip:49...其中的和后续国家码是E.164格式的完整号码。这个格式和国内普号不一样国内号码通常是tel:8613912345678主叫号码不带头显的国家码而国际长途必须把国家码放在最前面。网元处理时有一个关键点号码一旦变成49这种格式就会被识别为“出局国际呼叫”S-CSCF会把消息交给国际长途AS做号码规划。AS会根据运营商自己的国际转接规则把49映射成00或810这样的国际接入码再通过SIP-I封装发往国际转接局。也就是说用户在手机输入49网络内部往往需要再转换成运营商约定的前缀这个转换逻辑如果配置成“跳过”呼叫就会停在本地域永远出不了局。协议层面还要留意SIP版本和SDP编辑码。国际长途常涉及跨运营商互通对方不一定支持5G新通话新增的编解码。如果INVITE里只带了AMR-WB 24.4kbps而对方网只支持AMR-NB 12.2kbpsSDP协商就会失败。所以配置国际呼叫时要给主叫侧同时配置AMR-NB和AMR-WB通过过渡编解码保证互通。2.3 没有VoNR时的出路EPS Fallback与VoLTE的承接链路现在5G覆盖并不等于VoNR覆盖。手机在5G SA网络下发起语音呼叫如果当前基站没有配置VoNR承载核心网会触发EPS Fallback把用户回落至4G LTE再用VoLTE承载这次语音。这个链路里容易出现一个翻车点EPS Fallback指令是核心网通过重定向或切换触发的但国际长途的SIP信令已经提前发送如果移动性流程还没完成SIP消息就已经出局了媒体面就可能在4G侧建立不出来。反过来如果手机在5G覆盖边缘RSRP已经低于-125 dBm但5G基站还没真正失去连接EPS Fallback可能执行得慢用户听的是长达十来秒的“嘟嘟”等待音最后要么重拨要么网络超时。所以我在复现文档中的建议是处理国际长途类问题先看OMC网管上该基站的VoNR状态再决定是不是要人工锁用LTE来验证。这不是治本但能快速隔离是空口问题还是核心网问题。2.4 表格核心网语音网元的关键职责与常见故障面网元职责国际长途相关故障面P-CSCF注册接入、SIP安全、信令转发P-CSCF地址未下发给UE注册失败S-CSCF会话状态、业务触发、签约校验iFC规则缺失呼叫无法触发ASAS号码改写、路由决策、补充业务国际前缀配置错误号码被误区MGCF与PSTN互通的信令媒体转换无对应中继呼叫进入死端SMF分配PDU会话地址、切片路由DNN禁止语音PDU无法建IMS会话这张表是我按这份docx里整理的故障逻辑中提炼出来的。实际排查时不用每个网元都翻先检查P-CSCF到UE的通路再看S-CSCF有没有把INVITE发出去基本能定位掉70%的问题。3. 落地步骤号码规划、APN与会话参数的一次完整复现原理清楚了下面就是动手。这份docx记录的是一套“从零配置到验证”的流程我用一个测试环境复现了一遍下面每个步骤都保留了当时调通的参数。注意不同厂商的网元接口有差异如果你手里是华为5G网管和Open5GS这类开源项目的操作路径不一样但配置思想是共同的差异点上我会特别注明。3.1 第一步为国际长途规划E.164号码段与主叫标识首先你得定义哪些号码是国际长途。核心网一侧通常配置一张号码前缀表把国际拨号标识映射到目的运营商。我在这份docx里见到的通用配置是# 号码前缀路由表示例伪代码存放在NRF/UDM的APP数据中 - country_codes: [49, 44, 1] access_prefix: 00 national_prefix: 0 route_label: INTL_LONG_HAUL_AS逻辑说明access_prefix是运营商约定的国际接入前缀德国、英国、美国对应的国家码分别是49、44、1。这里把“00”配置为国际接入码意味着用户拨49时AS会改写成0049再出局。national_prefix用于部分国家的国内长途格式转换但国际长途出局不建议加国内前缀加错会被对端当成非法号码。参数说明country_codes这块必须按运营商国际长途业务的白名单来不能只写你测试用的一两个国家。如果没配置对应国家码S-CSCF会认为该号码不是国际长途直接丢弃或转其他业务流程。3.2 第二步在5G SMF/PCF中配置语音专用DNN与APN5G SA下语音信令要么走默认DNN要么走专门给IMS开的DNN。我的习惯是单独建一个imsDNN并把PCF策略绑定在这个DNN上否则普通数据流会污染语音链路。配置片段SMF侧{ dnn: ims, slices: [{ sst: 1, sd: voice }], pduSessionType: IPv4v6, p-cscfAddress: [192.0.2.10, 2001:db8:10::10], alwaysOn: true }逻辑说明这个配置会让UE建立PDU会话时主动指定DNN为imsSMF通过N7接口向PCF获取语音专用策略。alwaysOn:true确保会话不被释放避免用户在通话过程中PDU会话重建导致媒体中断。p-cscfAddress是在PDU会话建立响应中下发给UE的手机拿到这个地址后才会把初始SIP注册发往这里。参数说明如果你用的是5G SA组网SD值必须与统一切片标识保持一致如果你把它设置成普通数据切片语音SD会冲突表现为可上网但无法注注册IMS。很多厂商还会要求将pduSessionType设为IPv4v6因为VoNR的SIP信令需要IPv6地址但大多数国际转接局仍走IPv4双栈能兼顾两端。3.3 第三步设置P-CSCF发现与SIP信令路由参数P-CSCF发现有两种方式一种是在SMF里静态下发上面JSON里已经写了另一种是采用DHCPv6或Router Advertisement。实测中发现华为5G网管推荐静态方式因为直接写死地址比动态发现好排障。配置完成后需要重启UE上的飞行模式强制触发重新注册否则UE还会沿用旧DNN里的地址。SIP信令路由参数主要是设置S-CSCF到AS的触发规则。在UDM的签约数据中增加如下内容INSERT INTO ims_services (user_phone, service_code, trigger_point, as_uri) VALUES (491720123456, CSCF_INTERNATIONAL_CALL, SIP_METHODINVITE AND TEL_URI_GLOBAL_PREFIX, sip:as_intl.example.com:5060);逻辑说明这条SQL描述一个iFC规则当SIP方法为INVITE且被叫号码是全局E.164格式带号时把请求触发到地址as_intl.example.com的国际化应用服务器。trigger_point不是SQL标准来的我按5G标准里iFC条件格式转成了SQL可读形式实际部署时用厂商的规则编辑器配置也一样。参数说明TEL_URI_GLOBAL_PREFIX是区别国际长途与国内长途的硬性条件。如果省略那么你的国内呼叫也会被触发到国际AS造成复用冲突。as_uri尽量使用域名而非IP这样切换AS节点时不用改每条签约记录。3.4 第四步对接国际转接局并做SIP互通校验国际局对接通常不是你直属运营商所以SIP消息要先经过SBC会话边界控制转发。配置时我把SBC当作SIP中继节点让AS把消息发往SBC由SBC再发给国际局。这一步最容易踩坑的参数是Request-URI和P-Asserted-Identity。互通校验时先抓信令看看INVITE是否成功送达对端。我用的是一组比较实际的检查命令# 抓取进IBCF的SIP包 tcpdump -i any -s 0 -w /tmp/intl_sip.pcap port 5060 or port 5061 # 统计INVITE请求数 tshark -r /tmp/intl_sip.pcap -Y sip.Method INVITE | wc -l # 查看指定呼叫的Response状态 tshark -r /tmp/intl_sip.pcap -Y sip.CSeq 1 sip.Method INVITE -T fields -e sip.Status-Code -e sip.Status-Phrase逻辑说明第一条命令抓取进出IBCF的5060端口流量-s 0保留完整包方便后续分析SDP。第二条统计INVITE请求数确认呼叫是否真的从本端发出去。第三条通过CSeq和Method过滤出首条INVITE的响应码例如200 OK代表信令已经到对端486 Busy Here说明号码不可达。参数说明sip.CSeq 1是硬性过滤条件因为同一条会话的CSeq会累加第一条INVITE的CSeq一定是1。如果你不限制CSeq会把重协商的INVITE也统计进来误判呼叫数量。抓包时port 5061要保留因为国际转接局之间常用TLS加密信令只抓5060会漏掉一半包。3.5 调通后的P-CSCF注册检查配置完成后不要急着拨号。先看UE是否成功注册到IMS。打开手机设置里的IMS注册状态或者从核心网侧用如下命令查看curl -s http://scscf-domain:8080/StautsRegistrationServlet \ -H X-Content-Type: application/json \ -d {impu:sip:491720123456example.com}逻辑说明这条命令请求S-CSCF上的注册状态接口看该公共用户标识是否在线。如果返回Auth-Status: OK说明SIP注册流程跑通如果返回Not Found说明P-CSCF没收到注册回到上一步检查DNN下发地址。参数说明impu字段必须带上号和国家码与E.164号码一致。S-CSCF查询用户注册时是精准匹配不带号的字符串会被当成另一个标识。4. 避坑手册五个把国际长途“静音”的典型故障现象与排查路径技术方案可以画得很漂亮但落地时翻车的往往是细节。这一章我整理了自己和同事在复现这个方案时遇到最多的五个“坑”每条都是现象、原因、解决三步记录照着查能省不少时间。4.1 现象一主叫自动回落4G却无长时间提示音现象5G SA下拨打49号码手机屏幕状态栏几秒内从5G跳到LTE然后持续听到盲音迟迟不出回铃音。等待十几秒后被系统挂断主叫侧无任何错误提示。原因EPS Fallback已经执行语音回到了4G承载但4G侧P-CSCF的接入端口没有监听来自该APN的注册消息。另一种可能是SMF给UE分配的IP地址段和PCF策略中“语音IP段”不匹配导致回落后的VoLTE注册重定向到错误的P-CSCF。解决先在核心网侧查该用户回落后的PGW-C/SMF会话确认分配给UE的IP是否在语音策略允许范围内。再检查PCF中的voice_domain_policy_eutels是否为CS Voice with PS Handover如果不是改为该值并让UE重新触发注册。我在华为网管上通常还要确认5G基站的EPS FB重定向配置里目标LTE小区是否开启VoLTE有些LTE小区虽然信号好但没有配置VoLTE特性回落过去等于哑巴通道。4.2 现象二接通后双方无声媒体流IP地址不可达现象呼叫能接通双方都看到已经通话互相说话却听不到声音。拿起PCAP看SDP协商媒体IP地址是192.168.0.x这样的私有地址或者0.0.0.0无端口。原因媒体面没有经过SBC/边界节点UE直接把私有IP写在SDP里。在5G SA网络里UE上行的SIP信令经过N9接口转发后SDP中的IP应该是核心网分配的可路由地址如果使用本地分流INTEL端口分配就没落到SBC上。更多时候是UPF的NAT功能没有启用或启用后没有把SDP里的IP改写为公网地址。解决检查UPF节点上的NAT配置要求对IMS通道的UDP媒体端口做ALG处理自动改写SDP里的IP。华为的UPF配置里通常叫“SDP改写”Open5GS里可以在upf.yaml修改nat.allow_list。如果不希望用NAT就要把SBC设为媒体锚点在路由策略上强制媒体流先过SBC再出局。注意只改信令路由不收敛媒体是很多“接通没声音”问题的根因。4.3 现象三呼叫秒断SIP 403 Forbidden反复出现现象一旦拨打国际号码INVITE发出后不到两秒返回403 Forbidden重新拨号仍然在同一个环节被拒。更换几个不同的国家码都一样。原因S-CSCF对国际呼叫触发了业务权限检查发现主叫用户没有开通国际长途业务。在大多数运营商内部国内拨号和国际拨号的独立授权是分开的用户虽然在前台开了“国际长途”业务但UDM/HLR侧的国际业务标识没有同步。尤其5G SA后签约数据从UDM读取旧有的HSS数据没有迁移到UDM的语音签名模板中就会产生这种漏配。解决在UDM中检查该用户的international_call_allowed字段如果为false或缺失改成true。同时确认签约数据里含有“INTERNATIONAL_CALL”的服务过滤器且iFC触发条件在S-CSCF和AS两侧都成功激活。如果还没解决抓包看403的Warning头或P-Charging-Info里面常写着具体拒绝原因不是网元码而是签约标签不匹配。4.4 现象四号码带了86却被当成国际漫游路由现象从国内本地拨打86 13813512345网络居然也按国际长途处理在国际转接局侧形成死循环或者收取了额外国际资费。用不同手机号测会出现不同的路由路径。原因S-CSCF中的iFC规则没有排除本国码。只要INVITE里带加号规则就匹配“全局号码”导致本国家码也被发送到国际AS。而客户端在韩国或美国漫游时拨86是正常的国际漫游路由但在中国国内归属网中86本地号码应当先转成本地号码再路由不能直接进国际AS。解决在号码前缀表或iFC规则中加一条国内码排除规则if (tel_uri_global_prefix AND country_codes NOT IN (86))。如果是在国内号码先把86去掉替换为国内格式再触发常规业务逻辑。配置完成后再拨一次看被抓SIP包的Request-URI是否不再以86开头。这个坑最常见的现象是“本地呼叫绕了国际局”排查时不要只看最终被叫号码要看S-CSCF在第一步的路由判决。4.5 现象五抓包看到多个183响应SDP协商错乱现象拨打国际长途手机听筒里“咕噜咕噜”重复响铃时断时续最终接通后媒体延迟大或者听不清。抓包看到对同一个INVITE返回了两次及以上183 Session Progress状态码一样但SDP内容不同。原因国际转接局的多个AS节点同时响应了呼叫或者同一会话在IBCF处做了重复复制。常见于配置了多条重叠路由比如既有号码尊贵策略触发又有国际长途AS的iFC同时匹配或者SBC双机热备时两台节点都没有开启流量同源检测导致同一INVITE被两个节点处理并都返回183。解决在SBC和IBCF上开启会话防重功能检测CSeq和Call-ID是否重复。核心网侧清理iFC规则保证同一个呼叫只能被唯一AS处理。可以这样验证拉取所有INVITE的Call-ID和CSeq按Call-ID去重看是否有重复的响应tshark -r intl_sip.pcap -Y sip.Status-Code 183 \ -T fields -e sip.Call-ID -e sip.CSeq | sort | uniq -d逻辑说明这条命令会发现重复的Call-ID如果有说明会话被复制。-d参数只显示重复行可以快速定位问题会话。参数说明sip.Status-Code只能用大于等于100的临时响应值如果是200响应重复一般是网络侧中转重发不影响呼叫质量不用处理。5. 验证方法抓包看SIP消息量化时延和接通率的实战技巧配置完成不等于真正能商用。我在交付这个项目时会做最后一轮完整验证不光看能拨通还要看时延、接通率、资源占用。这里分享一套已经跑过多次的验证流程。先规划抓包点。国际长途链路上至少要有三个抓包点UE到P-CSCF之前经UPFS-CSCF到AS入口AS到国际转接局出口。通常我会在IBCF节点上用一个联路端口镜像所有信令不用去改现网配置。抓包时长覆盖至少50次呼叫样本才能计算出有意义的失败率。抓包过滤条件不要只抓SIP。要同时抓SDP才能分析媒体协商差。我现在用的一条复合过滤是tcpdump -i any -s 0 -w intl_interop.pcap \ --directionboth \ (udp port 5060 or tcp port 5060) or (udp portrange 30000-40000)逻辑说明前一段抓SIP信令后一段抓媒体端口范围。实际环境中媒体端口往往不固定从UPF侧看媒体范围可能是动态的。所以我建议在UPF或SBC上启用媒体日志这样不用盲抓端口。参数说明portrange 30000-40000是媒体端口这个范围要根据你实际节点配置修改不匹配就抓不到媒体只看信令无法判断双向音频是否正常。接通率统计我用这个命令tshark -r intl_interop.pcap \ -Y sip.Method INVITE \ -T fields -e sip.Call-ID | sort -u | \ while read cid; do status$(tshark -r intl_interop.pcap -Y sip.Call-ID \$cid\ sip.Status-Code 200 sip.Status-Code 300 | wc -l) if [ $status -gt 0 ]; then echo OK; else echo FAIL; fi done | sort | uniq -c逻辑说明这个循环遍历每一个独立的Call-ID检查该会话有没有任何2xx响应。若有则视为接通没有则记录为失败。输出会显示OK和FAIL的数量用于计算接通率。参数说明这里的“接通”是信令层接通不包含对方没接听的情况。如果还要算真实应答率得关心180 Ringing之后的200 OK是不是用户应答才触发。严格些时我用SIP响应的Reason头区分但现网很多中继不携带所以我一般只看2xx业务指标另算。时延测量要抓两个时间点INVITE发出时刻和收到183 Session Progress的时刻。SIP消息头自带Timestamp字段但各厂商实现不一致我直接比较Wireshark的帧到达时间tshark -r intl_interop.pcap -Y sip.Method INVITE or (sip.Method 183) \ -T fields -e frame.time_epoch -e sip.Method | \ python3 -c import sys invite_time None for line in sys.stdin: parts line.strip().split(\t) if len(parts) 2: continue t, m float(parts[0]), parts[1] if m INVITE: invite_time t elif m 183 and invite_time: print(f183 MESSAGE delay: {t - invite_time:.3f}s) invite_time None 逻辑说明这个脚本逐行读Wireshark输出记录每个INVITE的时间遇到下一条183时计算差值就是核心网侧从INVITE出局到收到首个临时响应的时延。参数说明frame.time_epoch是浮点秒减出来的值会很小单位是秒比如0.780表示780毫秒。国际长途跨国回铃在1.0到2.5秒之间都是正常如果超过3秒就要怀疑路由绕路或AS处理过慢。这些验证做完我还会收集一个统计表每个目的国家的接通率、首呼后平均时延、编解码协商成功率。这些数据最后都会整理进docx的资源里方便后来者直接拿来当基线。从那以后我每次拿到一个5G国际长途项目都强制自己走一遍“号码规划 → DNN配置 → iFC触发 → 信令抓包 → 时延统计”的完整流程。因为第一版我也栽过只改了P-CSCF地址没查UDM契约结果本地呼叫全跑到国际工期被骂了一整天。希望这份复现笔记里的思路和参数能帮你少走这一段弯路。本文还有配套的精品资源点击获取
返回列表