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
總結
以上是生活随笔為你收集整理的sip协议的超时机制的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何用PS把背景完全扣掉,变成透明
- 下一篇: 中国 AI 天才养成计划:清华姚班和 1
