sip協議的超時機制

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章