SIP路由机制解析

2018-05-07  本文已影响67人  耦耦

SIP中存在两种路由场景:

<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。


- Route优先级高于contact高于from

上一篇下一篇

猜你喜欢

热点阅读