事物(三)之服务端事务匹配请求

来源:互联网 发布:java 架构设计 编辑:程序博客网 时间:2024/06/06 09:13

当服务端从网络上收到一个请求以后,他必须和现有的事务进行判定。这个是根据下边的规则来判定的。

首先要检查请求中的Via头域的最上branch参数。如果他以z9hG4bk开头,那么这个请求一定是由客户端事务根据本规范产生的。因此,branch参数在该客户端发出的所有的事务中都是唯一的。根据下列规则我们可以判定请求是否和事务匹配:

1 请求中的最上的Via头域的branch参数和创建本事务的请求的最上的Via头域的branch参数一样。

2 请求的最上的Via头域的sentby参数和创建本事务的请求的最上的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上能够区别给2xxACK和给其他应答的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并不认为是事务的一部分,ACKINVITE属于不同的两个事务;终结应答不是一个2xx应答的时候,事务还包括一个ACK

补充:user=phone 表示SIP的用户信息部分必须是TEL URLTEL URL文档 RFC3966)。Contact: <sip:4002@192.168.50.69:35805;user=phone>

建议:学习下OSIPOSIP是一个开源的SIP协议栈库,该协议栈的层次性比较强。支持基于UDPTCPSTCP协议的SIP消息的协议栈。


0 0