事物(三)之服务端事务匹配请求
来源:互联网 发布:java 架构设计 编辑:程序博客网 时间:2024/06/06 09:13
当服务端从网络上收到一个请求以后,他必须和现有的事务进行判定。这个是根据下边的规则来判定的。
首先要检查请求中的Via头域的最上branch参数。如果他以z9hG4bk开头,那么这个请求一定是由客户端事务根据本规范产生的。因此,branch参数在该客户端发出的所有的事务中都是唯一的。根据下列规则我们可以判定请求是否和事务匹配:
1、 请求中的最上的Via头域的branch参数和创建本事务的请求的最上的Via头域的branch参数一样。
2、 请求的最上的Via头域的sent-by参数和创建本事务的请求的最上的Via头域的send-by参数一样。
3、 请求的方法和创建本事务的方法一样。这有一个例外,就是ACK,ACK对应的创建本事务的请求方法是INVITE
REGISTERsip:ims1.fj.chinamobile.com SIP/2.0
Via: SIP/2.0/UDP192.168.11.60:5060;branch=z9hG4bK2bd3cbe6
From:<sip:+865939008847@ims1.fj.chinamobile.com>;tag=444e8c67
To:<sip:+865939008847@ims1.fj.chinamobile.com>
Contact:<sip:+865939008847@192.168.11.60:5060>
Call-ID: Anta1380089120000200090839d978@192.168.11.60
CSeq: 5REGISTER
Expires: 120
Max-Forwards: 70
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP192.168.11.60:5060;branch=z9hG4bK2bd3cbe6
To:<sip:+865939008847@ims1.fj.chinamobile.com>;tag=ztesipP5HnDLxutGp-*1-2-16648*figi.1
From: <sip:+865939008847@ims1.fj.chinamobile.com>;tag=444e8c67
Call-ID:Anta1380089120000200090839d978@192.168.11.60
CSeq: 5REGISTER
Content-Length: 0
WWW-Authenticate: ******
REGISTERsip:ims1.fj.chinamobile.com SIP/2.0
Via: SIP/2.0/UDP192.168.11.60:5060;branch=z9hG4bK2caa2bf4
From:<sip:+865939008847@ims1.fj.chinamobile.com>;tag=444e8c67
To:<sip:+865939008847@ims1.fj.chinamobile.com>
Contact:<sip:+865939008847@192.168.11.60:5060>
Call-ID:Anta1380089120000200090839d978@192.168.11.60
CSeq: 6REGISTER
Authorization:****
Expires: 120
Max-Forwards: 70
Content-Length: 0
SIP/2.0 200 OK
Via: SIP/2.0/UDP192.168.11.60:5060;branch=z9hG4bK2caa2bf4
To:<sip:+865939008847@ims1.fj.chinamobile.com>;tag=ztesipqhGkDIjIEfPGdYnW*1-2-16640*figj.1
From:<sip:+865939008847@ims1.fj.chinamobile.com>;tag=444e8c67
Call-ID: Anta1380089120000200090839d978@192.168.11.60
CSeq: 6REGISTER
Contact:<sip:+865939008847@192.168.11.60:5060>;expires=120
P-Associated-URI:<sip:+865939008847@ims1.fj.chinamobile.com>
P-Associated-URI:<tel:+865939008847>
Date: Wed, 25 Sep 2013 06:09:55 GMT
Authentication-Info:nextnonce="70660aea19201d00c41d3fde7dc83f1a",qop=auth,rspauth="4a5bee09cd90dc7d6366d02f22c31d14",cnonce="6fd8cbb8",nc=00000001
Content-Length: 0
注意:send-by参数被用于匹配过程,这是因为有可能存在无意/恶意的相同的不同客户端传来的branch参数。
补充:Via头域的branch参数不存在,或者没有包含那个z9hG4bk,那么就用下列步骤进行判定。这是为了和RFC2543进行兼容的。
INVITE请求,并且这个INVITE请求的Request-URI,To tag,Fromtag,Call-ID,Cseq,和最上的Via头域,创建事务的INVITE请求的这些字段匹配,那么这个INVITE请求就是匹配这个事务的INVITE请求。在这个情况下,INVITE就是创建这个事务的INVITE请求的一个重发。ACK请求在匹配创建事务的INVITE请求的Request-URI, From tag, Call-ID ,Cseq序列号,最上的Via头域,并且To tag和服务端事务发出的应答的To tag相同,这个ACK就是这个事务的ACK。当这些头域比较完成,那么这个匹配也就完成了。在ACK比较中包含To tag的比较是为了在proxy上能够区别给2xx的ACK和给其他应答的ACK,这个proxy可能会转发全部的应答。一个匹配INVITE请求事务的ACK请求,如果这个INVITE请求已经被前一个ACK请求所匹配,那么这个ACK请求就是上一个ACK请求的重发。
INVITE sip:4002@192.168.50.69SIP/2.0
Via: SIP/2.0/UDP192.168.50.230:5060;branch=557fe9b7
From: "2002"<sip:2002@192.168.50.230>;tag=73d949ce
Contact:<sip:2002@192.168.50.230:5060>
To: <sip:4002@192.168.50.69>
Call-ID: Anta13832914324c24f8295aed0e44@192.168.50.230
CSeq: 12269INVITE
Max-Forwards: 70
SIP/2.0 100 Trying
Via: SIP/2.0/UDP192.168.50.230:5060;branch=557fe9b7
From: "2002"<sip:2002@192.168.50.230>;tag=73d949ce
To: <sip:4002@192.168.50.69>
Call-ID: Anta13832914324c24f8295aed0e44@192.168.50.230
CSeq: 12269 INVITE
SIP/2.0 180 Ringing
Via:SIP/2.0/UDP 192.168.50.230:5060;branch=557fe9b7
From: "2002"<sip:2002@192.168.50.230>;tag=73d949ce
To: <sip:4002@192.168.50.69>;tag=1755460001
Call-ID: Anta13832914324c24f8295aed0e44@192.168.50.230
CSeq: 12269INVITE
Contact: <sip:4002@192.168.50.69:35805;user=phone>
SIP/2.0 200 OK
Via: SIP/2.0/UDP192.168.50.230:5060;branch=557fe9b7
From: "2002"<sip:2002@192.168.50.230>;tag=73d949ce
To: <sip:4002@192.168.50.69>;tag=1755460001
Call-ID: Anta13832914324c24f8295aed0e44@192.168.50.230
CSeq: 12269INVITE
Contact:<sip:4002@192.168.50.69:35805;user=phone>
ACKsip:4002@192.168.50.69:35805;user=phone SIP/2.0
Via: SIP/2.0/UDP192.168.50.230:5060;branch=557fe9b7
From: "2002"<sip:2002@192.168.50.230>;tag=73d949ce
To: <sip:4002@192.168.50.69>;tag=1755460001
Call-ID: Anta13832914324c24f8295aed0e44@192.168.50.230
CSeq: 12269ACK
注意:应答是一个2xx应答,那么ACK并不认为是事务的一部分,ACK和INVITE属于不同的两个事务;终结应答不是一个2xx应答的时候,事务还包括一个ACK。
补充:user=phone 表示SIP的用户信息部分必须是TEL URL(TEL URL文档 RFC3966)。Contact: <sip:4002@192.168.50.69:35805;user=phone>
建议:学习下OSIP,OSIP是一个开源的SIP协议栈库,该协议栈的层次性比较强。支持基于UDP、TCP和STCP协议的SIP消息的协议栈。
- 事物(三)之服务端事务匹配请求
- 事物(二)之客户端事务应答匹配
- webService之(三)CXF服务端
- Spring之Spring事物管理(三)
- C#事务处理(三)之Transactions事务
- Spring事务之三(DriverManagerDataSource)
- Redis之三:事务
- jdbc分页+事务 事物
- sql事务及事物
- Dubbo源码分析(三):Dubbo之服务端(Service)
- Dubbo源码分析(三):Dubbo之服务端(Service)
- Dubbo源码分析(三):Dubbo之服务端(Service)
- boost库在工作(33)网络服务端之三
- pathon爬虫(三)之post请求
- spring的事务-事物的传播性(转)
- sql serverl 事物回滚三(try...catch事务回滚)
- java三大框架之spring的声明式事物
- android服务端客户端(三)
- 条款21:必须返回对象时,别妄想返回其reference
- SVN如何清除用户信息重新登录
- 端午假期学ios
- poj 3150 Cellular Automaton
- 关于favicon.ico的两三事
- 事物(三)之服务端事务匹配请求
- Android 仿网易新闻客户端开源框架ActionBarSherlock 和 ViewPager
- 正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——5 DFA最小化
- apache https配置步骤
- 【六一特辑】为什么这些东西“儿童不宜”?
- 高效使用vector
- js 搜集
- android 中遥控器键值的添加和修改
- iOS iPhone SDK 包含哪些东西?