为什么要把INVITE消息单独处理? 因为INVITE是一个3次握手的过程,而其他所有的消息只需要两次握手;其过程类似与TCP/UDP。
|INVITE |pass INV to TU INVITE V send 100 if TU won't in 200ms send response+-----------+ +--------| |--------+101-199 from TU | | Proceeding| |send response +------->| |<-------+ | | Transport Err. | | Inform TU | |--------------->+ +-----------+ | 300-699 from TU | |2xx from TU | send response | |send response | | +------------------>+ | | INVITE V Timer G fires | send response+-----------+ send response | +--------| |--------+ | | | Completed | | | +------->| |<-------+ | +-----------+ | | | | ACK | | | - | +------------------>+ | Timer H fires | V or Transport Err.| +-----------+ Inform TU | | | | | Confirmed | | | | | +-----------+ | | | |Timer I fires | |- | | | V | +-----------+ | | | | | Terminated|<---------------+ | | +-----------+
Figure 7: INVITE server transaction
进入“Confirmed”状态时,吸收额外的ACK消息,触发最后的响应,同时启动定时器I,value=T4(for UDP, zero seconds for TCP);定时器I fires,进入“Terminated”