sip協議中的一些重要概念介紹
SIP協議中,比較有特點的就是SIP事務了。那麼想要理解SIP事務的概念,我們還需要了解sip請求的一些內容。sip事務的概念:一個sip請求以及由它觸發的一系列應答(包括臨時應答和一個最終應答)。
sip請求有6種:INVITE, ACK, OPTIONS, BYE, CANCEL, REGISTER
sip請求的格式包括請求行(如INVITE sip:192.168.101.30 SIP/2.0),
sip應答的格式包括狀態行(如SIP/2.0 100 Trying);
sip應答的狀態碼從100到699,其中100~199是臨時(provisional)應答。
關於一些主要方法的簡要介紹:
INVITE
請求是三次握手機制,其他請求都採用兩次握手機制。
CANCEL
請求用於取消懸而未決的事務,我的理解是一方發出INVITE,但是另一方始終沒有做出應答,發出200OK訊息(超過了預設的振鈴時長),那麼UAC會自動發出一個CANCEL請求,UAS返回200OK,並且同時發出487狀態碼的應答,UAC再對收到的487訊息發出ACK確認,即最開始的 INVITE和487以及ACK構成三次握手。
OPTIONS
請求用於詢問伺服器的效能情況,包括這個伺服器所支援的方法(可能會有擴充套件方法)和會話描述協議。代理伺服器的三種類型:保留呼叫狀態代理、保留狀態代理、不保留狀態代理。這三種類型的代理在處理能力和所佔用資源上有差別,在代理分發中我們採用網路核心無狀態,而在流量較小的網路邊界採用智慧性高的保留(呼叫)狀態伺服器處理路由。
sip訊息編碼採用文字方式(即使用字串),相對的是二進位制的編碼方式,前者易於除錯和擴充套件,後者則有利於節省頻寬。
CALL-ID
欄位用於標識一個特定邀請以及與這個邀請相關的所有後續事務(即標識一個會話),比如一方發起邀請加入一個國際象棋的會話,那麼INVITE請求以及應答, BYE請求以及應答都共享一個CALL-ID,因為這兩個事務都屬於一個特定邀請。而兩個使用者之間可以同時存在多個邀請(比如在下象棋的同時發起聊天的邀 請),那麼一個邀請中的後續事務將通過這個邀請特有的CALL-ID來區分,如一方發出BYE訊息來結束聊天,但是下棋仍然進行中,那麼另一方將根據 BYE訊息的CALL-ID來確定要結束的究竟是哪一個會話。
CSeq
欄位是用來給同一個會話中的 事務進行排序的。可以理解為,會話由CALL-ID來標識,會話中的事務則由CSeq標識。除了ACK請求和CANCEL請求,INVITE之後的請求中 CSeq欄位的數字是最初請求(INVITE)的CSeq遞增的結果。而ACK和CANCEL請求則擁有與它所確認(取消)的請求相同的CSeq數字部 分,只是方法名不同。
Contact
欄位是被呼叫方傳送200OK訊息時帶上的,包含了被叫方的真實IP,這樣sip伺服器在路由第一個INVITE請求之後就可以被解除安裝掉(越過),不再需要存在於信令路徑中。
欄位是用來使sip伺服器保留在每次請求中,不被繞過。Record-Route欄位由信令路徑上的伺服器新增(每經過一個信令路徑上必須存在的代理,就添 加一個Record-Route標題頭),maddr引數包含該代理的IP地址。被叫方發出的200OK應答包含Record-Route和 Contact欄位(Record-Route可能有多個),呼叫方收到200OK後根據這兩個欄位建立用於後續請求的Route標題頭(可能有多個),
其包含的是信令路徑上的下一跳的下一跳的真實IP。
To
欄位總是包含被呼叫方的地址(通過sip代理時是公用地址,點對點時是真實ip),要注意的是區別該標題頭和sip訊息請求行中的Request-URI。
To在信令路徑中不會被代理改變,然而Request-URI包含的是信令路徑中下一跳的地址,因此在路途中被每個代理改變。
Via
欄位儲存所有處理請求的代理地址(包括使用者代理和sip代理),它可以用來檢測路由迴圈,也用於使應答訊息經過請求訊息來時相同的路徑(方向相反)。因此, 在請求訊息傳送時,via標題頭的數量是隨著跳數逐漸增加的,而應答訊息返回時,via標題頭的數量則逐漸遞減(每經過一跳則剝離一個有它自己地址的 Via標題頭)。