本轮(第3轮)聚焦 ims 子域。前序已覆盖 VoNR 预条件机制,本文转向 IMS 最基础也最关键的入口机制——初始注册(Initial Registration)。注册是 VoNR/VoLTE 一切会话建立的前提:没有成功的 REGISTER,UE 既拿不到 Service-Route,也无法建立与 P-CSCF 的 IPsec 安全联盟,更无法被网络路由到(terminating)。本文基于 3GPP TS 23.228(IMS Stage 2)§5.3.2.2、TS 24.229(IMS CPlane SIP/SDP)§5.1.1.2、TS 29.228/29.229(Cx/Dx 接口信令流) 与 TS 33.203(IMS 安全架构),逐消息拆解这条贯穿 5 个网元的信令链。
IMS 注册看似只是一条 SIP REGISTER,但标准却设计了 5 个网元(UE、P-CSCF、I-CSCF、S-CSCF、HSS)跨 Gm/Mw/Cx 三种接口的十余次交互,其设计意图可归结为四点:
nonce 字段,一次挑战同时完成双向鉴权 + IPsec 密钥(IK/CK)分发,避免另起一套密钥协商。理解这四点,才能解释后面那些看似冗余的网元跳转。
下图严格对应 TS 23.228 §5.3.2.2 Figure 5.1(初始注册流程),并标注了每条消息携带的关键 IE:
sequenceDiagram
autonumber
participant UE
participant PCSCF as P-CSCF
participant ICSCF as I-CSCF
participant SCSCF as S-CSCF
participant HSS as HSS
Note over UE,HSS: === 阶段一:选路到 S-CSCF ===
UE->>PCSCF: REGISTER (IMPI/IMPU, Sec-Client, 无凭证)
PCSCF->>ICSCF: REGISTER (+Path=P-CSCF地址)
ICSCF->>HSS: Cx-UAR (User-Name=IMPI, Public-Id=IMPU, Visited-Network-Id)
HSS-->>ICSCF: Cx-UAA (Server-Capabilities 能力集)
ICSCF->>SCSCF: REGISTER (I-CSCF 按能力集选定 S-CSCF)
Note over UE,HSS: === 阶段二:取鉴权向量并挑战 ===
SCSCF->>HSS: Cx-MAR (Multimedia-Auth-Request, 取 AV)
HSS-->>SCSCF: Cx-MAA (RAND‖AUTN, XRES, IK, CK, Digest-AKAv1-MD5)
SCSCF-->>ICSCF: 401 Unauthorized (WWW-Authenticate: nonce=base64(RAND‖AUTN))
ICSCF-->>PCSCF: 401 (P-CSCF 截留并存储 IK/CK)
PCSCF-->>UE: 401 Unauthorized
Note over UE: UE: ISIM 计算 RES/IK/CK,校验 AUTN 与 SQN 新鲜性
Note over UE,HSS: === 阶段三:带凭证重发 + 下载用户档案 ===
UE->>PCSCF: REGISTER (Authorization: response, Sec-Verify, 经 IPsec-SA)
PCSCF->>ICSCF: REGISTER
ICSCF->>HSS: Cx-UAR (再次确认/选路)
HSS-->>ICSCF: Cx-UAA (S-CSCF 名称)
ICSCF->>SCSCF: REGISTER
SCSCF->>HSS: Cx-SAR (Server-Assignment-Type=REGISTRATION)
HSS-->>SCSCF: Cx-SAA (User-Data: iFC/Service-Profile, HSS 标记 REGISTERED)
SCSCF-->>ICSCF: 200 OK (P-Associated-URI, Service-Route, Security-Server)
ICSCF-->>PCSCF: 200 OK
PCSCF-->>UE: 200 OK (P-Associated-URI, Service-Route)
Note over SCSCF,HSS: 阶段四:S-CSCF 依 iFC 发起 Third-Party REGISTER 到 AS
四个阶段清晰可分:选路 → 鉴权挑战 → 凭证校验与档案下载 → 第三方注册。其中第二次 REGISTER 经过 I-CSCF 时仍会触发 Cx-UAR/UAA;由于此时 Cx-SAR 尚未执行,HSS 通常仍返回能力集(或部分实现暂存的 S-CSCF 名),I-CSCF 据此再次选路到同一 S-CSCF——这正是不同厂商行为出现差异的节点之一(后文详述)。
| SIP 头/IE | 取值示例 | 作用 |
|---|---|---|
| Request-URI | sip:home.net |
归属域 registrar 地址(非个人 URI) |
| From / To | <sip:[email protected]>;tag=... |
IMPU(公共身份,两者一致) |
| Contact | <sip:[::1]:5060>;+sip.instance="<urn:gsma:imei:...>";+g.3gpp.icsi-ref="urn:urn-7:3gpp-service.ims.icsi.mmtel" |
UE 联系地址 + 设备标识 + 支持的 ICSI |
| Authorization | username="[email protected]", realm="home.net", uri="sip:home.net", nonce="", response="" |
IMPI + 空 nonce/response(声明待鉴权) |
| Security-Client | ipsec-3gpp; alg=hmac-sha-1-96; ealg=...; spi-c=...; port-c=... |
UE 侧 IPsec SA 参数 |
| Require / Proxy-Require | sec-agree |
强制启用安全协商 |
设计要点:第一条 REGISTER 故意不携带凭证(nonce 为空),目的是让网络先把"该用谁鉴权、用什么算法"这件事谈清楚。sec-agree 通过 Require 头强制 P-CSCF 必须先完成安全协商,否则 421/494 拒绝。
WWW-Authenticate: Digest realm="home.net",
nonce="N0RBTmhP...="(base64(RAND‖AUTN‖server-specific)),
algorithm=AKAv1-MD5,
qop="auth",
opaque="..."
最精妙之处在 nonce:它不是随机串,而是 base64(RAND ‖ AUTN ‖ server-specific-data)。把整个 AKA 挑战塞进 Digest 字段,使得现有 SIP Digest 框架无需改造即可承载 AKA(RFC 3310)。P-CSCF 在转发前会从该响应中截留 IK(完整性密钥)与 CK(加密密钥)——这是后续 IPsec SA 的密钥来源。
| IE | 说明 |
|---|---|
Authorization response |
MD5(HA1:nonce:nc:cnonce:qop:MD5(method:uri)),其中"密码"用 RES(ISIM 计算的鉴权响应)替代 |
| Security-Verify | 回显 P-CSCF 在 401 中下发的 Security-Server,确认 SA 参数被接受 |
| 经 IPsec ESP 承载 | 自此刻起,UE↔P-CSCF 间的 SIP 走受保护端口(protected_client_port / protected_server_port) |
Cx 接口基于 Diameter(TS 29.229),命令码集中在 300~305。下表是注册链用到的核心命令:
| 命令 | 缩写 | 码值 | 方向 | 注册中的用途 |
|---|---|---|---|---|
| User-Authorization-Req/Ans | UAR/UAA | 300 | I-CSCF↔HSS | 判断是否允许注册、返回 S-CSCF 能力集或名称 |
| Server-Assignment-Req/Ans | SAR/SAA | 301 | S-CSCF↔HSS | 通知 HSS 该 S-CSCF 服务此用户、下载用户档案(User-Data) |
| Multimedia-Auth-Req/Ans | MAR/MAA | 303 | S-CSCF↔HSS | 取鉴权向量 AV(RAND/AUTN/XRES/IK/CK) |
| Location-Info-Req/Ans | LIR/LIA | 302 | I-CSCF↔HSS | 会话发起/终止时定位已注册 S-CSCF |
| Registration-Termination-Req/Ans | RTR/RTA | 305 | HSS→S-CSCF | 网络侧发起去注册 |
| Push-Profile-Req/Ans | PPR/PPA | 304 | HSS→S-CSCF | 用户档案变更时推送 |
Cx-MAA 返回的关键 AVP:SIP-Authentication-Scheme=Digest-AKAv1-MD5、SIP-Authenticate(RAND‖AUTN)、SIP-Authorization(XRES,网络侧校验用)、Confidentiality-Key(CK)、Integrity-Key(IK)。
下图展示 AV(Authentication Vector)的内部结构与密钥如何在网元间流动:
flowchart TD
subgraph HSS["HSS(持长期密钥 K)"]
K["K (长期密钥, 128bit)"]
AV["AV = (RAND, XRES, CK, IK, AUTN)<br/>由 K 与 RAND 经 AKA 算法簇推演"]
end
subgraph UE["UE / ISIM(持同一 K)"]
ISIM["收到 RAND, AUTN<br/>校验 MAC 与 SQN<br/>推演出 RES, CK, IK"]
end
subgraph PCSCF["P-CSCF"]
SA["存储 IK, CK<br/>建立 IPsec SA"]
end
AV -->|"Cx-MAA"| SCSCF["S-CSCF<br/>持 XRES/IK/CK"]
SCSCF -->|"401 nonce=RAND‖AUTN"| UE
ISIM -->|"ISIM 本地推演"| UE
SCSCF -->|"把 IK/CK 传给 P-CSCF"| SA
UE -.->|"RES 作为 Digest 密码"| SCSCF
SCSCF -->|"比对 RES vs XRES"| OK{"匹配?"}
OK -->|是| SUCC["鉴权成功"]
OK -->|否| FAIL["403 Forbidden"]
为什么 IK/CK 要到 P-CSCF 而不是 S-CSCF 终止? 因为 IPsec 安全联盟的端点是 UE↔P-CSCF(接入侧第一个网元),S-CSCF 位于更深的归属网,NAT/拓扑都不适合做 IPsec 端点。S-CSCF 只负责校验 XRES,再把 IK/CK "交接"给 P-CSCF。
| 维度 | IMS-AKA(TS 33.203) | 原生 SIP Digest(RFC 2617) |
|---|---|---|
| 密钥来源 | ISIM 内共享密钥 K + AKA 算法 | 用户名/口令 |
| 双向鉴权 | ✅ UE 校验 AUTN→鉴权网络 | ❌ 仅网络鉴权 UE |
| 密钥派生 | ✅ 派生 IK/CK 建立 IPsec | ❌ 不派生流量密钥 |
| 抗重放 | ✅ SQN 序列号机制 | ⚠️ 仅靠 nonce/nc |
| nonce 语义 | RAND‖AUTN(有结构) | 随机串 |
UE 在注册过程中要完成 sec-agree 与 IPsec SA 协商。下图是 UE 侧的状态转换(TS 33.203 §6.2):
stateDiagram-v2
[*] --> 未鉴权
未鉴权 --> 待协商: 发送 REGISTER(含 Security-Client)
待协商 --> SA参数就绪: 收到 401(含 Security-Server)
SA参数就绪 --> SA建立中: ISIM 校验 AUTN 成功, 协商 SPI/端口/算法
SA建立中 --> 已保护: 建立两对单向 ESP SA(4条)\n切换到 protected port
已保护 --> 已注册: 发送第二条 REGISTER 并收到 200 OK
已注册 --> 未鉴权: 注册超时/去注册(RTR)\nSA 拆除
待协商 --> 失败: sec-agree 拒绝(421/494)
SA建立中 --> 失败: AUTN 校验失败/MAC不符
注意建立的是两对单向 SA(共 4 条):一对承载 SIP 信令到 port_pcscf,另一对到 port_pcscf+1,以区分不同用途。算法由 Security-Client/Server 中的 alg(完整性,如 hmac-sha-1-96)与 ealg(加密,如 aes-cbc)协商。
| 目的 | 过滤表达式 |
|---|---|
| 抓注册请求 | sip.Method == "REGISTER" |
| 定位挑战 | sip.Status-Code == 401 |
| 查 nonce 算法 | sip.www_authenticate.string contains "AKAv1-MD5" |
| Cx 全集 | diameter.cmd.code >= 300 && diameter.cmd.code <= 305 |
| IPsec 加密段 | esp 配合 SPI 过滤 |
Q1:IMPI 和 IMPU 到底有什么区别?为什么注册要分开?
A:IMPI 是私有身份(如 [email protected] 或由 IMSI 派生 [email protected]),只用于鉴权,对其他用户不可见;IMPU 是公共身份(如 sip:[email protected]、tel:+86...),用于路由与被叫。分开是因为鉴权与服务可达性是两个正交问题:鉴权看"你是谁"(IMPI+K),可达性看"怎么找到你"(IMPU+Contact+Path)。
Q2:IMS-AKA 的 nonce 为什么要塞 RAND 和 AUTN?
A:因为 SIP Digest 的 nonce 字段是标准里唯一允许自由携带挑战数据的载体。把 AKA 的 RAND(随机挑战)和 AUTN(含 MAC+SQN 的鉴权令牌)编码进 nonce,就能在不修改 SIP 消息结构的前提下复用整套 AKA 机制,实现双向鉴权并让 UE 本地推演出 IPsec 密钥——这是 RFC 3310 的核心巧思。
Q3:第二次 REGISTER 经过 I-CSCF 时,HSS 怎么知道选哪个 S-CSCF? A:严格按 TS 23.228,S-CSCF 名称是经 Cx-SAR 才"正式"写入 HSS 的。而第二次 REGISTER 发生在 SAR 之前,所以此时 I-CSCF 的 Cx-UAR 仍可能拿到能力集;实践中 I-CSCF 会结合本地缓存/亲和性再次选到同一 S-CSCF,待鉴权通过后 SAR 才把名称固化下来。这也是不同厂商时序略有差异的根因。
Q4:VoNR 下的 IMS 注册和 VoLTE 有本质区别吗? A:IMS 注册流程本身(Gm/Mw/Cx 上的 SIP 与 Diameter)几乎不变。差异在承载与 P-CSCF 发现:VoLTE 走 EPS bearer + DHCP/PCO 拿 P-CSCF;VoNR 走 5G PDU 会话(IMS 专用 DNN,5QI=5 信令 / 5QI=1 语音)+ PCF 经 ePCO 下发 P-CSCF。即"IP-CAN 换了,IMS 核心网注册机制照旧"。
Q5:如果 AUTN 中的 SQN 不同步会怎样?
A:UE 校验 SQN 新鲜性失败时会进入重同步流程:在第二条 REGISTER 的 Authorization 中携带 auts 参数(带 UE 侧当前 SQN)回传给 HSS,HSS 据此调整计数器后重新下发 AV,UE 再完成注册。抓包上会看到一次带 auts 的 REGISTER 与紧接着的再次 401/200。
本文由「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 等场景全覆盖。
