本站原创文章,如需转载,请保留作者及出处:www.goalercn.com,谢谢合作,不愿保留作者及出处信息的请勿转载!
SIP共有4个状态处理机制,分别是ICT(客户端的请求消息-INVITE及与之相关的消息)、NICT(客户端非INVITE消息的其他所有消息)、IST(服务器端的请求消息- INVITE及与之相关的消息)、NIST(服务端的非INVITE消息的其他所有消息)
为什么要把INVITE消息单独处理? 因为INVITE是一个3次握手的过程,而其他所有的消息只需要两次握手;其过程类似与TCP/UDP。
INVITE Client Transaction
|INVITE from TU
Timer A fires |INVITE sent
Reset A, V Timer B fires
INVITE sent +-----------+ or Transport Err.
+---------| |---------------+inform TU
| | Calling | |
+-------->| |-------------->|
+-----------+ 2xx |
| | 2xx to TU |
| |1xx |
300-699 +---------------+ |1xx to TU |
ACK sent | | |
resp. to TU | 1xx V |
| 1xx to TU -----------+ |
| +---------| | |
| | |Proceeding |-------------->|
| +-------->| | 2xx |
| +-----------+ 2xx to TU |
| 300-699 | |
| ACK sent, | |
| resp. to TU| |
| | | NOTE:
| 300-699 V |
| ACK sent +-----------+Transport Err. | transitions
| +---------| |Inform TU | labeled with
| | | Completed |-------------->| the event
| +-------->| | | over the action
| +-----------+ | to take
| ^ | |
| | | Timer D fires |
+--------------+ | - |
| |
V |
+-----------+ |
| | |
| Terminated|<--------------+
| |
+-----------+
Figure 5: INVITE client transaction
TU:可理解为上层用户,应用界面:
TU向transaction提交一个“INVITE”,state machine(状态机) 进入 “calling”状态
若采用UDP传输方式,则启动定时器A,超时时间为T1(T1为一个协议中定义的值)
若采用TCP传输方式,则不启动定时器
任何传输都必须启动定时器B(总的超时时间),value= 64*T1
若定时器A超时,ICT必须转发请求到传输层,并重新启动定时器A,value= 2*T1
当定时器A到2*T1时间以后,请求必须被再次转发(如果事务还存在),超时时间变为4*T1如此循环,直到定时器B超时;
定时器B时到,退出整个事务;
定时器A,必须被用在“calling”状态
注:T1 默认值为 500ms,RTT between the UAC and the UAS
1、 当定时器B超时,而Client Transaction状态依然是“calling”时,则CT向TU提交一个TIMEOUT消息,CT不产生ACK;
注:64*T1 = 7个request的TIME
/*****************************************************************************/
2、 在状态为“calling”时,当CT收到临时请求如100 try时,CT状态从“calling”—>”Preceeidng”。
3、 当CT为状态“Preceeidng”时,CT就不再提交Request;同时把临时请求通知TU;
4、 无论CT在“calling”或者“Proceeding”状态,当收到300-699响应,CT必须进入“completed”状态,同时提交响应给TU。
5、 当CT为状态“Preceeidng”时,任何临时响应都必须通知TU
6、 当CT在状态“Preceeidng”时,收到响应如300~699时,无论是TCP还是UDP都必须产生一个ACK request,并发送;ACK发送的IP_addr,port必须同INVITE;
7、 当CT进入“completed”状态时,若采用UDP方式,启动定时器D,RTT_VALUE = 32s(至少);若TCP则不需要
8、 当CT处在状态“calling”、“proceeding”,收到“2XX”响应时,则CT进入“terminated”状态,同时通知TU;若UAC收到“2XX”,产生一个“ACK_REQUEST”,ACK不放入事务层
9、 当CT进入“Terminated”,必须立即删除事务
ACK消息不通过事务发送