织梦CMS - 轻松建站从此开始!

罗索

理解SIP对话

落鹤生 发布于 2014-03-21 21:41 点击:次 
Dialog是SIP中的一个关键概念。根据RFC3261,会话是两个UA之间持续一段时间的点到点的SIP连接,即是记录两者已经连接上的相关内容实体,方便在对话中请求进行识别和处理。
TAG: SIP  RFC3261  

Dialog是SIP中的一个关键概念。根据RFC3261,会话是两个UA之间持续一段时间的点到点的SIP连接,即是记录两者已经连接上的相关内容实体,方便在对话中请求进行识别和处理。

    对话都是有对话ID来标识的,包括Call-ID,一个本地标签(From-tag)和一个远端标签(To-tag)。即是说三者确定了某个对话的存在。

    对话中还包括一些对话中的后续消息所需的状态,包括:对话ID、本地序列号、远端序列号、本地URI、远端目的、布尔型标记“secure”和路由集。路由集是一个顺序的URI集,指定发送请求到目的地所需遍历的服务器地址。

会话的状态有初始状态和确认状态。当临时的相应被创建时,即标记对话的三个因素刚齐全时为初始状态;而收到2**的最后响应到达时转为确认状态,如果是其他响应或无响应到达,初始状态终结。

如下所示


1-1 对话建立过程

1.       创建对话

1)          UAS

       i.  路由集由请求的Record-Route头字段提供,并要保留顺序和URI参数,实时更新,如果下一轮的请求中无Record-Route头字段,则路由集变为空

       ii. 本地URI填入回应的Contact头字段

       iii.布尔型标记“secure”,如果请求基于TLS(传输层安全协议),则由Request-URI中的secure参数来提供

       iv. 远端目的由请求的Request-URI提供

       v.  From-tag可能不存在,则默认为空

2)          UAC

       i.  路由集必须为响应消息中的Record-Route头字段的URI列表,保持相反的顺序和保留所有的URI参数

       ii. 远端目的为响应消息的Contact头字段的URI

       iii. 本地序列号为请求消息的CSeq头字段的序列号值

       iv. 远端序列号必须为空,当远端UA发送一个本次对话中的请求后该值才能确定

       v.  To-tag可能不存在,则默认为空

 

2.       对话中的请求

对话创建后,UA方可能需要建立新的事务,这时发起请求的UA为UAC,这可能跟对话创建之时的角色不同。re-INVITE是一种对话中修改目的URI的重新请求。

1)          UAC行为

       i.  发起请求

        一个对话中的请求消息有对话所保存的状态信息来构建。

          1. 请求消息的To头字段的URI必须设置为对话状态的远端URI

          2. 请求消息的To头字段的标签值设置为对话ID的远端标签值

          3. 请求消息的From头字段的URI必须设置为对话状态的本端URI

          4. 请求消息的From头字段的标签值设置为对话ID的本端标签值

          5. 请求消息的Call-ID必须设置为对话的Call-ID

       而对话中的其它字段同样有限制:

          6. CSeq序列号。CSeq是按照各自方向严格增1的值,如果为空则设为初始值。

          7. Request-URI由远端目的指定

          8. Route由路由集指定,如果路由集为空,则无Route字段。如果路由集的第一个URI中包含lr参数,UAC必须将Request- URI设置为远端目的URI值;如果路由集的第一个URI中不包含lr参数,UAC必须将Request-URI设置为路由集的第一个URI,且不允许去 掉任何参数,同时Route头字段在最后增加一个目的URI。

          9.Contact。对话中任何一个更新目的的请求消息包含一个Contact头字段,Contact字段内URI为对话的远端目的URI。

如果UAC收到对目的刷新请求消息的2**响应时,UAC必须将对话的远端目的URI设置为存在Contact字段的URI值。如果响应为481(呼叫/事务不存在)或408(请求超时),UAC应该终止对话;在无对方响应时也应该终止对话。

2)  UAS行为

     i. 如果请求To字段存在标签值。UAS内核会计算与此请求相关的对话标签值,同时与已有的对话标签值比较,如果匹配则为同一个对话中的请求。此时UAS采用与对话外请求消息处理规则相同的流程进行处理;如果不存在匹配的对话,UAS可以拒绝(481)或接受这个请求。

     ii.如果远端序列号为空,则设置为请求消息中CSeq字段的序列号值;如果远端序列号存在并大于请求的CSeq序列号值,则认为请求次序颠倒,回500(服务器内不出错)消息。

 

3.       终止对话

初始状态的对话不依赖于发起请求的具体方法,只要收到一个非2**的终止响应即可将其终止;确认状态的对话的终止与确切方法相关,BYE方法终止一次会话并终止与其相关的对话。

(zhshao)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201403/16934.html]
本文出处:新浪博客 作者:zhshao
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容