Sip协议中几个重要的名词总是暧昧不明,影响开发人员的理解,这几个词就是Session(会话)、dialog(对话)、transaction(事务)。通过下面的详细讲解,相信不会再有混乱理解。
Transaction
事务是指一个请求消息以及这个请求对应的所有响应消息的集合;对于INVITE事务来讲,除包含INVITE请求和对应的响应消息外,在非成功响应的情况下,还包括ACK请求。Via头中的branch参数能够唯一确定一个事务。branch值相同,代表同一个 transaction(事务)。事务是由事件(方法)来引起的,一个方法(Method)的建立和到来都将建立新的事务。(实际上当收到新消息时,就是根据branch来查找对应的事务)
根据sip协议描述一个transaction由5个必要部分组成:from、to、Via头中的branch参数、call-id和cseq,这5个部分一起识别某一个transaction,如果缺少任何一部分,该transaction就会设置失败。
Dialog
对话是两个UA之间持续一段时间的点对点的SIP连接,它使UA之间的消息变得有序,同时给出请求消息的正确的路由。即Call-ID、from-tag以及to-tag三个值的组合能够唯一标识一次对话。对话一般是由Invite andSubscribe 来创建的。即对话处于确定阶段时,对话已经建立起来。
Session
会话是一次通信过程中所有参与者之间的关联关系以及他们之间的媒体流的集合。只有当媒体协商成功后,会话才能被建立起来。
对话是end-point对end-point的关系,即真实的通信双方,
而transaction 是hop by hop的关系,即路由过程中交互的双方。
Transaction:维护hop to hop状态,包括一个请求和其触发的所有响应,包括若干暂时响应和一个最终响应。生命周期从请求产生到收到最终响应。
Dialog:维护peer to peer状态,目前只有invite和subscribe请求会触发dialog。其生命周期贯穿一个端到端会话的始终。
下面的示意图清晰的显示了它们之间的关系
(RINGING 是 1xx 响应, OK是 2xx 响应)
caller呼叫callee的号码来建立一系列的对话(Dialogs),这些对话组成了一个呼叫(Call),即一个会话.
例如:
UA-A B2BUA UA-B
| --- INV -> |
|--- INV -> |
|<- 200 --- |
| <- 200 --- |
|<====通话中====>|
| --- BYE -> |
|--- BYE -> |
|<- 200 --- |
| <- 200 --- |
这是一次会话(Session),里面包含了两个对话(Dialog)。
这两个对话(Dialog)分别是:
1. UA-A与B2BUA之间的对话(Dialog)
2. B2BUA与UA-B之间的对话(Dialog)