ARTICLE DETAIL

资讯详情

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

5G国际长途呼叫技术指南:VoNR/IMS信令、号码归一化与SBC配置

5G国际长途呼叫技术指南:VoNR/IMS信令、号码归一化与SBC配置 简介一篇讲解5G网络国际漫游及长途语音实现原理的专题文档适合通信工程师、核心网维护与网络规划人员阅读。内容围绕5G系统5GS与4G演进分组系统EPS的漫游互通展开从漫游目的、协议连接与直连/国际枢纽两种组网方式切入详细说明基于SEPP安全边缘保护代理的保护机制梳理UE向AMF注册、NRF发现、AUSF/UDM交互、PDU会话建立等关键流程并解释VPLMN与HPLMN之间控制面流量的安全通道处理。这些内容共同构成了5G漫游场景下从注册、寻址到会话建立的完整链路。文档还对比了漫游场景下EPS回退与VoNR两种语音方案说明二者在呼叫设置延迟与网络兼容性方面的差异并对紧急呼叫在5GS漫游中的本地接入及回退至EPS处理给予明确梳理。全文按漫游架构、语音方案与紧急服务三层展开便于按需查阅。资源为单个docx文件约291KB可直接阅读并配合笔记使用。目前已有220人学习适合需要从端到端视角理解5G国际长途电话打通路径的通信从业者。1. 5G网络里的国际长途不是“拨个就能通”那么简单之前我参与过一次国际语音联调新开了某个方向的国际长途去话业务测试组拨了一下午接通率只有三成。要么被叫手机不响要么响了接起来只有单向声音最头疼的是好几通电话显示已接通但刚过两秒就自动释放了。当时大家第一反应是“国际局数据没做全”翻完一圈发现不是真正的问题出在5G语音的呼叫在IMS域里怎么走、号码在网间怎么翻译、媒体面在哪一段被卡住。这篇笔记就把我当时拆完这个文档后的理解写出来覆盖VoNR呼叫模型、国际路由配置、号码归一化、联调验收再附上几条亲身踩过的坑。适合做核心网、数通、海外业务开通的兄弟们参考尤其是被国际长途去话/来话折腾过的人。2. 语音在5G网络里怎么走VoNR、EPS Fallback与IMS网元拆解2.1 VoNR 通话链路与关键网元先明确一个前提在5G网络里打通国际长途不等于“手机能拨国际号码”就行。5G网络本身只提供承载真正的语音控制面是IMSIP多媒体子系统。国内5G手机通话有两种形态一是VoNR即终端在NR小区下直接通过IMS发起语音呼叫语音承载走QoS Flow另一种是EPS Fallback也就是NR侧没有配置VoNR或者覆盖信号不足以承载语音时终端先回落或重定向到4G再走VoLTE通话流程。国际长途场景里这两种形态都会遇到而且对端网络可能是2G/3G/4G/5G甚至对端运营商还是传统PSTN接入所以主叫发起呼叫后信令还得多穿几层网关。关键网元大概是这样一条链终端 → gNodeB → UPF数据面→ P-CSCF → S-CSCF → IBCF/TrGW → 对端IMS/MGCF → 对方国际局 → 对方PSTN/移动网。P-CSCF负责终端接入S-CSCF做业务触发和路由IBCF是网间边界控制功能负责对接另一个运营商的IMS网络TrGW则跟着做媒体面的翻译和地址映射。如果对端是传统PSTN还需要MGCF、IM-MGW把SIP转成ISUP。做国际长途时很多故障就集中在IBCF/TrGW这一段因为两侧网络的SDP协商、NAT映射、编解码匹配都在这完成。这一段里最容易忽略的是P-CSCF与UPF的联动。VoNR呼叫建立时PCRF/PCEF会根据IMS信令的QoS要求创建专载如果终端没有拿到正确的语音QoS规则可能出现呼叫建立慢、回落失败甚至IMS信令能到但语音质量极差。排查时可以先用抓包确认终端是否收到QoS更新再看P-CSCF的注册状态这能省下一半时间。2.2 国际呼叫的信令路径与 SIP-I/SIP-T国内运营商之间互通一般用的是SIP-I或者SIP-T。SIP-I是在SIP消息里将ISUP消息整体封装适合电信网间互通的场景SIP-T则是把ISUP关键参数映射到SIP头域适合跨域漫游较多的场景。国际长途里去话方向我们通常是对端运营商给一个SIP中继接口用SIP-I比较多因为ISUP字段能携带主叫号码、被叫号码、转接计数等电信级信息计费和话务路由都不容易丢字段。从我实际接触的国际局配置来看SIP-I模式下最容易出问题的反而是“参数携带不全”而不是“拨不通”。比如ISUP的User Teleservice InformationUTI、User-to-User InformationUUI这些字段在SIP-INVITE里如果没有用application/isup方式带上对端交换机或国际局可能在回铃音、传真、改号通知这类增值业务上表现异常。信令路径上主叫侧IMS的IBCF通过TrGW和对端IBCF建立SIP会话媒体流从主叫侧TrGW透传到对端媒体网关。有人问为什么不能直接让终端和对端网关建立媒体流原因很简单两侧网络地址可能重叠、编码策略不同、需要计费锚点所以媒体必须经过TrGW中转。这里要记住一个原则媒体面路径和信令面路径在网间中转时必须一致如果SIP信令从A点出媒体却指向B点十有八九是单向语音或无声。排查时先画一条端到端媒体链路把每个节点的SDP地址接龙起来问题出在哪一段一眼就能看出来。2.3 号码分析与国家码处理规则国际长途的号码处理可以概括为三步去前缀、补国家码、再按对端要求格式化。我们常见的拨号方式是“国家码国内号码”也有部分用户习惯“00国家码国内号码”。到了交换机侧主叫所在网络会先把00或去掉然后把号码变成E.164格式传向国际局。对端网络拿到号码后按自己的号码分析表判断是国际来话还是国内长话再做一次格式化。实际工程里有个特别容易踩的坑处理顺序错误。比如一条号码分析规则既要去掉00又要给国内号码补国家码如果先补码再去前缀号码就变成了008686...的重复结构。还有一类情况是主叫号码的隐私规则国际来话时如果对端送了匿名号码而我们自己的局又强制补了主叫国家码可能会被对端拒呼。所以做号码分析时我的建议是拆成独立步骤来做先判断入向或出向再做去前缀再做补国家码每一步单独出字段方便查话单时回溯。这份文档后面附带的配置模板就是按这个逻辑组织的。3. 从拨号到路由号码归一化与SBC出局配置怎么做3.1 SBC出局路由配置与参数说明国际长途去话的核心在SBC/IBCF上的出局路由配置。常见做法是配置一张路由表按“匹配模式 → 改号规则 → 中继群 → 协议封装”的顺序来定义。以我调试过的某主流厂商SBC配置片段为例它的思路是这样的# SBC 出局路由表示例字段名为通用写法具体设备上大同小异 route-table create INTL_OUTBOUND match criterion called-prefix 00| strip leading-digits 2 prepend digits translate called-number rule-id INTL_NORMALIZE trunk-group TGM_INTL_SIP-I protocol profile SIP_I_ISUP_EN codec preference g711alaw,g729,opus early-media disable这条规则的意思是凡是主叫拨出的被叫号码以00或开头的呼叫先剥掉两位前缀再在前面补一个号统一保存成“国家码国内号码”的E.164形态然后把话务送到对端中继群协议封装用SIP-I。这里几个参数值得说清楚strip leading-digits的2是指去掉00的两位但如果是单个号它是不占两位的所以实际项目中通常用正则匹配而不是简单strip否则会出现号码被误删的情况。protocol profile SIP_I_ISUP_EN决定INVITE消息里是否携带application/isup体没有这段对端只能按普通SIP处理很多ISUP补充业务就丢了。codec preference建议按对端支持能力来排g711是保底g729走低带宽opus在5G VoNR里能发挥优势但中继到传统PSTN时不一定支持。early-media disable的意思是不要对每个呼叫都尝试早期媒体否则有些国际局的回铃音会出问题。3.2 号码归一化脚本处理、00、0开头的边界SBC路由配置只是第一步真正容易漏的是“号码归一化”。我在项目里习惯用一段小脚本来校验所有号码规则把可能出现的非法号码提前筛出来而不是等话单出来再追。下面这个脚本的思路可以复用import re def normalize_intl_dial(num: str, home_cc: str 86) - str: 把用户拨号形式的号码统一成 E.164不含号前缀。 支持格式8613800138000 / 008613800138000 / 013800138000 / 8613800138000 s re.sub(r[^0-9], , num) if s.startswith(): return s[1:] # 86... 直接去掉 if s.startswith(00): return s[2:] # 00 国际接入码剥掉 if s.startswith(0) and not s.startswith(00): return home_cc s[1:] # 国内的0开头补86 return s # 测试用例 cases [8613800138000, 008613800138000, 013800138000, 8613800138000] for c in cases: print(c, -, normalize_intl_dial(c))逻辑说明这个函数做三层处理。第一层把空格、横线、括号全部剔掉只保留数字和号第二层针对不同前缀单独处理开头的直接去掉00开头的去掉00国内0开头的自动补国家码第三层已经是E.164的号码原样返回。参数说明home_cc是本地国家码默认86如果用到别的国家改这一个参数即可。实际使用中我会把它做成一个批量验证工具把所有国际去话号码段导进来跑一遍输出结果再和被叫侧要的号码格式对比。如果某条号码经过规则后长度不等于“国家码国内号码”的长度基本就是配置有问题。这个脚本不替代SBC里的翻译规则但它能在上线前把问题按在测试环境里。3.3 网间互通参数表对端要什么就给什么国际长途联调时建议把双方约定的参数整理成一张表防止两边各说各话。下面是我常用的互操作核查表格式参数项主叫侧取值被叫侧要求一致性处理被叫号码格式E.164含E.164不含中继网关去掉主叫号码透传需要显示9986手机号只识别86手机号编号规则里强制加86ISUP封装SIP-ISIP-I保持application/isup编解码g711a/g729/opus仅g711a移除g729/opusDTMF方式RFC4733带内DTMF协商用媒体带内早媒体禁止允许在SBC关闭early-media参数表看着简单但联调时至少一半问题出在这种“两边格式不一致”上。比如被叫侧对主叫号码要求必须带国家码我们在SBC里没做补码对端就直接按匿名或非法主叫拒了。又比如编解码列表我们排了opus排第一对端不支持SIPSDP协商就会选到第二个编解码虽然能通但语音质量可能不是最优。做这种表格时我一般会要求两边各填一列有冲突的地方单独标红逐条确认别等测试出了问题再回来看。4. 实测验收国际长途通话质量与话单核查方法4.1 国际呼叫实测步骤与判定标准配置做完别急着说“通了”我习惯把验收分成四步呼通性测试、双向语音测试、保持/释放测试、长时间通话测试。呼通性测试只要验证“被叫振铃、接通、挂断”三步都正常双向语音测试要求主被叫各说一段长句并录音确认没有单向无声保持和释放测试要看呼叫保持后恢复是否正常以及挂机释放是否出现延迟释放长时间通话一般坚持10分钟以上主要观察媒体流是否有中断或静音突发。判定标准我会按这个底线来卡呼叫建立时延小于5秒端到端语音时延小于300毫秒MOS不低于3.5丢包率小于1%。如果时延长但丢包率很低可能是路由绕路了如果MOS低但时延正常大概率是编解码协商到了低码率比如g729或者压缩过狠的opus。还有一点容易被忽略如果被叫侧是PSTN用户还要验证传真和DTMF按键这两个业务对媒体透传的要求完全不同很多“语音正常但传真失败”的案例都是传媒介质参数没协商好。4.2 MOS、时延、回声指标怎么看这些指标不是光看仪表读数就行要能对应到网络环节。MOS低于3.0时先确认是否收到了RTP的丢包事件如果丢包集中在同一段时间优先看TrGW和防火墙的会话保活间隔如果丢包均匀分布则可能是中间链路带宽或者抖动缓冲配置太小。时延上国际长途里卫星链路或者跨洲光缆的固有时延没法消除但如果时延在通话过程中波动明显我一般去查SBC上的抖动值正常RTP抖动应低于50毫秒。回声是国际长途里最容易翻车的指标。回声不只来自音频回路更多原因是终端侧或网关侧的AEC没生效或者对端网络回声抑制器配置成了永不使能。测试方法是用PingTel或者专门的回声测试号在通话中由主叫侧发出一段连续音对端静音然后听返回的声音。如果回声明显先在SBC上开启回声抑制再协调对端开启语音增强功能。有一点需要留意回声和侧音不能混为一谈有些手机本身的侧音会被误诊为网络回声换机测试是区分这两者的最快办法。4.3 话单与计费核查方法话单核查的价值在于很多间歇性的通话故障在实时测试里看不出来但话单里会把异常释放原因记下来。我拿到原始话单后会看这几个字段主被叫号码是否按约定格式呈现、通话开始/结束时间、释放原因值ISUP Cause、媒体流持续时间、RTP收包数/发包数是否对等。如果看到持续时长很短且释放原因是No circuit availablecause 34或者Normal unspecifiedcause 31要倒回去看路由选择和号码翻译有没有跳到错误的中继群。这里给一个常见释放原因的快查表释放原因值含义优先排查方向3No route to destination出局路由表未覆盖该号段16Normal call clearing正常挂断无需排查18No user responding被叫侧因振铃超时不回应28Address incomplete号码长度缺失或翻译后不完整34No circuit available中继群不可用或达到话务上限44Requested circuit not available对端TrGW媒体资源不足话单里还有一个值得看的指标接通后平均通话时长。如果绝大部分话单都集中在“接通后30秒内释放”基本可以猜测试验室的人为挂机还是网络故障导致的掉话。把释放原因按小时聚合一张表出来如果某时段集中出现cause 34那就是中继群容量问题调整话务上限或者增加中继端口就行。5. 避坑排查五条国际呼叫的真实翻车记录5.1 主叫听得见被叫听不见现象主叫侧能听到回铃音和对方说话被叫侧完全听不到主叫声音但接通状态一直保持。原因SIP信令走到了对端但媒体流地址在穿TrGW时没有映射成功对端把RTP发到了内网地址或被防火墙丢弃。解决在TrGW上查看媒体会话的NAT映射状态确认公网地址和端口已创建同时检查SBC发送的SDP里c行地址是否为可达的公网地址。我一般会在SBC侧开RTP调试日志抓一对caller/calee的RTP包比对收发包的地址和端口能快速定位是哪一侧的媒体没有落地。5.2 接通后2秒自动掉线现象双方都振铃并接通但通话建立后大约2到3秒就被释放释放原因值是正常释放。原因SDP协商双方选了不同的编解码或者其中一个终端不支持协商出来的编码媒体通道实际建立失败了。解决在SBC上把编解码列表收敛到两边都支持的编码避免列表里第一个编码不对同时开启“强制编解码一致性”检查让SBC在SDP应答后主动匹配一次编解码不匹配直接拒绝而不是等媒体超时。这个坑在5G VoNR和PSTN互通时尤其常见因为VoNR默认编码可能是AMR或者opus而PSTN侧网关只认g711。5.3 被叫号码少了国家码现象国际来话接通率不高翻话单发现部分被叫号码只有11位没有国家码也有部分号码多了一位国家码变成12位。原因号码分析规则里“剥00”和“补国家码”都生效了但执行顺序反了导致补完码又被剥掉一段或者某个网元做了二次翻译把原本已经正确的E.164号码又按国内局号处理了一遍。解决把号码翻译做成幂等规则即在SBC/国际局上重复执行同一条翻译规则结果必须保持不变。我在配置里会加一条保护逻辑如果号码已经以86开头就不再重复补码。5.4 5G回落4G后呼叫中断现象VoNR下发起国际呼叫接通后终端移动到4G覆盖时通话直接掉线而不是切换成VoLTE。原因EPS Fallback场景里ATCF/ATGW上的接入切换号码STN-SR没有配置正确或者切换后的P-CSCF地址与ATCF里保存的会话信息不一致。解决核查ATCF上的STN-SR和ATGW的媒体保持参数并用“呼叫保持小区切换”的联合用例复测。这个坑在实验室里很难复现因为实验室的NR覆盖很理想一定要在真实移动场景申做切换测试才能暴露。5.5 通话全程有明显的“山洞回声”现象双方通话过程中都有持续回声音量不大但一直存在且对方声音越响回声越明显。原因对端网络的语音增强功能没有启用或者中继网关的Echo Canceller被旁路掉了。解决先在主叫侧SBC开启回声抑制再把对端中继的EC开关状态确认一遍。最容易被忽略的是回波路径可能不只一段如果两侧都有EC但都只削了一半效果反而更差所以做回声测试时一定要定位到回声的物理位置而不是盲目开开关。6. 把验收变成日常一个预检脚本和我的固定动作分享一个我现在每个项目都用的预检脚本思路。它不复杂核心是定期从SBC/网管拉取路由配置并把号码归一化规则批量跑一遍提前发现“昨天改过一条路由但忘了同步翻译规则”的问题。以下是我在Linux服务器上写的一个简化版本#!/bin/bash # 国际长途路由预检核对路由表与号码翻译规则数量 # 用法在SBC北向接口可达的服务器上执行 echo 路由表检查 # 查询出局路由表中国际前缀匹配规则 sbc-cli show route-table INTL_OUTBOUND | grep -E 00| | wc -l echo 号码翻译规则检查 # 查询编号规则中补国家码的规则数量正常应为1 sbc-cli show translate-rule | grep prepend 86 | wc -l echo 中继群状态检查 # 查看国际中继群空闲信道比例低于10%时告警 sbc-cli show trunk-group TGM_INTL_SIP-I | awk /idle-channels/ {print $3}这段脚本的价值不在于命令行本身而在于把每次验收的“人肉检查”变成固定动作。以前靠人一条条看配置现在每次开项目会之前先跑一遍有任何一条规则缺失脚本会直接反映出来。我还会把结果输出到文件和前一天的结果做diff这样谁改动过配置哪个时间点改的一目了然。末了说一个我自己的习惯从那以后每一次国际长途项目验收我都强制自己走一遍“号码归一化脚本跑批 五个固定用例86138...、0086138...、0138...、手机直拨带#、短号 话单释放原因聚合”哪怕时间再紧也花不了半小时。这套流程救过我很多次好多看起来像“玄学”的间歇性故障最后都落在某条号码规则或某个编解码顺序上。希望帮到你也希望你在做国际局对接时少走我走过的这些弯路。本文还有配套的精品资源点击获取
返回列表