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

首先要检查请求中的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消息的协议栈。

事物(三)之服务端事务匹配请求相关推荐

  1. Metasploit 渗透测试手册第三版 第三章 服务端漏洞利用(翻译)

    第三章 服务端漏洞利用 在本章中,我们将学习以下内容 1.攻击Linux服务器 2.SQL注入攻击 3.shell类型 4.攻击Windows服务器 5.利用公用服务 6.MS17-010 永恒之蓝 ...

  2. 剑网三缘起正在连接服务器,剑网3缘起:因无法服务端无法匹配二测延迟

    原本决定今天启动二测的<剑网3缘起>怀旧服版本,因为官方升级了客户端导致了服务器端无法匹配,没有达到预期的优化效果,所以延迟了本次测试.下面来看看官方对这次延迟做出的公告. 官方公告: 大 ...

  3. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  4. H5请求服务端发送POST请求之预请求-OPTIONS

    1.问题场景 1.1 H5端请求服务端接口时,需要在header中携带服务端用jwt规范生成的token 1.2 在接收到H5的请求时Filter需要从请求头中拿出token做校验,检查当前的toke ...

  5. 服务端发post请求产生的编码问题

    最近在做一个功能,大概功能是这样的,供应商提供http接口给我们,然后我们抓取供应商的数据保存到数据库,问题在于他们编码格式是gb2312的,而我们是utf-8. 大家可能会有个误区,post请求是无 ...

  6. NodeJS http服务端获取POST请求数据

    http服务 我们知道,使用nodejs标准库的http模块创建一个http服务很简单,如下: const http = require('http');const hostname = '127.0 ...

  7. Python原生服务端签名生成请求订单信息「orderString」

    接口文档:https://docs.open.alipay.com/204/105465/ 一.签名方法示例:「代码中的私钥是随机生成无法使用,做示例用」 def sign(params):sort_ ...

  8. 物联网视频监控服务(三)-监控服务端 篇

    概述 此篇文章主要描述 监控服务端(video_server) 开发部分; 功能点 接收视频上传功能; 利用opencv动态检测 视频帧是否变化,标记变更部分及显示当前时间; 根据被监测环境是否变化( ...

  9. ASP.NET之通过JS向服务端(后台)发出请求(__doPostBack is undefined)

    ASP.NET回发数据是通过函数__doPostBack来实现的.该函数在加入了服务端控件,并将AutoPostBack设置为true之后,将自己主动生成,详细能够參看以下的图. 同一时候还会生成隐藏 ...

  10. seata 如何开启tcc事物_微服务分布式事务4种解决方案实战

    分布式事务 分布式事务是指事务的参与者,支持事务的服务器,资源服务器分别位于分布式系统的不同节点之上,通常一个分布式 事物中会涉及到对多个数据源或业务系统的操作. 典型的分布式事务场景:跨银行转操作就 ...

最新文章

  1. 图论500题 ---- 枚举(最短路上的边)+最短路 删掉任意一条边的最长最短路 HDU1595
  2. 《Python编程从入门到实践》学习笔记3:列表
  3. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 中根据 File 加载 DexFile | loadDexFile 分析 )
  4. 电脑技术吧_极简技术|快速整理电脑桌面繁乱的图标
  5. ConcurrentModificationException并发修改异常
  6. GTS--阿里巴巴分布式事务全新解决方案
  7. 自定义地图怎么做成html,自定义html为谷歌地图制作标记
  8. jdbc mysql 存储过程查询数据_JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能。...
  9. JAVA 基础之容器集合(Collection和Map)
  10. EFCore-一对一配置外键小记
  11. 专家称纳米机器人未来将“入侵”人脑,让人类将获得“超能力”
  12. 实用SQL代码解析工具——sqlparse
  13. python爬取拼多多数据 verifyauthtoken_拼多多TOKEN授权
  14. Machine learning approximation algorithmsfor high-dimensional fully nonlinear PDE
  15. pos机v1,简单pos机
  16. 干货!深度描述聚类——加州大学戴维斯分校计算机系博士生张洪境
  17. 关闭惠普计算机通电启动注册表,惠普电脑总是自动重启如何解决
  18. excel保存快捷键_Excel新手必备的5大技巧,看看你会几个?(附26个超实用快捷键)
  19. 在iOS应用中使用字体图标及制作字体库
  20. Facebook仍将在2020年启动天秤座

热门文章

  1. 会议室分配时间最长_突破大设计1:时间分配
  2. 自增ID有什么坏处?什么样的场景下不使用自增ID?
  3. Docker EE 2.0 版本震撼来袭,全新特性先睹为快(附资源地址)
  4. 前端基础--jquery
  5. mysql-proxy实现读写分离
  6. java mail报权限问题
  7. 编写自己的tomcat, 并运行tomcat源码于eclipse中
  8. Elasticsearch 之索引创建原则
  9. redis 的 key 设计原则
  10. 在线思维导图工具-toolfk程序员在线工具网