SIP路由机制解析
SIP中存在两种路由场景:
- 1,请求消息的路由
- 2,响应消息的路由
<span style="font-family:'楷体';font-size:17px">其中,响应消息的路由非常简单,就是完全依靠Via来完成的。【说明:】一个SIP消息每经过一个Proxy(包括主叫),都会被加上一个Via头域,当消息到达被叫后,Via头域就记录了请求消息经过的完整路径。被叫将这些Via头域原样copy到响应消息中(包括各Via的参数,以及各Via的顺序),然后下发给第一个Via中的URI,每个Proxy转发响应消息前都会把第一个Via(也就是它自己添加的Via)删除,然后将消息转发给新的第一个Via中的URI,直到消息到达主叫。</span>
重要概念
路由集
Route Set: 路由集。路由集合是一个顺序的SIP或者SIPSURI。这些URI描述了传递一个请求所必须经历的代理列表。一个路由集可以是自适应的,因为包头中包含了Record-Route(记录路由),也可以是依赖配置得到的。(不包括目标地址)
相关头域说明
Request-URI:目标用户或者服务的地址。
Via: Via头域是用来描述请求当前经历的路径的,并且标志了应答所应当经过的路径。Via头域的branchID参数提供了事务的标志,并且用于proxy来检查循环路由。只有当需要通过选择传输设备到达下一个节点(hop)的时候,才需要在头域中包含Via域。
Contact: Contact头域提供了一个URI,指明了请求的资源或请求发起者,这个URI的含义取决于是在请求还是在应答中。
Record-Route:Record-Route头域是proxy在请求中增加的,用来强制会话中的后续请求经过本proxy的。
Route:Route头域用于强制一个请求经过一个proxy路由列表。
(strick routing)严格路由
<span style="font-family:'楷体';font-size:17px">Route头域中的值中包含lr参数部分为严格路由,不包含lr的为松散路由。严格路由实际指发送者指明了必须经过的路由,如果下一跳路由找不到就返回错误;</span>
如果Route头域的第一个值为严格路由,那么UA或Proxy必须根据下列步骤修改这个请求:
S_1、接收到的消息的request-URI必须是自己的URI
S_2、把第一个Route头域“弹”出来,并把其中的URI作为新的request-RUI.
S_3、然后把该消息路由到新的request-URI。
(loose routing)松散路由
<span style="font-family:'楷体';font-size:17px">Route头域中的值中不包含lr参数部分为松路由。松散路由的处理不要求必须经过定死的路由列表,它允许通过一些中间的转换再到达下一跳,比如:a-->b是,他可以是先到c再到b</span>
处理步骤:
1、Loose Router和Strict Router首先都会检查Router字段的第一个地址是否为自己,如果是则从Router字段中删除自己。
2、Strict Router在发往下一跳时将使用Router字段中的下一跳地址更新Request URI。
3、Loose Router首先会检查Request URI是否为自己:如果不是,则不作处理;如果是,则取出Route字段的最后一个地址作为Request URI地址,并从Route字段中删去最后一个地址。
4、Loose Router其次会检查下一跳是否为Strict Router:如果不是,则不作处理;如果是,则将Request URI添加为Route的最后一个字段,并用下一跳Strict Router的地址更新Request URI。
-
SIP-URI是一个Hop(节点)-to-Hop(节点)的属性,所以有可能被Proxy改变;
-
From和To属性在消息的路由过程中一直保持不变;它们在Request消息中确定,此后对端发来的所有Response消息的From和To都是原样拷贝Request消息中的From和To;
- Route优先级高于contact高于from