0、前言:
在講解sip協議的超時機制之前,先簡單地介紹一下sip協議中的message、dialog、session 和 transaction
(1)Messages(消息)
消息是在服務器和客戶端之間交換的獨立文本,有兩種類型的消息,分別是請求(Requests)和響應(Responses)。
(2)Dialog(對話)
對話是兩個UAs(user agent) 之間持續一段時間的端到端(peer-to-peer)的SIP 關係.。一個對話由一個Call-ID、一個local tag 和 一個remote tag來標識,對話過去也叫做 "call leg"。dialog的建立是收到UAS的響應(To tag)時開始建立的。收到180響應時建立dialog叫做早期對話(early dialog),收到2XX的應答開始纔是真正的dialog建立。
當UA發送初始INVITE請求後,只有接收到失敗響應纔有可能建立DIALOG。通過Callid、From域中的tag參數和To域中的tag參數來唯一標識DIALOG。 From域中的參數由主叫添加,To域中的參數由被叫添加。
(3)Transaction(事務)
事務發生於客戶端和服務器端之間,包含從客戶端發出請求給服務器,到服務器響應給客戶端的最終消息(non-1xx message)之間的所有消息.。如果請求是一個"Invite"消息,並且最終的響應是一個non-2xx消息,那麼該事務包含一個"Ack"響應消息。如果服務器的響應是一個2xx消息,那麼,隨後的ACK是一個單獨的事務。
(4)Session(會話)
session是媒體交換之後才建立的,具體而言就是通過offer/answer方式交換sdp的媒體。session的建立可以使INVITE-200 也可以是200-ACK。這要看媒體的交換髮生的時間。 具體來說,INVITE 中的消息體用sdp語言來描述自己可處理的媒體類型,200OK中 帶回UAS端可處理的媒體類型,這個時候媒體交換就算是完成了,也就是session建立起來了。
下面的示意圖清晰的顯示了Transaction和Dialog之間的關係:
1、sip協議超時機制
SIP協議中無論是Client端還是Server端,在定時器和消息重發的處理上,可分爲與INVITE相關的Transaction 和與INVITE不相關的Transaction。RFC3261中定義了兩個基準定時器 T1=500ms 和 T2=4s。
無論是可靠傳送還是不可靠傳送,當實體發送消息(包括請求或響應消息)後,都會啓動一個64 倍的T1定時器(計時器B、H、F),當此定時器終結時,如果沒有收到相應的響應或確認消息,實體將會清掉相關的Transaction。
(1)INVITE客戶端事務
當SIP實體(包括UA和Proxy)發送INVITE消息後,無論是可靠傳送還是不可靠傳送,實體都會啓動定時器B(Timer B=64*T1,如果T1=500ms,則此定時器爲32S)。
在不可靠傳送的情況下,實體同時會啓動定時器A(初始值爲T1),如果T1時間間隔後沒有收到任何響應消息,實體將會重發INVITE消息,之後的間隔分別爲2T1、4T1、8T1、16T1、32T1,在此期間,如果收到響應消息,實體將會終止重發行爲。
當定時器B(Timer B=64T1)終結時,如果實體仍然沒有收到響應消息,實體將終止該呼叫請求,客戶端不產生ACK。
當客戶端收到300~699的應答時,客戶端需要產生ACK請求。(ACK請求必須和原始請求發送到相同的地址、端口和transport),並啓動定時器D(缺省值是在非可靠通訊上至少是32秒,在可靠通訊上是0秒)
(2)INVITE服務端事務
當被叫用戶應答時,被叫側UA(UAS)將會向對端發送200消息,表示對INVITE消息的確認,主叫側UA(UAC收到200消息)後,將會發送ACK消息,表示收到200消息。因此,對Server側來講,當發送200消息後,爲了等待ACK消息,將會啓動定時器H(Timer H=64T1)。
在不可靠傳送的情況下,Server還會啓動T1定時器(計時器G),如果T1終結,沒有收到ACK消息,UAS將會重發200 消息。以後的間隔分別爲2T1,4T1,8T1,當時間達到T2(T2=8T1)後,後續重發的間隔將一直爲T2。
當定時器H(Timer H=64T1)終了時,如果實體仍然沒有收到ACK確認消息,實體將會終止該呼叫請求。
其它的最終響應消息,消息的重傳和定時器保護也與200消息的相同。
(3)非INVITE客戶端事務
當實體發送INFO或BYE等消息後,實體將會啓動定時器F(Timer F=64T1)。如果定時器F終了時,沒有收到最終響應消息,實體將會清掉Transaction。
在不可靠傳送的情況下,實體同時啓動定時器E(初始值T1)。如果在此期間沒有收到1XX臨時響應消息,實體將會以MIN(2(4,8..)*T1,T2)的間隔重發,直到間隔達到T2(4秒)。如果沒有收到任何響應消息,實體重發的行爲將與INVITE消息相關的最終響應行爲(Server)相同。
ACK只有在響應非200 OK時才和INVITE一樣,否則與INVITE不爲同一事務,只屬於同一個對話。
(4)非INVITE服務端事務
當收到一個不是INVITE或者ACK請求的時候,服務端的狀態初始化爲"Trying"狀態,在此狀態下,任何重發的請求都會被忽略。當服務端發送一個1XX的臨時應答後,進入"Proceeding"狀態;在"Proceeding"狀態下收到一個重發的請求,服務端將發送一個最近的1XX臨時應答;如果在"Proceeding"狀態下,服務端發送一個終結應答(應答碼是200—699),那麼服務端就進入“Completed”狀態。
當服務端進入"Completed"狀態,對於不可靠傳輸來說,必須設定一個定時器J=64*T1秒;對於可靠傳輸來說,設定爲0秒(即:不設定定時器)。在“Completed”狀態下,收到一個重發的請求時,服務端需要將上一次的終結應答重新發送。
服務端事務保持“Completed”狀態知道定時器J觸發,當定時器J觸發後,服務端事務必須進入“Terminated”狀態。
2、SIP協議中的各類定時器解析
定時器 | 缺省值 | 含義 |
---|---|---|
T1 | 500 ms | 一個估計的循環時間(RTT) |
T2 | 4 秒 | 非 INVITE 請求和 INVITE 響應的最長重傳時間間隔 |
T4 | 5 秒 | 網絡在客戶端和服務端事務中傳輸消息可能的時間 |
定時器 A | 最初爲 T1 | INVITE 請求重傳時間間隔(僅適用於不可靠傳輸,如:UDP) |
定時器 B | 64*T1 | INVITE 事務超時定時器 |
定時器 D |
大於等於 32 秒(對於 UDP) |
響應重傳的等待時間 |
0 秒(對於 TCP 和 SCTP) | ||
定時器 E | 最初爲 T1 | 非 INVITE 請求重傳時間間隔(僅適用於不可靠傳輸,如:UDP) |
定時器 F | 64*T1 | 非 INVITE 事務超時定時器 |
定時器 G | 最初爲 T1 | INVITE 響應重傳時間間隔 |
定時器 H | 64*T1 | ACK 接收的等待時間 |
定時器 I |
T4(對於 UDP) |
ACK 重傳的等待時間 |
0 秒(對於 TCP 和 SCTP) | ||
定時器 J |
64*T1(對於 UDP) |
重傳非 INVITE 請求的等待時間 |
0 秒(對於 TCP 和 SCTP) | ||
定時器 K |
T4(對於 UDP) |
響應重傳的等待時間 |
0 秒(對於 TCP 和 SCTP) |
參考:
https://www.jianshu.com/p/84d7289a4d3b
https://blog.csdn.net/daitu3201/article/details/80831429