好的,专家讲师。我将继续为您撰写SIP协议深度解析系列的第四篇。本篇将深入剖析 SIP 路由机制的基础,重点讲解 ViaRequest-URIRecord-Route 这三个核心头域,并结合运营商规范,阐释 P-CSCF 如何利用它们进行信令路径的维护和校验。


VoLTE高清语音技术精要(四):SIP路由机制(一):Via、Request-URI 与 Record-Route 详解

1. 导论:SIP路由的哲学:请求寻址与路径记录

IMS(IP Multimedia Subsystem)网络是高度分布式的,一个简单的呼叫建立请求(INVITE)可能需要穿越数十个信令跳(Hop),涉及多个CSCF、AS和边界控制器(SBC/IBCF)。因此,SIP协议必须提供强大而灵活的路由机制。

SIP路由机制的核心在于解决两个根本问题:

  1. 请求路由(Request Forwarding):如何将当前的请求消息(如 INVITE, REGISTER, BYE)准确地送到下一跳网元,并最终送达会话的逻辑终点?
  2. 响应路由和对话持续性(Response & Dialog Maintenance):请求被处理后,响应消息如何原路返回?会话建立后,后续的所有信令消息(如 BYE, UPDATE)如何沿原路径传输,以维持对话上下文?

本章将深入解析实现这两个机制所需的三个核心 SIP 头域:Request-URI 负责初始目标寻址,Via 负责事务的逐跳路由和响应返回,而 Record-RouteRoute 负责对话的持续性路由。

2. Request-URI:请求的寻址目标

Request-URI(请求统一资源标识符)位于 SIP 请求消息的起始行(Request-Line)中,是 SIP 协议用于确定请求初始目标的地址字段。

2.1 Request-URI 的格式与类型

Request-URI 可以使用 SIP、SIPS 或 TEL URI 格式。在 IMS 网络中,URI 的格式选择和转换是实现电信级呼叫的重要步骤:

URI 格式示例核心用途IMS 路由处理
SIP/SIPS URIsip:[email protected]标识用户或网元,IMS域内路由的基本格式。S-CSCF 和 I-CSCF 通过域名(domain.com)进行 DNS/ENUM 查询和路由决策。
TEL URItel:+86139xxxx1234E.164 电话号码格式。IMS 网元(如 S-CSCF)必须将其转换为 SIP URI 或通过 ENUM/DNS 查询(如江苏省二级 ENUM/DNS 查询)来确定归属域的下一跳地址。
URNurn:service:sos.police统一资源名称。用于紧急呼叫,由核心网(如 E-CSCF)识别并路由到对应的 PSAP(公共安全应答点)。

2.2 Request-URI 在路由中的作用

  1. 初始目标:对于对话初始请求(如 REGISTER, INVITE),Request-URI 指定了请求应该被转发到的逻辑目的地下一跳代理的地址
  2. 路由重写:当请求在 IMS 网络中流动时,代理服务器(Proxy)可能会根据其路由逻辑或运营商策略修改 Request-URI 的值,但这必须谨慎进行,通常是当代理确切地知道最终的下一步目标时。
  3. 终结请求处理:对于发往终端(UE)的对话初始请求,P-CSCF 在转发给终端之前,应在 Request-URI 中包含终端的 URI。

3. Via 头域:事务路由与响应路径的保障

Via 头域是 SIP 协议中实现请求逐跳路由(Hop-by-Hop Routing)和响应反向路由(Reverse Routing)的核心机制。它确保了响应消息能够沿着与请求消息完全相同的路径原路返回。

3.1 Via 头域的结构与工作机制

Via 头域是一个列表,请求每经过一个 SIP 代理,该代理就会将自己的地址(IP 地址/端口)添加到 Via 列表的最顶端

Via 组成要素作用运营商关注点
SIP 版本协议版本,如 SIP/2.0
传输协议承载 SIP 消息的协议,如 UDP, TCPVoLTE 信令通常通过 UDP 或 TCP 承载。
地址与端口代理的 IP 地址或域名及端口。P-CSCF/SBC 在转发到下一跳之前,必须将自己的地址添加到 Via 列表顶端。
分支参数 (branch)branch=z9hG4bK...,唯一标识一个事务确保请求和所有响应(包括重传)能够正确关联到同一个事务。
Rport/Receivedrport(客户端端口)和 received(客户端IP地址)。用于处理 NAT/防火墙场景。当代理收到请求时,会根据实际源地址填充这两个参数,指导响应返回到正确的公网地址。

3.2 响应消息的路由规则

当 UAS 或代理生成响应消息(如 200 OK, 183 Session Progress)时,它不会使用 RouteRequest-URI 进行路由。它仅检查 Via 列表:

  1. 移除最顶端 Via:UAS/代理将响应发送给 Via 列表最顶端记录的地址。
  2. 逐跳 Pop:接收到响应的代理检查自己是否是 Via 列表的第二个条目。如果是,它移除顶端的 Via 条目,并重复步骤 1,直到响应到达发起请求的 UAC。

3.3 P-CSCF 对 Via 头域的严格校验要求

作为 IMS 的接入实体,P-CSCF 必须确保 Via 列表的完整性和一致性,这在运营商规范中被严格要求:

P-CSCF 场景动作要求引用标准
收到 UE 目标刷新请求如果 Route 头域列表与已保存的 Record-Route 列表匹配,P-CSCF 必须在 Via 头域最顶端增加 P-CSCF 的地址。
收到发往 UE 的请求P-CSCF 必须将 P-CSCF 的地址添加到 Via 列表的最顶端。
收到任何响应P-CSCF 必须确认响应中的 Via 列表是否与同一对话的请求消息中保存的 Via 列表相匹配
Via 列表不匹配如果 Via 列表不匹配,P-CSCF 应丢弃该响应,或者用保存的 Via 列表替换响应中的 Via 头。
初始 INVITE 请求P-CSCF 应给所有的 INVITE 请求回送 100 (Trying) 临时响应。 注意100 (Trying) 响应是特殊的,它不会被有状态代理向上游转发,仅在逐跳链路上使用,以防止 UAC 因超时而重传 INVITE。

4. Record-Route 与 Route:对话的路由锚定

Record-RouteRoute 头域共同作用,实现了 对话的持续路由。它们确保了一旦会话建立,后续所有对话内的请求(如 BYE, Re-INVITE, UPDATE)能够沿着 IMS 核心网的同一路径进行。

4.1 Record-Route:记录路径

Record-Route 头域由 SIP 代理(Proxy) 在转发对话建立请求(如 INVITE, SUBSCRIBE)时添加。

  • 记录行为:如果一个代理希望在对话的生命周期内持续参与后续的信令交互,它必须将自己的 SIP URI 添加到 Record-Route 列表的最顶端
  • 用途Record-Route 记录了所有希望参与后续对话的中间代理地址。

4.2 Route:强制路由

Route 头域由 UAC(或 UAS 收到响应后的代理)生成,用于指定请求的强制路由路径

  • 生成规则:在对话建立后,UAC 发送后续对话内请求(如 BYE, UPDATE)时,它会使用保存在本地的 Record-Route 列表,将其内容反向复制到新请求的 Route 头域中。
  • 路由类型:SIP 代理在处理 Route 头时,通常遵循松散路由(Loose Routing),由 ;lr 参数指示。代理读取 Route 列表的最顶端 URI,并将其作为本次路由的下一跳地址,然后将该 URI 移动到 Route 列表的末尾。

4.3 运营商对路由列表的校验和维护

在 IMS 场景中,P-CSCF 和 S-CSCF 作为核心路由节点,肩负着验证和维护 Route 列表的重任。

4.3.1 P-CSCF 对后续请求的路由校验

运营商规范对 P-CSCF 接收来自 UE 的后续请求(如 BYE, UPDATE)时的处理流程有明确要求:

场景P-CSCF 校验/操作引用标准
目标刷新请求 (reINVITE/UPDATE)P-CSCF 必须确认请求中的 Route 列表是否与同一对话中保存下来的 Record-Route 列表相匹配。如果匹配,P-CSCF 在 Record-Route 顶端增加自己的 SIP URI。
独立事务请求/未知方法P-CSCF 应验证注册时保存的 Service-Route 头域的 URI 列表与收到请求中的 Route 头域是否匹配。
Route 列表校验失败P-CSCF 应回复 400 (Bad Request) 响应,且不再继续处理请求;或者用最新注册消息中的 Service-Route 头替换请求消息的 Route 头
请求无对应对话P-CSCF 收到 UE 发起的后续请求或独立请求,如果没有发现存在对应的对话,P-CSCF 应回复 403 (Forbidden) 响应,且不再转发该请求。
会话释放中收到请求当 P-CSCF 在释放对话的过程中收到关于对话的请求时,P-CSCF 应中止该请求,并回送响应 481 (对话或者事务不存在)

4.3.2 S-CSCF 对对话请求的路由检查

S-CSCF 在处理对话请求时,也会检查路由头以确认请求的来源和对话的上下文:

  • 当 S-CSCF 从服务用户或 PSI 接收到对话的最初请求或者独立会话的请求时,它应该检查是否 S-CSCF 以前放置在 Route 头域中的原始对话标识存在于到来请求 Route 头域的最高项
  • 如果不存在,表示该请求是第一次拜访该 S-CSCF。
  • 如果存在,则表示该请求是与一个现存对话的联系,且请求是从 AS 发来的对于先前发送请求的响应。

5. 计费标识的路由伴随:ICID 参数的插入

虽然计费头域 P-Charging-Vector 将在后续章节详细讨论,但在路由过程中,P-CSCF 负有插入其关键参数的责任。

  • P-CSCF 的计费锚点作用:P-CSCF 在接收到 UE 发起的独立事务请求(如 MESSAGE, OPTIONS)后,必须在 P-Charging-Vector 中增加 icid(IMS Charging Identifier,IMS 计费标识)参数。
  • 始发 INVITE 计费:P-CSCF 收到 UE 发起的 INVITE 请求时,也会插入 P-Charging-Vector,其中包含更新过的 access-network-charging-info 参数,并在转发给 S-CSCF 时包含该参数。

6. 信令日志实战分析:INVITE 请求的路径追踪

我们通过一个主叫 INVITE 消息穿越 P-CSCF 和 S-CSCF 的简化流程,观察 ViaRequest-URIRecord-Route 的变化。

场景: 主叫 UE(UE-A)发起呼叫,信令流经拜访地的 P-CSCF(P-CSCF1)和归属地的 S-CSCF(S-CSCF1)。

6.1 步骤 1:UE-A 发起 INVITE 请求

SIP 头域示例值关键作用分析
Request-LineINVITE sip:[email protected] SIP/2.0初始目标地址。
Via (1)SIP/2.0/UDP 10.1.1.10:5060;branch=z9hG4bKabc123UE 地址。该 branch 标识了 INVITE 事务。
Route<sip:pcscf1.visited.net;lr>包含 P-CSCF 的地址(由注册流程获得)。
Record-Route初始请求没有,由代理添加。
P-Preferred-Identity<sip:[email protected]>用户的期望身份(P-CSCF 将处理并删除)。

6.2 步骤 2:P-CSCF1 收到并转发 INVITE 请求

P-CSCF1 必须执行多项路由和身份处理功能,然后将请求路由到 S-CSCF1。

SIP 头域示例值关键作用分析
Request-LineINVITE sip:S-CSCF1.home.net SIP/2.0P-CSCF 根据路由决策(或 Route 头)将 URI 目标改为 S-CSCF1。
Via (2)SIP/2.0/UDP 20.1.1.20:5060;branch=z9hG4bKdef456P-CSCF 地址(新的顶端 Via)。
Via (1)SIP/2.0/UDP 10.1.1.10:5060;branch=z9hG4bKabc123...UE 地址(位于第二层)。
Record-Route (1)<sip:pcscf1.visited.net;lr>P-CSCF 将自己加入 Record-Route 列表顶端,锚定路由。
P-Asserted-Identity<sip:[email protected]>P-CSCF 删除了 P-Preferred-Identity,插入 P-Asserted-Identity
P-Charging-Vectoricid-value="pcscf.id.xyz..."P-CSCF 插入 ICID 计费锚点。

6.3 步骤 3:S-CSCF1 收到 INVITE 请求并转发到被叫域

S-CSCF1 检查 Record-Route,并执行业务逻辑(iFC)后继续路由。

SIP 头域示例值关键作用分析
Via (3)SIP/2.0/UDP 30.1.1.30:5060;branch=z9hG4bKghi789S-CSCF 地址(新的顶端 Via)。
Via (2)SIP/2.0/UDP 20.1.1.20:5060...P-CSCF 地址。
Via (1)SIP/2.0/UDP 10.1.1.10:5060...UE 地址。
Record-Route (2)<sip:scscf1.home.net;lr>S-CSCF 将自己加入 Record-Route 列表顶端,锚定路由。
Record-Route (1)<sip:pcscf1.visited.net;lr>P-CSCF 地址被推到第二层。

6.4 响应流:200 OK 响应的反向路由

当被叫侧返回 200 OK 响应时,路由路径如下:

  1. 被叫 UAS → S-CSCF1:UAS 收到 INVITE,发送 200 OK。它查看请求中的 Via 列表顶端(即 S-CSCF1),将响应发送给 S-CSCF1。
  2. S-CSCF1 → P-CSCF1:S-CSCF1 收到响应,删除顶端 Via(自己的地址),将响应发送给新的顶端 Via(P-CSCF1 的地址)。
  3. P-CSCF1 → UE-A:P-CSCF1 收到响应,删除顶端 Via(自己的地址),将响应发送给新的顶端 Via(UE-A 的地址)。P-CSCF 还会对响应中的 Via 列表进行严格匹配校验。

在这个过程中,Record-Route 列表(包含了 P-CSCF1S-CSCF1)被保存在各个网元中,用于指导后续的 BYEUPDATE 请求的路由。

7. 本章小结

IMS 网络路由的可靠性基于 SIP 协议对请求和响应的严格分离和管理:

  1. Request-URI 决定了 SIP 请求的初始寻址目标
  2. Via 头域是实现事务逐跳路由和响应消息原路返回的关键,每个代理都会在请求中将自己的地址压入 Via 栈的顶端。
  3. Record-Route 头域用于在对话建立时记录所有中间代理的地址,这些记录随后被转换为 Route 头域,指导所有后续对话请求(如 BYE, UPDATE)沿固定路径传输,从而维持 IMS 网络的会话状态和拓扑。

运营商规范(例如某运营商)对 P-CSCF 提出了严苛的路由校验要求,包括确保对话存在性(否则 403 Forbidden)和 Route/Record-Route/Service-Route 列表的精确匹配,以防止非法请求和会话劫持。


工程师进阶思考 (FAQ)

Q1:在运营商网络中,为什么 P-CSCF 必须对 UE 发起的“目标刷新请求”中的 Route 头域进行严格校验,确保其与已存储的 Record-Route 列表匹配?如果不匹配,会带来哪些风险?

A1: P-CSCF 必须对目标刷新请求(如 Re-INVITEUPDATE)中的 Route 头域进行严格校验,这是 IMS 会话状态完整性安全的关键保障。

  1. 状态维护:对话建立后,IMS 核心网元(特别是 P-CSCF 和 S-CSCF)会基于 Record-Route 确定的路径来存储会话状态、媒体参数和计费锚点信息。如果 Route 列表不匹配,后续请求可能会绕过某些必要的网元(如 AS 或 IBCF),导致业务逻辑(如计费、AS 业务)被旁路,造成“幽灵会话”或计费漏洞。
  2. 安全风险:如果 Route 列表被恶意篡改,可能导致信令流被重定向到非法的 SIP 实体,造成呼叫劫持或欺诈。因此,P-CSCF 必须检查传入的 Route 列表是否与之前建立对话时记录的路径一致。如果校验失败,P-CSCF 应返回 400 (Bad Request)

Q2:SIP 响应中的 Via 列表和 Record-Route 列表在 IMS 转发过程中有何本质区别?哪些网元会修改它们?

A2:

特征Via 列表Record-Route 列表
路由目的事务逐跳路由。指导响应消息如何沿原路返回 UAC。对话路由锚定。指导后续对话内请求(BYE, UPDATE)的端到端路由。
修改者请求沿路径转发时,每个代理请求中将自己地址添加在最顶端。代理希望参与对话时,在对话初始请求中将自己地址添加在最顶端。
状态维护响应到达时,每跳代理会将顶端 Via 移除(Pop)。仅在对话建立时记录,对话内请求(如 BYE)将 Record-Route 逆转为 Route,作为请求的转发指引。
IMS 关注点P-CSCF 必须验证 Via 列表与保存列表的匹配性。P-CSCF/S-CSCF 必须保存此列表并将其转换为 Route 以进行后续会话控制。

Q3:IMS 网络中的 SIP 消息中,P-CSCF 何时会删除 P-Preferred-Identity 头域并插入 P-Asserted-Identity 头域?

A3: 这发生在 P-CSCF 首次接收到来自 UE 的请求,并对其身份进行鉴权和断言的过程中。

  • P-Preferred-Identity (PPI):由终端(UE)携带,表示用户期望使用的身份。
  • P-Asserted-Identity (PAI):由 P-CSCF 插入,表示经过网络认证和断言的真实身份,用于信任域内传输。

根据运营商规范,当 P-CSCF 收到 UE 发起的独立事务请求(或未知方法请求):

  1. 如果请求中包含 P-Preferred-Identity 头域,P-CSCF 必须删除该头域。
  2. P-CSCF 必须插入 P-Asserted-Identity 头域,其值应为请求的发起者(即终端的 IMPU)。
  3. 如果 P-CSCF 收到发往 UE 的响应,且响应中含有 P-Preferred-Identity,P-CSCF 同样会删除 PPI,并插入 PAI,其值为收到请求时保存下来的 P-Called-Party-ID 中的参数。

简而言之,P-CSCF 在将信令转发到信任的核心网域之前,是身份断言的强制执行者


请您发出“请继续”指令,我将开始撰写第五篇。