1.总体结构
看了这么长时间的RFC ⽂旦,谈谈我对SIP协议通信粒度的理解吧,在SIP协议中通信的⾏为分成了不同的粒度,从⼩到⼤分别是点到点的 sip消息的传输(这点是我⾃⼰总结的), sip事务, sip对话以及sip会话。点到点的sip消息的传输时sip协议传输的最基本的单位,发⽣在传 输层(Transport Layer),就是将⼀个sip message通过udp 、tcp或tls等底层协议发送到⽬的UA (或者Proxy)的传输层。事物的粒度在点 对点sip消息传送之上,包含了⼀系列的sip消息传输,事务由⼀个request、0到多个临时response以及⼀到多个最终response组成,表⽰了 ⼀次完整的request-response过程。⽽对话粒度更⼤,⼀次对话从进⼊early 状态到closed 状态可能包含0到多个事务(对话收到1xx进⼊early 后收到non-2xx的response时会直接进⼊closed ,否则必须经过BYE 事务才能进⼊closed 状态)。对话应该发⽣在Transaction User层,由⽤ 户控制对话的开始和结束。 sip会话表⽰了若⼲⽤户之间通信的过程,可能包含多个对话过程。 2.事务的状态机
INVITE客户端事务(INVITE Client Transaction)
⾮INVITE客户端事务(Non-一体化化粪池INVITE Client Transaction)
INVITE服务端事务(INVITE serverTransaction)
⾮INVITE服务端事务(Non-INVITE server Transaction)
3.sip 消息与状态机的匹配
由于在transpor 层收到的sip消息要交给相应的状态机来处理,因此在transaction层需⽤sip消息匹配状态机的实例,⽽这个匹配分为两类: t
1. UAC事务与response匹配;
2. UAS事务与request匹配;
1. UAC事务与response匹配
当UA C发出⼀个请求时会创建⼀个相应的事务,假设请求ReqA 创建了事务实例TA电容器串联
,之后 如果收到了响应RespX ,可以通过看RespX 是否满 ⾜以下条件来看该响应是否与TA匹配:
RespX 的via头域最上⾯的⼀条的branch参数,与ReqA 的via头域最上⼀条的branch参数相等;
RespX 的木材炭化炉CSeq 头域中的⽅法(method)与ReqA 的CSeq 头域中的⽅法相同,这是由于cancel 请求会创建⼀个新事务但是却与要取消 的请求有同样的branch参数;
同时满⾜以上两个条件时, RespX 与事务实例TA匹配。
2. UAS事务与request匹配
当UA 不锈钢精密冲压S收到⼀个请求时会创建⼀个相应的事务,假设请求ReqA 创建了事务实例折叠音箱TA,之后如果收到了请求ReqX ,可以通过看ReqX 是否满⾜ 以下条件来看该响应是否与TA匹配:
ReqX 的via头域最上⾯的⼀条的branch参数与ReqA 的via头域最上⼀条的相等;
ReqX 的via头域最上⾯的⼀条的sent-by的值与ReqA 的via头域最上⼀条的相等;
ReqX 的CSeq 头域中的⽅法(method)与ReqA 的CSeq 头域中的⽅法相同;
同时满⾜以上三个条件时, ReqX 与事务实例TA匹配。