1. 概述
SIP是一种事务型协议,在两个端点之间通过transaction完成一系列的数据交互工作。一个transaction包括一个请求,以及这个请求对应的一个或者多个临时回复和一个或者多个最终回复。
2. Transaction的分类
2.1 CT和ST的分类
在SIP中,transaction使用两种分类方式共同作用的方法被分为四类,第一中分类方式通过请求的发起者来进行分类。
在发送请求构建transaction的时候,可以将请求的发送者称为client,回复的发送者称为server。因此对于transaction来说,在client端的被称为client transaction,在server端的被称为server transaction。 client transaction负责发送请求,server transaction负责发送回复。
需要注意的client transaction及srever transaction的概念和UAC及UAS的概念并不相同的,二者的区分如下图所示:
![](https://img.haomeiwen.com/i7003025/2cea98e72352155e.png)
2.2 CT和ST的作用
client transaction 负责接收来自TU或者UA的请求,并且将这个请求可靠地传输到server transaction。client transaction还负责对不合理的响应和重传的响应进行过滤,然后回传给TU。如果对于INVITE请求的响应为2xx,那么client transaction将会生成对于该响应的ACK请求。
server transaction负责接收来自传输层的请求,并且将这个请求可靠地传输到TU,同时也负责过滤来自网络的任何重传的请求。server transaction也从TU接受响应,然后通过传输层进行发送。
2.3 NIT和IT
在transaction中还可以根据请求的类型来进行分类。由于INVITE请求和其他请求不同,需要通过2xx回复发送ACK请求,同时在会话发起过程中的特殊作用,可以将transaction分为Non-INVIRE-Transaction和INVITE-Transaction两类。
2.4 两种分类方式同时使用
在SIP中,两种分类方式是同时使用的。所以transaction就被分成了四类:
- (1) Non-INVITE client transaction
- (2) Non-INVITE server transaction
- (3) INVITE client transaction
- (4) INVITE server transaction
这四种类型,在SIP协议中各自拥有一套状态机,从而完成一次完整的transaction传输。
3 ACK请求
ACK请求是在INVITE请求中一种附属请求,该请求不能脱离于INVITE请求独立存在。ACK请求和其他请求不同的情况在于:
- 1)ACK请求是否成为独立的
Transaction
,和INVITE请求的响应有关,如果最终响应为2XX响应,那么ACK请求是一个独立的Transaction
,拥有独立的branch参数标志; - 2)如果最终响应不是2XX响应,那么ACK请求就成为INVITE请求的附庸,只能复用INVITE请求的branch参数;
- 3)不论如何ACK请求都不会对Cseq头域的序列号进行任何修改。
上述关于ACK请求的独特性的原因在于:
-
1)ACK请求在CT和ST中的处理情况的不同。在CT中如果INVITE请求的响应为2XX响应,那么ACK请求由Transaction的更上层的TU直接产生下发到SIP协议规定的传输层(和OSI七层模型的传输层无关),所以这时候ACK请求会拥有独立的branch参数,成为独立的Transaction;
-
2)如果INVITE请求的最终回复为Non-2XX响应,那么该ACK请求就由CT自行产生,该CT中所拥有的只有自身的branch参数,所以ACK请求只能复用该branch参数;
-
3)对于Cseq头域而言,该头域的序列值是用来表示需要处理的请求,对于UAC来说,ACK请求是不需要进行处理的,所以ACK请求不会导致序列号增加。
-
4)对于UAS来说,Non-2XX的ACK请求直接在ST中处理完毕,而对于2XX的ACK请求则是在TU中处理。
网友评论