你每天解锁手机、刷微信、看视频时,运营商的网络里有一个“看不见的动作”一直在默默维持着:你的手机已经在IMS(IP Multimedia Subsystem,IP多媒体子系统)里注册过了。正因为这个注册,当别人拨你的号码时,网络才能在几秒钟内找到你、接通你。一旦这个注册悄悄失效,你会发现一个诡异现象:上网一切正常,但电话打不通也接不到。
这篇文章就来拆解IMS注册的完整原理:SIP协议是什么、IMS网络里的四类核心网元如何分工、注册为什么要发两次REGISTER、401挑战响应里藏着什么数学、以及注册成功之后网络如何利用这份“户口档案”把来电送到你手机上。
日常类比:你搬进一个新小区,第一件事是去物业登记——“我住在3栋502,快递放门卫”。登记完之后,任何人给你寄快递,只要写你的名字,物业就能查到该送到哪里。你搬家不重新登记,快递就永远找不到你。
传统电路交换网络(2G/3G时代的语音)不需要这个动作,因为手机在哪个基站下、占用哪条电路,交换机是实时知道的——用户位置由“连接”本身携带。但IMS建立在IP网络之上,而IP网络的本质是无连接的:你的手机分配到一个IP地址,网络默认对你“一无所知”。IMS是3GPP从R5开始引入的标准化多媒体子系统,它把IETF的互联网协议(核心就是SIP)搬进了电信网络,用注册(Registration)这个显式动作来弥补无连接网络的“失忆症”:
注册的本质 = 把“我是谁”(SIP身份)和“我在哪”(当前IP地址/联系方式)绑定起来,存进网络的位置数据库。
这个绑定关系有两个用途: 1. 被叫可达:别人呼你时,网络查表就知道往哪个IP地址发INVITE; 2. 业务触发:网络知道你已经在线,才能把彩铃、呼叫转移、语音信箱这些业务挂到你身上。
所以“注册”在IMS里不是可选的握手礼节,而是整个语音业务的基石。
IMS没有为语音发明新协议,而是直接采用了互联网世界早已成熟的SIP(Session Initiation Protocol,会话初始协议)。SIP于1999年3月首次标准化(RFC 2543),2002年6月修订为RFC 3261,也就是今天使用的版本。2000年11月,3GPP把SIP接纳为IMS架构的永久信令协议——这是电信史上的一个重要转折点:电信网络第一次大规模拥抱互联网协议。
SIP为什么选择“长得像HTTP”?因为设计者想复用互联网世界已经验证过的一切:文本格式可读(抓包能直接看懂)、请求/响应模型成熟、状态码语义直接照搬(200成功、404找不到、500服务器错)。你用Wireshark抓一个SIP包,肉眼就能读出呼叫的来龙去脉——这在二进制的传统电信信令时代是不可想象的。
SIP定义了十几种请求方法(Method),语音业务最常用的如下:
| 方法 | 作用 | 类比 |
|---|---|---|
| REGISTER | 把To头中的身份与Contact中的地址绑定到位置服务 | 去物业登记住址 |
| INVITE | 发起会话/呼叫 | 敲门:“在吗,聊聊?” |
| ACK | 对INVITE最终响应的确认 | 确认收到答复 |
| BYE | 结束会话 | “就聊到这,再见” |
| CANCEL | 取消尚未应答的请求 | 敲了门没人应,不等了 |
| UPDATE | 不改变对话状态的前提下修改会话参数 | 聊天中途换个座位 |
| PRACK | 对临时响应(1xx)的可靠确认 | “我知道你正在想了” |
| REFER | 请求对方发起请求,用于呼叫转移 | “你直接找他吧” |
响应码分为六类,与HTTP一脉相承:1xx临时响应(正在处理/振铃)、2xx成功、3xx重定向、4xx客户端侧失败(如401未授权、403禁止、404找不到用户)、5xx服务器失败、6xx全局性失败。记住401——它是本文主角,IMS注册的关键就藏在“故意失败一次”里。
SIP默认使用端口5060(明文)和5061(TLS加密),底层可以跑在UDP、TCP或SCTP上。而语音媒体流(真正说话的声音)不走SIP,走RTP/SRTP——SIP只管“怎么接上”,不管“聊什么”,媒体参数协商由SIP消息体里携带的SDP完成。
IMS架构里,一个手机的注册请求要闯过几道关卡。理解每个网元的“人设”,注册流程就不神秘了:
flowchart TD
UE["UE 手机内的IMS客户端"]
P["P-CSCF 大门保安"]
subgraph HOME["归属网络"]
I["I-CSCF 问询台"]
S["S-CSCF 总调度室"]
H["HSS 用户档案库"]
AS["AS 应用服务器"]
end
UE -->|"SIP信令 Gm"| P
P -->|"Mw"| I
I -->|"Mw"| S
S -->|"Cx Diameter"| H
S -->|"ISC"| AS
| 网元 | 全称 | 人设 | 核心职责 |
|---|---|---|---|
| P-CSCF | Proxy-CSCF | 大门保安 | 用户的第一个接触点,注册期间固定不变;校验信令合法性、与终端建立IPsec加密通道、压缩SIP消息(SigComp)省无线带宽 |
| I-CSCF | Interrogating-CSCF | 问询台 | 归属域的“门牌号”,地址公布在DNS里(NAPTR/SRV记录);查询HSS为用户挑选一个S-CSCF |
| S-CSCF | Serving-CSCF | 总调度室 | 永远在归属网络;执行注册(绑定身份与地址)、下载并执行用户业务档案、决定是否把呼叫转给应用服务器 |
| HSS | Home Subscriber Server | 档案库 | 存放用户签约数据、鉴权密钥、身份信息;类似2G时代的HLR+AuC合体 |
为什么拆成三个CSCF,而不是一个服务器搞定? 这是IMS设计中最值得咀嚼的取舍:
IMS里每个人都有两种身份,很多人第一次接触时容易混淆:
| 对比项 | IMPI(私有身份) | IMPU(公开身份) |
|---|---|---|
| 类比 | 身份证号 | 名片上的电话 |
| 用途 | 注册、鉴权、计费等网络内部事务 | 别人呼叫你时使用 |
| 数量 | 每用户只有一个 | 每个IMPI可对应多个 |
| 形式 | user.name@运营商域名 |
SIP URI(sip:xxx@xxx)或Tel URI(tel:+8613...) |
| 是否保密 | 仅网络和终端知道 | 可印在名片上 |
你拨给别人看的号码是IMPU(Tel URI形式),而手机实际拿来做注册鉴权的是IMPI。一个IMPI名下可以挂多个IMPU(比如同一个用户既有语音号码又有视频会议地址),这些IMPU还可以组成隐式注册集(Implicit Registration Set)——注册一次,整组身份全部生效,避免手机为每个身份发一轮REGISTER。
另外,IMS终端里通常有一张逻辑上的ISIM应用(多在USIM卡里),存着IMPI、IMPU和归属域名称,注册时直接取用。
现在进入本文的核心。IMS注册最精妙的设计是:成功的注册,一定是“失败”过一次的注册。第一次REGISTER注定收到401,这不是出错,而是精心设计的挑战-应答(Challenge-Response)鉴权。
sequenceDiagram
participant UE as UE手机
participant P as P-CSCF
participant I as I-CSCF
participant S as S-CSCF
participant H as HSS
UE->>P: REGISTER 第一次 无鉴权头
P->>I: 转发REGISTER
I->>H: 查询该用户由哪台S-CSCF服务
H-->>I: 返回S-CSCF地址
I->>S: 转发REGISTER
S->>H: 请求鉴权向量
H-->>S: 返回 RAND AUTN XRES 和密钥
S-->>P: 401 Unauthorized 附带nonce
P-->>UE: 401 附带nonce和加密算法
Note over UE,P: 双方协商并建立IPsec安全通道
UE->>P: REGISTER 第二次 带RES和security-verify
P->>S: 转发REGISTER
S->>S: 校验RES与XRES是否一致
S->>H: 下载用户业务档案
H-->>S: 返回IMPU列表和iFC规则
S-->>UE: 200 OK 注册成功
Note over S,H: S-CSCF随后向AS发起第三方注册
注册之前,手机得知道P-CSCF的地址。途径有多种:P-CSCF地址可以在附网过程中由网络下发(4G/5G里通过PCO字段携带),也可以由DHCP+DNS解析得到,或预配置在终端里。这解释了一个现网现象:如果P-CSCF地址下发异常,手机连REGISTER都发不出去,信令层面表现为“无注册请求”,而不是注册失败。
手机发出第一个REGISTER,里面带上IMPI、IMPU、归属域名和Contact地址(自己的IP和端口),但不带任何鉴权凭证——因为手机此时根本不知道该用什么“暗号”。这个请求看起来注定失败,它的真实目的是:
S-CSCF收到注册请求后,向HSS要一组鉴权向量(Authentication Vector),包含:
S-CSCF把RAND等信息打包成nonce(一次性数)放进401 Unauthorized响应发回。这个“失败”响应本质上是一句话:“请用你的USIM卡回答这道随机题。”随机性保证每次注册的题目都不同——重放旧答案毫无用处,这就是防重放攻击的核心。
手机收到401后,把RAND喂给USIM/ISIM卡。卡里存着一根与网络共享的根密钥K(从头到尾不出卡),卡上的鉴权算法族 $f_1 \sim f_5$ 像同一台榨汁机的不同档位,输入RAND榨出各种产物:
$$XRES = f_2(K, RAND)$$
$$CK = f_3(K, RAND), \quad IK = f_4(K, RAND)$$
手机还要用AUTN做一件反向验证:AUTN里含有消息鉴别码 $MAC = f_1(K, SQN, RAND, AMF)$ 和被掩码的序列号 $SQN \oplus AK$。手机用同样的方法算一遍MAC,对得上,说明这个挑战真的来自持有根密钥的归属网络,而不是伪基站伪造的——这就是双向鉴权(网络验你,你也验网络)。序列号SQN则防止网络侧的旧挑战被录下来重复使用。
手机把算出的XRES(以摘要形式放在Authorization头里)连同security-verify头一起放进第二个REGISTER。security-verify是对P-CSCF在401里给出的安全配置的“回执确认”,确保中间没有人在安全协商上动过手脚。此后Gm接口(UE到P-CSCF)的信令就在IPsec隧道里加密传输了。
S-CSCF比对手机交上来的RES与HSS给的XRES。这里顺便说一下SIP摘要鉴权的通用数学骨架(IMS用AKA派生值替代静态密码,骨架相同):
$$HA1 = H(username : realm : password)$$
$$HA2 = H(method : uri)$$
$$response = H(HA1 : nonce : nc : cnonce : qop : HA2)$$
注意密码从不出现在空中接口上——双方比对的只是密码经过哈希搅拌后的产物,窃听者拿到response也无法反推密钥。
鉴权通过后,S-CSCF做两件大事:
然后沿原路返回200 OK,注册成功。响应里带有expires(有效期,运营商 typically 设几万秒),手机必须在到期前刷新注册(重发REGISTER),否则绑定过期被清除——这就是“待机几天后突然打不通电话”这类诡异问题的经典根源。
注册成功后还有一个容易忽略的收尾动作:S-CSCF代替用户向应用服务器(AS)发送REGISTER(即“第三方注册”),通知AS“该用户已在线,可触发业务了”。彩铃、语音信箱等AS正是借此知道用户的可达状态。你可以在现网信令里看到一条由S-CSCF发给AS的REGISTER——它不是用户发的,所以叫“第三方”。
注册建立了“身份证 → 住址”的映射,那么真实来电时这张地图如何发挥作用?看被叫方向的寻址过程:
sequenceDiagram
participant A as 主叫UE
participant S1 as 主叫侧S-CSCF
participant I as 被叫归属I-CSCF
participant H as 被叫HSS
participant S2 as 被叫S-CSCF
participant B as 被叫UE
A->>S1: INVITE 拨打被叫号码
S1->>I: 路由到被叫归属域
I->>H: 查询被叫注册在哪台S-CSCF
H-->>I: 返回S2地址
I->>S2: 转发INVITE
S2->>S2: 查注册库 用Contact找到被叫IP
S2->>B: 经P-CSCF送达INVITE
B-->>A: 183 会话进展 180 振铃 200 OK
关键点在于:INVITE进入被叫归属域时,网络只知道你的IMPU,不知道你的IP。是S-CSCF查注册时写入的绑定关系才补上了“最后一公里”的地址。如果此刻你的注册已过期,S-CSCF会视签约情况返回404(用户不存在)或按“未注册用户”流程触发呼转业务(比如转入语音信箱)——呼转到语音信箱,本质上就是“注册失效/未接听”时的业务兜底在起作用。
同时注意主叫侧:主叫S-CSCF收到INVITE后并不直接路由,而是先按iFC规则把请求交给各AS“过一遍”(挂彩铃的加彩铃,做号码翻译的做翻译),这一圈下来才继续前进。iFC按优先级顺序匹配——这正是IMS“控制与业务分离”设计在日常呼叫中的体现。
理解原理后,工程师排障就有了清晰的路标。所有IMS语音问题的第一排查对象永远是注册状态:
| 现象 | 高概率原因 | 排查抓手 |
|---|---|---|
| 发不出REGISTER | P-CSCF地址未下发/下发错误 | 检查附网流程中PCO携带的P-CSCF地址 |
| 反复401、始终停在第二次REGISTER前 | SQN失步(卡与HSS序列号不同步)、USIM鉴权失败 | 查看HSS/MME侧鉴权记录,做SQN重同步 |
| 收到403 Forbidden | RES与XRES不一致(鉴权失败)或IMPI/IMPU不匹配 | 核对签约的IMPI、IMPU配置 |
| 401后无第二次REGISTER | security-verify校验失败(如P-CSCF重启导致安全参数变化) | 抓Gm口信令比对security-server/security-verify |
| 注册成功但过几小时来电不通 | 注册刷新失败:NAT表项老化、无线侧休眠、expires周期异常 | 检查keepalive与NAT超时配置 |
| 注册成功但某业务不触发 | iFC未配置/优先级错误、第三方注册失败 | 检查HSS签约的iFC与S-CSCF发给AS的REGISTER |
三个常见误解,值得专门澄清:
Q1:VoLTE和VoNR的注册有什么区别? A:从IMS的角度看几乎没有区别——两者都在4G/5G包交换网络上完成同样的SIP注册流程。区别只在底层承载:VoLTE的IMS信令和媒体跑在LTE的默认/专有承载上,VoNR跑在5G NR的承载上。所以掌握了IMS注册原理,就同时掌握了VoLTE和VoNR的“上半场”,下层承载差异不影响信令逻辑。
Q2:Wi-Fi Calling(VoWiFi)也要做IMS注册吗? A:要。VoWiFi的本质是让IMS注册跑在不可信的IP网络上(Wi-Fi),为此终端先与运营商的ePDG网关建立IPsec隧道(此时依赖EAP-AKA鉴权),再在这个加密隧道里执行与普通VoLTE一模一样的SIP注册。你可以理解为:VoWiFi = 先修一条加密山路,再走同一条注册大道。
Q3:为什么我的手机关机再开机,有时别人的来电还是打不通? A:开机后终端要重新走完整注册流程(新RAND新挑战)。如果开机后IMS注册失败(比如SQN失步、P-CSCF不可达),数据业务仍可能正常,此时来电会被网络判为“不可达”,触发呼转或听“您拨打的用户暂时无法接通”。遇到此类投诉,先查IMS注册状态,再查无线。
Q4:REGISTER里不带密码,那鉴权到底比对了什么? A:比对的是“根密钥对随机数的运算结果”。根密钥K存在USIM卡和HSS(AuC功能)两端,从不在空中传输。双方各自用同样的算法族对同一个RAND做运算,S-CSCF比对手机上交的RES与HSS预留的XRES。窃听者即便截获全部信令,也无法从运算结果反推出K——这是挑战-应答机制的安全根基。
Q5:一个手机号为什么能同时登录多台设备(如手表副设备)? A:这利用了IMPU可共享的特性——多个终端的IMPI各自独立,但可以绑定同一个IMPU(例如家庭共享号码)。来电时S-CSCF按注册记录把INVITE分发给所有绑定该IMPU的设备。同一用户多设备场景(多注册)在SIP机制上是支持的,每个设备有自己的Contact。
本文由「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 等场景全覆盖。
