路由
注册路由
一、UE未协带鉴权发起注册
该小节讲述注册过程中,各网元路由走向,及路由相关的特定字段,并不详细描述注册机制的细节(如AKA鉴权将在“AKAj鉴权”小节进行描述)。
-
从UE到P-CSCF
UE获取P-CSCF的方式有三种:
-
针对移动终端通过GPRS接入,在UE进行PDP上下文建立过程中,GGSN可以在PDP上下文激活请求的应答中返回P-CSCF地址信息。
-
UE也可以通过DHCP获取指定的P-CSCF地址信息。
-
UE也可以手工配置指定的P-CSCF地址信息,当前我们使用这种方式。
1、UE向 P-CSCF发起注册请求:
REGISTER sip:open-ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Contact:<sip: 1.1.1.1>; expires=600
Route:<sip:1.1.1.2;lr>
-
请求URL指明需要注册到open-ims.test的归属域中。
-
VIA告诉P-CSCF,针对这次注册事务请求的应答,应该发向哪里。
-
Contact告诉P-CSCF,后续如果想主动给UE发起事务请求,应该发向哪里。
-
Route头域为下一跳地址,这里指明当前注册请求下一跳要发给P-CSCF的地址。注意当前我们设备在处理下一跳过程中,没有使用预置Route的机制,而是使用了outband的机制,所以当前设备在注册过程中不会出现Route头域信息。
-
从P-CSCF到I-CSCF
2、P-CSCF向I-CSCF转发注册请求
P-CSCF收到注册请求后,如果有Route头域,并且第一个Route头域是自身时则去除该条头域信息,之后如果发现没有其它Route头域信息,则通过请求URL中的信息进行DNS查询,假设这里DNS查询成功,对应的IP 地址为I-CSCF的地址,则P-CSCF将该注册请求转发到I-CSCF,在转发之前P-CSCF还将自己地址加入到Via消息头中,以便让回来的注册应答经过它。
同时P-CSCF还添加一个比较关键的头域Path,该头域主要用于告诉S-CSCF,当前该关联帐号经过的P-CSCF地址信息,之后S-CSCF在收到该注册请求后,会记录Path头域的值,用于以后该用户做为被叫时,S-CSCF知道将呼叫请求发向该用户关联的哪个P-CSCF。
REGISTER sip:open-ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Path:<sip:1.1.1.2;lr>
Contact:<sip: 1.1.1.1>; expires=600
-
从I-CSCF到S-CSCF
3、4、I-CSCF从HSS中获取指定的S-CSCF
I-CSCF查询HSS来找到为该注册服务提供服务的S-CSCF地址信息,如果该用户帐号在之前配置时没有指定S-CSCF,则I-CSCF为其选择一个默认的S-CSCF地址信息。
5、I-CSCF向S-CSCF转发注册请求
I-CSCF将自己地址信息加入到VIA头域,之后将注册请求转发到S-CSCF
REGISTER sip:open-ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.3; brach=1113
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Path:<sip:1.1.1.2;lr>
Contact:<sip: 1.1.1.1>; expires=600
-
从S-CSCF到I-CSCF
S-CSCF收到注册请求后,发现含有Path头域,则将该值进行存储,用于以后该用户做为被叫时,S-CSCF知道将呼叫请求发向该用户关联的哪个P-CSCF。
6、7、S-CSCF从HSS中获取鉴权向量
当注册请求没有包含完整注册信息时,S-CSCF向HSS获取鉴权向量,之后向用户发起鉴权挑战,即发送401消息。
8、S-CSCF到I-CSCF发送注册应答
S-CSCF通过之前注册请求的VIA列表,找到最顶端Via头域做为目标地址进行转发。
SIP/2.0 401Unauthorized
Via: SIP/2.0/UDP1.1.1.3; brach=1113
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
从I-CSCF到P-CSCF
9、I-CSCF向P-CSCF转发注册应答
I-CSCF收到注册应答后,发现最顶端Via头域为自身的地址信息,删除该头域信息,并将注册应答转发到下一Via头域。
-
从P-CSCF到UE
10、P-CSCF向UE转发注册应答
P-CSCF收到注册应答后,发现最顶端Via头域为自身的地址信息,删除该头域信息,并将注册应答转发到下一Via头域。
二、UE协带鉴权发起第二次注册
UE协带鉴权发起第二次注册的路由走向机制和第一次是一模一样的,这里仅简单说明图中红色标注的差异部分。
当S-CSCF收到UE的鉴权请求,并且验证鉴权正确后,S-CSCF更新HSS中的数据为注册成功,同时从HSS中获取用户服务配置信息。
之后S-CSCF添加比较关键的信令头域Service-Route,该头域值通常为S-CSCF地址信息,主要避免后续每次从UE发来的信令请求都要经过I-CSCF查找S-CSCF,该头域信息最终经过I-CSCF、P-CSCF转发到终端侧,终端侧发现注册响应中含有Service-Route头域,则将其保存在本端,待后续向IMS网络发起信令请求时,做为预置路由设置到信令的Route头域。
SIP/2.0200 OK
Service-Route:<sip:1.1.1.4; lr>
会话路由
呼叫归属网内用户
这里假设UE_A通过P-CSCF(1)注册到S-CSCF上,UE_B通过P-CSCF(2)注册到S-CSCF上,P-CSCF(1)和P-CSCF(2)都属于归属网内的网元,这样UE_A和UE_B就都在同一个归属网内。
-
从UE_A到P-CSCF(1)的Invite请求
INVITEsip:UE_B@ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Route:<sip:1.1.1.2;lr>
Route:<sip:1.1.1.4;lr>
-
请求URL指明需要呼叫发送到在UE_B。
-
VIA告诉P-CSCF,针对这次事务请求的应答,应该发向哪里。
-
这里有两条Route头域,其中第一条是终端已知的P-CSCF(1)地址,表示下一跳首先发给P-CSCF(1),第二条Route头域是S-CSCF的地址,该地址信息就是在之前向S-CSCF注册过程中,由S-CSCF在200 OK里协带的Service-Route头域值(参考“UE协带鉴权发起第二次注册”小节)。
备注:
终端在进行路由头域添加时,如果有手工配置的预置路由条目,则一定要将该路由条目添加到由Service-Route导入的路由条目之前。
另外,我们设备在处理下一跳过程中,没有使用预置Route的机制,而是使用了outband的机制,所以当前设备在Invite信令处理时应该仅出现S-CSCF那条路由,不会出现P-CSCF那条路由。
-
从P-CSCF(1)到S-CSCF的Invite请求
P-CSCF(1)收到Invite请求后,如果Route头域的顶端含有自己的地址,则将该Route头域删除,将自己的址址添加到Via头域中,用于该请求的应答可以经过自身,之后查看如果还有Route头域,并且该址址为松散路由类型,则将呼叫转发到下一跳路由头域地址。
INVITEsip:UE_B@ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Route:<sip:1.1.1.4;lr>
-
从S-CSCF到AS的Invite请求
这里假设UE_A的服务信息中配置了如下触发规则:
-
匹配启始呼叫
-
并且需要匹配INVITE方法
当S-CSCF通过UE_A的IFC规则匹配成功后(该触发规则是注册成功时,S-CSCF从HSS中下载下来的),根据IFC中配置指定的AS地址信息,将呼叫转发到AS,在转发呼叫请求之前,S-CSCF做如下处理:
-
将自己的地址添加到Via头域,用于后续请求事务的应答还经过自身
-
将自己的地址添加到Route头域顶端,用于AS收到该请求后,可以再将请求发回给S-CSCF。
INVITE sip:UE_B@ims.testSIP/2.0
Via: SIP/2.0/UDP1.1.1.4; brach=1114
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Route:<sip:1.1.1.4;lr>
-
从AS到S-CSCF的Invite请求
这里假设AS不做任何特殊业务处理,仅仅是将呼叫请求进行转发,AS查找含有Route头域,第一个Route头域为松散路由,则将呼叫转到下一跳路由。在转发请求之前,AS将自己的地址添加到VIA头域中。
INVITEsip:UE_B@ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.5; brach=1115
Via: SIP/2.0/UDP1.1.1.4; brach=1114
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Route:<sip:1.1.1.4;lr>
-
从S-CSCF到P-CSCF(2)的Invite请求
S-CSCF再次收到INVITE请求后,继续检查是否还有其它IFC规则可以匹配,如果找不到,则执行正常的处理流程。
如果Route头域顶端为自身地址,则将该Route头域进行删除,之后没有任何Route头域时,S-CSCF查询请求URL,它发现被叫信息在当前归属域中,并且与P-CSCF(2)有关联(注:P-CSCF(2)地址信息是之前P-CSCF(2)向S-CSCF转发注册流程时候,通过Path头域协带的,S-CSCF将该Path值进行保存,参考《注册路由》小节),则将Invite请求转到P-CSCF(2),在转发请求之前S-CSCF做如下处理:
-
将自己的地址添加到VIA头域中
-
同时因为S-CSCF是UE_B的注册登记服务器,它知道UE_B的实际联系地址,则在请求URL中,替换为UE_B的真实地址。
INVITEsip:UE_B@2.2.2.2 SIP/2.0
Via: SIP/2.0/UDP1.1.1.4; brach=1116
Via: SIP/2.0/UDP1.1.1.5; brach=1115
Via: SIP/2.0/UDP1.1.1.4; brach=1114
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
从P-CSCF(2)到UE_B的Invite请求
P-CSCF(2)收到该请求后,根据请求URL中的信息,将Invite请求转给UE_B,在转发之前,将自己的地址信息加入到VIA头域。
INVITEsip:UE_B@2.2.2.2 SIP/2.0
Via: SIP/2.0/UDP1.1.1.6; brach=1117
Via: SIP/2.0/UDP1.1.1.4; brach=1116
Via: SIP/2.0/UDP1.1.1.5; brach=1115
Via: SIP/2.0/UDP1.1.1.4; brach=1114
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
从UE_B到P-CSCF(2)的Invite应答
UE_B收到请求后,进行应答处理,将顶端VIA头域做为目标地址进行发送。
SIP/2.0 180 Ring
Via: SIP/2.0/UDP1.1.1.6; brach=1117
Via: SIP/2.0/UDP1.1.1.4; brach=1116
Via: SIP/2.0/UDP1.1.1.5; brach=1115
Via: SIP/2.0/UDP1.1.1.4; brach=1114
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
从P-CSCF(2)到S-CSCF的Invite应答
P-CSCF(2)收到应答后,去除顶端VIA为自身地址的头域,取下一VIA头域做为目标地址进行发送。
SIP/2.0 180 Ring
Via: SIP/2.0/UDP1.1.1.4; brach=1116
Via: SIP/2.0/UDP1.1.1.5; brach=1115
Via: SIP/2.0/UDP1.1.1.4; brach=1114
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
从S-CSCF到AS、从AS到S-CSCF、从S-CSCF到P-CSCF(1)、从P-CSCF(1)到UE_A的Invite应答
这几个流程处理都相同,都是检查顶端VIA是否含有自身的地址,如果含有则去顶该头域,并取下一VIA头域做为目标地址进行发送,最终180应答按原路返回到UE_A。
呼叫拜访网内用户
上图为了简化复杂度,在拜访网及归属网中都没有涉及AS服务模块,这里假设两个网络的用户都没有配置任何IFC业务触发规则。
这里假设UE_A的归属域为aaa.ims.test,UE_B的归属域为bbb.ims.test
-
UE_A到P-CSCF
INVITEsip:UE_B@bbb.ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Route:<sip:1.1.1.2;lr>
Route:<sip:1.1.1.4;lr>
-
请求URL指明需要呼叫发送到在UE_B。
-
VIA告诉P-CSCF,针对这次事务请求的应答,应该发向哪里。
-
这里有两条Route头域,其中第一条是终端已知的P-CSCF地址,表示下一跳首先发给P-CSCF,第二条Route头域是UE_A的S-CSCF的地址,该地址信息就是在之前UE_A向S-CSCF注册过程中,由S-CSCF在200 OK里协带的Service-Route头域值(参考“UE协带鉴权发起第二次注册”小节)。
备注:
终端在进行路由头域添加时,如果有手工配置的预置路由条目,则一定要将该路由条目添加到由Service-Route导入的路由条目之前。
另外,我们设备在处理下一跳过程中,没有使用预置Route的机制,而是使用了outband的机制,所以当前设备在Invite信令处理时应该仅出现S-CSCF那条路由,不会出现P-CSCF那条路由。
-
P-CSCF到S-CSCF
P-CSCF收到Invite请求后,如果Route头域的顶端含有自己的地址,则将该Route头域删除,将自己的址址添加到Via头域中,用于该请求的应答可以经过自身,之后查看如果还有Route头域,并且该址址为松散路由类型,则将呼叫转发到下一跳路由头域地址。
INVITE sip:UE_B@bbb.ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
Route: <sip:1.1.1.4;lr>
-
aaa.ims.test归属域的S-CSCF到bbb.ims.test归属域的I-CSCF
S-CSCF收到Invite请求后,如果Route头域的顶端含有自己的地址,则将该Route头域删除,将自己的地址添加到Via头域中,之后没有Route头域了,则S-CSCF分析请求URL中的域信息,发现不属于自身域,则通过DNS查询bbb.ims.test的地址信息(当前为UE_B域中的I-CSCF),将该呼叫发向解析后的地址信息。
INVITE sip:UE_B@bbb.ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.4; brach=1113
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
I-CSCF通过HSS查询指定的S-CSCF
I-CSCF查询HSS来找到为UE_B提供服务的S-CSCF地址信息,如果该用户帐号在之前配置时没有指定S-CSCF,则I-CSCF为其选择一个默认的S-CSCF地址信息。
I-CSCF将自己地址信息加入到VIA头域,之后将注册请求转发到S-CSCF
INVITE sip:UE_B@bbb.ims.test SIP/2.0
Via: SIP/2.0/UDP1.1.1.5 ;brach=1114
Via: SIP/2.0/UDP1.1.1.4; brach=1113
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
bbb.ims.test归属域的S-CSCF到bbb.ims.test归属域的P-CSCF
S-CSCF查询请求URL,它发现被叫信息在当前归属域中,并且与P-CSCF有关联(注:P-CSCF地址信息是之前P-CSCF向S-CSCF转发注册流程时候,通过Path头域协带的,S-CSCF将该Path值进行保存,参考《注册路由》小节),则将Invite请求转到P-CSCF,在转发请求之前S-CSCF做如下处理:
-
将自己的地址添加到VIA头域中
-
同时因为S-CSCF是UE_B的注册登记服务器,它知道UE_B的实际联系地址,则在请求URL中,替换为UE_B的真实地址。
INVITEsip:UE_B@2.2.2.2 SIP/2.0
Via: SIP/2.0/UDP1.1.1.6 ;brach=1115
Via: SIP/2.0/UDP1.1.1.5 ;brach=1114
Via: SIP/2.0/UDP1.1.1.4; brach=1113
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
bbb.ims.test归属域的的P-CSCF到UE_B
P-CSCF收到该请求后,根据请求URL中的信息,将Invite请求转给UE_B,在转发之前,将自己的地址信息加入到VIA头域。
INVITEsip:UE_B@2.2.2.2 SIP/2.0
Via: SIP/2.0/UDP1.1.1.7 ;brach=1116
Via: SIP/2.0/UDP1.1.1.6 ;brach=1115
Via: SIP/2.0/UDP1.1.1.5 ;brach=1114
Via: SIP/2.0/UDP1.1.1.4; brach=1113
Via: SIP/2.0/UDP1.1.1.2; brach=1112
Via: SIP/2.0/UDP1.1.1.1; brach=1111
-
UE_B将应答沿路返回到UE_A
UE_B回应180应答,一路流程都基本相同,都是检查顶端VIA是否含有自身的地址,如果含有则去顶该头域,并取下一VIA头域做为目标地址进行发送,最终180应答按原路返回到UE_A。
呼叫PSTN用户
针对呼叫PSTN用户的流程,不做很细节的信令描述,关于信令流程可以参考以上“呼叫归属网内用户”、“呼叫拜访网内用户”小节描述,这里仅对一些关键点进行描述说明。
当UE的呼叫发送到S-CSCF时,S-CSCF判别当前呼叫指向PSTN网络,则将呼叫转发给出口网关控制服务器(BGCF),BGCF根据本地策略发现当前呼叫的目的PSTN属于本地域(当前图例假设为本地域,如果目的PSTN非本地域,则BGCF将呼叫转发给另一网络的BGCF),则将呼叫转发给对应的媒体网关控制服务器MGCF,之后MGCF控制媒体网关(MGW)将呼叫转换到PSTN网络。
参考文档:
《中国电信IMS网络SIP协议总体技术要求》
《RFC3608》
《中国联通IMS设备规范 第二分册:用户数据管理类设备》
《IMS-移动领域的IP多媒体概念和服务》