Sip协议栈-事务层的设计与实现
一个事务是客户发送的一个请求事务(通过通讯层)发送到一个服务器事务,连同服务器事务的所有的该请求的应答发送回客户端事务。事务层处理应用服务层的重发,匹配请求的应答,以及应用服务层的超时。任何一个用户代理客户端(user agent client UAC)完成的事情都是由一组事务构成的。通常一个SIP 事务由一个单个请求和这个请求的所有应答组成,这些应答包括了零个或者多个临时应答以及一个或者多个终结应答
事务层包含两个事务库:客户端事务库和服务端事务库。每个事务都包含若干状态。其中Invite客户端事务包括Calling、Proceeding、Completed、Terminated四种状态;非Invite客户端事务包括Trying、Proceeding、Completed、Terminated四种状态;Invite服务端端事务包括Proceeding、Completed、Confirmed、Terminated四种状态;非Invite服务端端事务包括Trying、Proceeding、Completed、Terminated四种状态。
事务层需要依赖TU层和传输层。即接收传输层收到的数据,处理后转给TU层;接收TU层要发送的数据,处理后转给传输层发送。
事务层包含一个定时器管理器,对11种定时器进行维护。当在TCP传输方式下不启用。
每个事务包含一个TransactionKey做为事务的标识。在RFC3261中以顶端Via的branch及CSeq中的方法作为事务的标识,因此以它作为查找事务的关键字。由于只遵循RFC2543的消息中Via可以不带branch参数,为了处理这种情况,查找时首先检查消息中是否存在该参数且是否以字符串“z9hG4bK”开头。若发现Via中不带branch参数或branch不符合RFC3261规范, 则根据请求消息中的URI、Via、Call-ID、To的tag、From的tag以及CSeq生成哈希代码做为事务的标识
事务层是线程安全的。
下图描述了事务层的关键类的类图: