Files
plugin-gb28181/transaction
2020-10-20 08:49:25 +08:00
..
2020-08-27 23:08:33 +08:00
2020-10-19 21:01:41 +08:00
2020-10-20 08:49:25 +08:00
2020-08-27 23:08:33 +08:00
2020-08-27 23:08:33 +08:00
2020-08-27 23:08:33 +08:00
2020-08-27 23:08:33 +08:00
2020-08-27 23:08:33 +08:00
2020-08-27 23:08:33 +08:00
2020-10-11 19:05:22 +08:00
2020-09-20 15:18:27 +08:00

事物

transaction事务是SIP的基本组成部分。 一个事务是客户发送的一个请求事务(通过通讯层)发送到一个服务器事务,连同服务器事务的所有的该请求的应答发送回客户端事务。 事务层处理应用服务层的重发,匹配请求的应答,以及应用服务层的超时。 任何一个用户代理客户端user agent client UAC完成的事情都是由一组事务构成的。 用户代理包含一个事务层,来实现有状态的代理服务器。 事务层包含一个客户元素(可以认为是一个客户事务)和一个服务器元素(可以认为是一个服务器事务),他们都可以用一个有限状态机来处理特定的请求。

在状态机层面事物分为ict、ist、nict、nist四种。 但底层事物方面,仅根据 method 等信息,分支处理。

关于事物管理

事物在map里面管理事物ID的选择是要和事物匹配相关。

客户端事件的匹配

当客户端中的传输层收到响应时它必须确定哪个客户端事务将处理该响应以便可以进行17.1.1和17.1.2节的处理。头域 Via 字段中的branch参数用于匹配规则。 一个匹配的响应应该满足下面两个条件:
1.如果响应的头域 Via头字段中的branch参数值与创建事务的请求的头域 Via头字段中的branch参数值相同。
2.如果CSeq标头字段中的method参数与创建事务的请求的方法匹配。由于CANCEL请求会创建新的事务但共享相同的branch参数值。所以仅用branch参数是不够的


服务端事物匹配

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

1、 请求的Via头域的branch参数和创建本事务的请求的Via头域的branch参数一样并且
2、 请求的Via头域的sendby参数和创建本事务的请求的Via头域的send-by参数一样可能存在来自不同客户端的branch参数的意外或恶意重复所以将 send-by 值用作匹配的一部分),并且:
3、 请求的方法与创建事务的方法匹配但ACK除外在ACK中创建事务的请求的方法为INVITE。

所以根据匹配规则事物的ID 使用 branch然后在匹配逻辑里面再做条件判断。而因为branch可能会重复所以如果使用map来简化transaction的管理key的取值应该

客户端事物: branch+method 服务端事物: branch + sendby + method,method中ack还要除外。所以只能用branch + sendby