README ¶
事务
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头域的send-by参数和创建本事务的请求的Via头域的send-by参数一样(可能存在来自不同客户端的branch参数的意外或恶意重复,所以将 send-by 值用作匹配的一部分),并且:
3、 请求的方法与创建事务的方法匹配,但ACK除外,在ACK中,创建事务的请求的方法为INVITE。
所以,根据匹配规则,事务的ID 使用 branch,然后在匹配逻辑里面,再做条件判断。而因为branch可能会重复,所以如果使用map来简化transaction的管理,key的取值应该:
type | key |
---|---|
客户端事务: | branch+method |
服务端事务: | branch + sendby + method,method中ack还要除外。所以只能用branch + sendby |
Documentation ¶
Index ¶
- Variables
- func GetTXKey(msg *sip.Message) (key string)
- type Config
- type Core
- func (c *Core) GetTX(key string) *GBTx
- func (c *Core) HandleReceiveMessage(p *transport.Packet) (err error)
- func (c *Core) MustTX(key string) *GBTx
- func (c *Core) NewTX(key string) *GBTx
- func (c *Core) RegistHandler(method Method, handler RequestHandler)
- func (c *Core) Request(req *Request) (*GBTx, error)
- func (c *Core) Respond(resp *Response) (*GBTx, error)
- func (c *Core) SipRequestForResponse(req *Request) (response *Response, err error)
- func (c *Core) StartAndWait()
- type GBTx
- func (tx *GBTx) Close()
- func (tx *GBTx) GetResponse() *sip.Response
- func (tx *GBTx) Key() string
- func (tx *GBTx) ReceiveResponse(msg *sip.Response)
- func (tx *GBTx) Request(req *sip.Request) error
- func (tx *GBTx) Respond(res *sip.Response) error
- func (tx *GBTx) SipRequestForResponse(req *sip.Request) (response *sip.Response, err error)
- func (tx *GBTx) SipResponse() (*sip.Response, error)
- type GBTxs
- type RequestHandler
Constants ¶
This section is empty.
Variables ¶
var ( ErrorSyntax = errors.New("message syntax error") ErrorCheck = errors.New("message check failed") ErrorParse = errors.New("message parse failed") ErrorUnknown = errors.New("message unknown") )
transaction 的错误定义
Functions ¶
Types ¶
type Config ¶
type Config struct { //sip服务器的配置 SipNetwork string //传输协议,默认UDP,可选TCP SipIP string //sip 服务器公网IP SipPort uint16 //sip 服务器端口,默认 5060 Serial string //sip 服务器 id, 默认 34020000002000000001 Realm string //sip 服务器域,默认 3402000000 Username string //sip 服务器账号 Password string //sip 服务器密码 AckTimeout uint16 //sip 服务应答超时,单位秒 RegisterValidity int //注册有效期,单位秒,默认 3600 RegisterInterval int //注册间隔,单位秒,默认 60 HeartbeatInterval int //心跳间隔,单位秒,默认 60 HeartbeatRetry int //心跳超时次数,默认 3 //媒体服务器配置 MediaIP string //媒体服务器地址 MediaPort uint16 //媒体服务器端口 MediaPortMin uint16 MediaPortMax uint16 MediaIdleTimeout uint16 //推流超时时间,超过则断开链接,让设备重连 AudioEnable bool //是否开启音频 WaitKeyFrame bool //是否等待关键帧,如果等待,则在收到第一个关键帧之前,忽略所有媒体流 RemoveBanInterval int //移除禁止设备间隔 UdpCacheSize int //udp缓存大小 }
type Core ¶
type Core struct { *Config //sip server配置信息 OnRegister func(msg *Request, tx *GBTx) OnMessage func(msg *Request, tx *GBTx) // contains filtered or unexported fields }
Core: transactions manager 管理所有 transactions,以及相关全局参数、运行状态机
func NewCore ¶
初始化一个 Core,需要能响应请求,也要能发起请求 client 发起请求 server 响应请求 TODO:根据角色,增加相关配置信息 TODO:通过context管理子线程 TODO:单元测试
func (*Core) HandleReceiveMessage ¶
接收到的消息处理 收到消息有两种:1、请求消息 2、响应消息 请求消息则直接响应处理。 响应消息则需要匹配到请求,让请求的transaction来处理。 TODO:参考srs和osip的流程,以及文档,做最终处理。需要将逻辑分成两层:TU 层和 transaction 层
func (*Core) RegistHandler ¶ added in v3.0.4
func (c *Core) RegistHandler(method Method, handler RequestHandler)
RegistHandler RegistHandler
func (*Core) SipRequestForResponse ¶ added in v3.0.4
func (*Core) StartAndWait ¶ added in v3.0.4
func (c *Core) StartAndWait()
type GBTx ¶ added in v3.0.4
type GBTx struct { *Core // contains filtered or unexported fields }
GBTx Gb28181 Transaction
func NewTransaction ¶ added in v3.0.4
NewTransaction create a new GBtx
func (*GBTx) Close ¶ added in v3.0.4
func (tx *GBTx) Close()
Close the Close function closes the GBTx
func (*GBTx) GetResponse ¶ added in v3.0.4
GetResponse GetResponse
func (*GBTx) ReceiveResponse ¶ added in v3.0.4
ReceiveResponse receive a Response
func (*GBTx) SipRequestForResponse ¶ added in v3.0.4
type GBTxs ¶ added in v3.0.4
GBTxs a GBTxs stands for a Gb28181 Transaction collection
var ActiveTX *GBTxs
type RequestHandler ¶ added in v3.0.4
type RequestHandler func(req *Request, tx *GBTx)