SIP協議的INVITE消息發起流程
當通過sip協議發起一個會話時,需要通過invite消息實現該流程。而SIP協議是一個基於事務的協議,每一個sip會話的都是通過sip部件間的一系列消息來完成的。首先需要明確的重要概念就是事務。
事務
在SIP協議中,一個事務是指完成一次消息交互的整個流程。以INVITE消息爲例,一個基於代理服務器交換信令和語音視頻數據包的事務模型如下圖所示:
如圖所示,對於1003來說,虛線框內的從INVITE消息到代理服務器回送的200OK整個消息交互流程稱爲一個客戶端事務,而對於1005來說,虛線框內的從INVITE消息到代理服務器回送的200OK整個消息交互流程稱爲一個服務器事務。
不管是客戶端事務還是服務器事務,都必須維護一個有限狀態機,記錄當前事務的進展情況,事務和其狀態機的維護,構成了一款SIP終端軟件最重要的一部分。
客戶端INVITE事務的狀態轉換如上圖所示。
當用兩個終端發起INVITE呼叫時,用wireshark抓包得到的結果如下圖所示:
其中ip:192.168.1.33是代理服務器的地址,ip:192.168.1.104是客戶端sip終端的地址。這裏,代理服務器的作用相當於一個UAS。這裏總共有兩個事務流程,整個過程如下:
a) Sip終端在地址192.168.1.104向服務器發起一個會議3000的INVITE消息,客戶端進入calling狀態,啓動A和B的定時器,用於INVITE消息的超時重傳。
b) 服務器發送100/trying,客戶端收到後進入proceeding狀態,取消A和B定時器。
c) 服務器發送407要求認證,客戶端進入Completed狀態。
d) 客戶端通過ACK發送認證信息。
e) 進入Terminated狀態後銷燬該事務。
到此爲止,一個客戶端INVITE事務結束。
a) Sip終端在地址192.168.1.104再次向服務器發起一個會議3000的INVITE消息,啓動A和B的定時器,用於INVITE消息的超時重傳
b) 服務器發送100/trying,客戶端收到後進入proceeding狀態,取消A和B定時器。
c) 服務器發送200OK,客戶端進入Accepted狀態。
d) 客戶端向服務器發送ACK應答。
注:其中在進入calling狀態之前,也就是在發送INVITE消息時,客戶端必須將其中的SDP消息包含着INVITE消息的content中傳送到。
在客戶端接收到Accepted消息(200Ok)後,或根據得到的SDP做解析,啓動正確的音視頻編解碼器,生成RTP端口,在最後的ACK中發送給服務器,這是,通話開始進行。
在Doubango協議棧中,最後一步的處理由tsip_dialog_invite.client.c文件的int c0000_Outgoing_2_Connected_X_i2xxINVITE(va_list *app)函數處理。