SIP消息路由机制

一:请求路由
松散路由(Loose Router)和严格路由(Strict Router),这是SIP协议(RFC3261)中的一个非常重要的概念。
在SIP消息的Route头域或Record-route头域中,携带的域值是SIP URI或SIPS URI,如果这个URI带有”lr”属性值,那么,就表示URI的地址所标识的SIP PROXY是松散路由的,否则,是严格路由的。如Record-Route: <sip:p1.example.com;lr>、Route: <sip:p2.example.com;lr>。

松散路由是RFC3261所定义的消息路由规则,而严格路由则是RFC2543中所定义的路由规则。松散路由提供了对严格路由的兼容机制。路由规则中,涉及了对Request URI域值的处理。严格路由时,要求Request URI为路由地址。
严格路由是一种比较“死板”的理由机制,这种路由机制在SIP协议的前身RFC 2534中定义,其机制非常简单。它要求收到的消息的request-URI必须是自己的URI,然后它会把第一个Route头域“弹”出来,并把其中的URI作为新的request-RUI,然后把该消息路由给该URI。而松散路由则提供了一种更为灵活的机制。
处理步骤:

Proxy首先会检查消息的request-URI是不是自己属于自己所负责的域。如果是,它就会通过定位服务将该地址“翻译”成具体的联系地址并以此替换掉原来的request-URI;否则,它不会动request-URI。
PROXY首先检查路由表中的第一个地址是否为自己,如果是则从表中删除。
严格路由在发往下一跳前,将Request URI的域值更新为路由表中的表头地址(下一跳)。
松散路由将路由如果发现Request URI是自己插入到路由表中的地址。从路由表中取出最后一个地址更新Request URI,并删除最后一个地址。
松散路由检查下一跳是否为严格路由。如果不是,不处理;否则,将Request URI插入到路由表表尾,并用下一跳地址(严格路由的地址)更新Request URI。
如果路由表为空,则路由给Request URI。
路由机制用于请求消息的路由,其中Route头域携带路由表信息,而Record-Route头域则是SIP PROXY想让自己保留在后续dialog中而插入的记录。也就是说,通常初始化时,发起终端是没有路由表的(当然也可以强制配置,这样局限性太强),完成第一次消息交互后,双方根据Record-Route信息,各自更新路由表。
二:应答消息路由
SIP应答消息的路由机制,相对请求来说,比较简单,基本思想就是,请求从哪里来,应答回哪里去。那是如何实现的呢?很简单,Via头域就是完成这个差事的。Via头域表说明了SIP请求实际的路由过程,用于应答消息的回程路由。
下面是一个via的示例(注意,换行仅是为了增强可读性,没其它意思)
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8
;received=192.0.2.1

其中pc33.atlanta.com部分称为sent-by属性,表明了消息在本站点的具体发送地址。每个SIP PROXY在前转SIP请求消息时,都必须在Via表前端插入自己的via(称为top VIA)并说明sent-by。而“received=192.0.2.1”这一参数则说明了消息到达本站点时的源地址。
当UAS发送应答时,往top VIA所指示的地址发送(received优先于sent-by)。当SIP PROXY路由应答消息时,首先检查top VIA是不是自己,不是则不处理,是则删除top VIA,并继续前转。所以,当源发起端收到应答时,应答消息中应该只有一个VIA头域,并且是指向自己的,否则就应该丢弃。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/niino/archive/2010/06/30/5705102.aspx

你可能感兴趣的:(IP)