1、SIP業務基本知識
前言
會話發起協定(SIP)是VoIP技術中最常用的協定之一。它是一種應用層協定,與其他應用層協定協同工作,通過Internet控制多媒體通信會話。
1.1 業務介紹
會話初始協定(Session Initiation Protocol)是一種信令協定,用于初始、管理和終止網絡中的語音和視訊會話,具體地說就是用來生成、修改和終結一個或多個參與者之間的會話。
SIP的業務模式是一個點對點協定,其中有兩個要素——SIP使用者代理和SIP網絡伺服器。使用者代理是呼叫的終端系統元素,而SIP伺服器是處理與多個呼叫相關聯信令的網絡裝置。
使用者代理本身具有一客戶機元素(使用者代理客戶機UAC)和一伺服器元素(使用者代理伺服器UAS)。客戶機元素初始呼叫而伺服器元素應答呼叫。這允許點到點的呼叫通過客戶機-伺服器協定來完成。
下圖是SIP業務的網絡結構和各個參與者的關系。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM2ETM5YWYyEzNjlDNmJWYyYzX0IzNyETM3EzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
SIP業務的核心特點集中在SIP的設計目标之一是提供類似公用交換電話網(PSTN)中呼叫處理功能的擴充集。在這個擴充集中,實作類似日常電話的操作:撥号,振鈴,回鈴音或者忙音,隻是實作方式和術語有所不同。
SIP也實作了許多信令系統7(SS7)中更進階的呼叫處理功能,盡管這兩個協定相差很遠。SS7是一個高度集中處理的協定,其特點表現為高複雜度的中心網絡結構和無智能的啞終端(傳統的電話機)。
SIP則是一個點對點協定,是以它隻需要一個相對簡單的(是以也高度可擴充的)核心網絡,而将處理工作下放給連接配接在網絡邊緣的智能端點(裝有硬體或軟體的終端裝置)。SIP的許多功能在端點中實作,這與傳統的SS7将其在網絡核心裝置實作的作法大異其趣。而協定的其他特點還有它是一個文本協定,是以易于調測,結構靈活;而且它是一個中性的底層傳輸協定,可用TCP或UDP(推薦UDP);同時呼叫和媒體資訊同時傳送:媒體資訊的傳送由SDP傳送SIP是網際網路工程任務組(IETF)多媒體資料和控制體系結構的一個組成部分,是以它與IETF的許多其他協定都有聯系,例如RTP(實時傳輸協定)和SDP協定。SIP與許多其它的協定協同工作,僅僅涉及通信會話的信令部分(control message)。
SIP封包内容傳送會話描述協定(SDP),SDP協定描述了會話所使用流媒體細節,如:使用哪個IP端口,采用哪種編解碼器等等。SIP的一個典型用途是:SIP“會話”傳輸一些簡單的經過封包的實時傳輸協定流。RTP本身才是語音或視訊的載體。
1.2 業務過程和協定流程
Ø 注冊流程:
(1)使用者首次試呼時,終端代理A 向代理伺服器發送REGISTER 注冊請求;
(2)代理伺服器通過後端認證/計費中心獲知使用者資訊不在資料庫中,便向終端代理回送401Unauthorized 質詢資訊,其中包含安全認證所需的令牌;
(3)終端代理提示使用者輸入其辨別和密碼後,根據安全認證令牌将其加密後,再次用REGISTER 消息報告給代理伺服器;
(4)代理伺服器将REGISTER 消息中的使用者資訊解密,通過認證/計費中心驗證其合法後,将該使用者資訊登記到資料庫中,并向終端代理A 傳回成功響應消息200 OK。
Ø 登出流程:
(1)終端向代理伺服器發送register消息登出,其頭中expire字段設定為0。
(2)代理伺服器在收到後送回200OK響應,并将資料庫中的使用者有關消息登出。
Ø 基本呼叫建立過程:
(1)使用者摘機發起一路呼叫,終端代理A向該區域的代理伺服器發起Invite請求;
(2)代理伺服器通過認證/計費中心确認使用者認證已認證後,檢查請求消息中的Via頭域中是否已包含其位址。若已包含,說明發生環回,傳回訓示錯誤的應答;若沒有問題,代理伺服器在請求消息的Via頭域插入自身位址,并向Invite消息的To域所訓示的被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)終端代理B訓示被叫使用者振鈴,使用者振鈴後向代理伺服器發送180Ringing振鈴資訊。
(6)代理伺服器向終端代理A轉發被叫使用者振鈴資訊。
(7)被叫使用者摘機,終端代理B向代理伺服器傳回表示連接配接成功的應答(200OK)
(8)代理伺服器向終端代理A轉發該成功訓示(200OK)
(9)終端代理A收到資訊後,向代理伺服器發ACK資訊進行确認
(10)代理伺服器将ACK确認消息轉發給終端代理B。
(11)主被叫使用者之間建立通信連接配接,開始通話。
Ø 正常呼叫釋放過程:
(1) 正常呼叫
(2) 使用者通話結束後,被叫使用者挂機,終端代理B向代理伺服器發送Bye消息。
(3) 代理伺服器轉發Bye消息至終端代理A,同時向認證、計費中心發送使用者通話的詳細資訊,請求計費。
(4) 主叫使用者挂機後,終端代理A向代理伺服器發送确認挂斷響應資訊200OK。
(5) 代理伺服器轉發響應資訊200OK。
Ø 會話更改流程:
(1)使用者代理服務端和代理用戶端正常通話。
(2)使用者代理服務端向使用者代理用戶端發送Invite資訊,帶有新的SDP協商資訊。
(3)使用者處理用戶端回複200OK,并将協商後的SDP資訊帶回。
(4)使用者代理服務端發送ACK給使用者代理用戶端進行确認。
Ø 被叫忙呼叫釋放:
(1)使用者摘機發起一路呼叫,終端代理A向該區域代理伺服器發起Invite請求;
(2)代理伺服器向被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)呼叫請求送到被叫終端代理B後,被叫忙,終端代理B向代理伺服器送486被叫忙響應。
(6)代理伺服器向終端代理A轉發該響應消息。
(7)終端代理A向代理伺服器回送ACK确認消息。
(8)代理伺服器向終端代理B送ACK确認資訊。
Ø 被叫無應答流程一:
(1)使用者摘機發起一路呼叫,終端代理A向該區域代理伺服器發起Invite請求;
(2)代理伺服器向被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)被叫使用者振鈴,終端代理B向代理伺服器送180Ring響應。
(6)代理伺服器向終端代理A轉發該響應資訊。
(7)被叫久振鈴無應答,終端代理A判斷逾時後向代理伺服器送Cancel消息放棄該呼叫。
(8)代理伺服器收到Cancel消息後,向終端代理A回送200OK響應。
(9)代理伺服器将Cancel消息轉發給終端代理B。
(10)終端代理B向代理伺服器回送200OK響應。
(11)終端代理B向代理伺服器送487請求已撤銷的響應資訊。
(12)代理伺服器收到後回送ACK确認。
(13)代理伺服器向終端代理A送487請求已撤銷消息。
(14)終端代理A向代理伺服器回送ACK确認。
注:以上步驟中的(10)到(12)無嚴格順序關系。
Ø 被叫無應答流程二:
(1)使用者摘機發起一路呼叫,終端代理A向該區域代理伺服器發起Invite請求;
(2)代理伺服器向被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)被叫使用者振鈴,終端代理B向代理伺服器送180Ring響應。
(6)代理伺服器向終端代理A轉發該響應資訊。
(7)被叫久振鈴無應答,終端代理B判斷逾時後向代理伺服器送408Requesttimeout消息放棄該呼叫。
(8)代理伺服器收到408Requesttimeout消息後,轉發該消息給終端代理A。
(9)代理伺服器回送ACK确認給終端代理B。
(10)終端代理A向代理伺服器回送ACK确認。
注:以上步驟中的(9)到(10)無嚴格順序關系。
Ø 遇忙呼叫前轉:
(1)使用者摘機發起一路呼叫,終端代理A向該區域代理伺服器發起Invite請求;
(2)代理伺服器向被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)終端代理B忙線中,B向代理伺服器發送486Busy Here響應。
(6)代理伺服器向終端代理B發送ACK确認消息。
(7)代理伺服器對此呼叫進行前轉,向代理伺服器C發送Invite請求消息。
(8)代理終端C收到後訓示使用者振鈴,同時向代理伺服器發送180Ringing響應。
(9)代理伺服器向A轉發收到的180Ringing響應。
(10)被叫使用者C摘機接聽電話,終端代理C向代理伺服器傳回表示連接配接成功的應答(200OK)
(11)代理伺服器向終端代理A轉發該成功訓示(200OK)
(12)終端代理A收到資訊後,向代理伺服器發ACK資訊進行确認
(13)代理伺服器将ACK确認消息轉發給終端代理B。
建立通信連接配接,開始通話。
(14)主叫使用者挂機,終端代理A向代理伺服器發送Bye消息,請求挂機。
(15)代理伺服器轉發Bye消息至終端代理C,訓示C挂機。
(16)終端代理C向代理伺服器發送确認挂斷響應資訊200OK。
(17)代理伺服器轉發響應資訊200OK至A。
Ø 無應答呼叫前轉流程:
(1)使用者A摘機發起一路呼叫,終端代理A向該區域代理伺服器發起Invite請求;
(2)代理伺服器向被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)被叫使用者振鈴,終端代理B向代理伺服器送180Ring響應。
(6)代理伺服器向終端代理A轉發該響應資訊。
(7)被叫久振鈴無應答,代理伺服器判斷逾時後向代理終端B送Cancel消息放棄該呼叫。
(8)代理終端B收到Cancel消息後,向代理伺服器回送200OK響應。
(9)終端代理B向代理伺服器送487請求已撤銷的響應資訊。
(10)代理伺服器向終端代理B回送200OK響應。
(11)代理伺服器對此呼叫進行前轉,向代理伺服器C發送Invite請求消息。
(12)代理終端C收到後訓示使用者振鈴,同時向代理伺服器發送180Ringing響應。
(13)代理伺服器向A轉發收到的180Ringing響應。
(14)被叫使用者C摘機接聽電話,終端代理C向代理伺服器傳回表示連接配接成功的應答(200OK)
(15)代理伺服器向終端代理A轉發該成功訓示(200OK)
(16)終端代理A收到資訊後,向代理伺服器發ACK資訊進行确認
(17)代理伺服器将ACK确認消息轉發給終端代理C。
建立通信連接配接,開始通話。
(18)主叫使用者挂機,終端代理A向代理伺服器發送Bye消息,請求挂機。
(19)代理伺服器轉發Bye消息至終端代理C,訓示C挂機。
(20)終端代理C向代理伺服器發送确認挂斷響應資訊200OK。
(21)代理伺服器轉發響應資訊200OK至A。
Ø 呼叫保持:
(1)使用者摘機發起一路呼叫,終端代理A向該區域的代理伺服器發起Invite請求;
(2)代理伺服器通過認證/計費中心确認使用者認證已認證後,檢查請求消息中的Via頭域中是否已包含其位址。若已包含,說明發生環回,傳回訓示錯誤的應答;若沒有問題,代理伺服器在請求消息的Via頭域插入自身位址,并向Invite消息的To域所訓示的被叫終端代理B傳送Invite請求。
(3)代理伺服器向終端代理A發送呼叫進行中的應答資訊:100Trying。
(4)終端代理B向代理伺服器送呼叫進行中的應答資訊:100Trying。
(5)終端代理B訓示被叫使用者振鈴,使用者振鈴後向代理伺服器發送180Ringing振鈴資訊。
(6)代理伺服器向終端代理A轉發被叫使用者振鈴資訊。
(7)被叫使用者摘機,終端代理B向代理伺服器傳回表示連接配接成功的應答(200OK)
(8)代理伺服器向終端代理A轉發該成功訓示(200OK)
(9)終端代理A收到資訊後,向代理伺服器發ACK資訊進行确認
(10)代理伺服器将ACK确認消息轉發給終端代理B。
(11)主被叫使用者之間建立通信連接配接,開始通話。
(12)代理終端B向代理伺服器發送Reinvite消息,SDP的c域等于0,0,0,0。
(13)代理伺服器轉發此資訊給代理終端A。
(14)代理終端A收到Reinvite後回應200OK響應。表示接受會話更改,同僚根據協商結果修改會話方式。
(15)代理伺服器轉發200OK給代理終端B。
(16)代理終端B收到消息後向代理伺服器發送ACK消息進行确認。
(17)代理伺服器将ACK确認消息轉發到代理終端A。
Ø 呼叫等待:
(1)AB正常通話。
(2)在AB通話的階段,使用者C向A發起呼叫,終端代理C發送Invite消息給代理伺服器。
(3)代理伺服器向終端C回送100Trying響應,表示呼叫已在進行中。
(4)代理伺服器把Invite消息轉發給A。
(5)使用者A振鈴,并且終端A向代理伺服器發送180Ring響應。
(6)代理伺服器向終端C轉發該響應資訊。
(7)使用者A按下呼叫保持鍵,代理終端A向代理伺服器發送Invite消息,請求與代理終端C呼叫保持。
(8)代理伺服器轉發此消息給終端代理B。
(9)代理伺服器向終端A回送100Trying響應,表示呼叫已在進行中。
(10)終端B收到呼叫保持請求後,發送200OK給代理伺服器,表示接受呼叫保持。
(11)代理伺服器轉發200OK響應給終端代理A。
(12)代理終端A收到消息後向代理伺服器發送ACK消息進行确認。
(13)代理伺服器将ACK确認消息轉發到代理終端B。
(14)終端代理A發送200OK給代理伺服器,表示接受C的呼叫。
(15)代理伺服器轉發200OK給終端代理C。
(16)終端代理C向代理伺服器回送ACK确認。
(17)代理伺服器向代理終端A轉發收到的ACK确認。
A、C之間開始通話。
(18)使用者A挂機,終端代理A向代理伺服器發送Bye請求消息。
(19)代理伺服器轉發Bye消息給終端代理B。
(20)終端代理C發送200OK給代理伺服器,表示接受請求。
(21)代理伺服器轉發200OK響應給終端代理A。
(22)終端代理C重新發送Invite請求給代理伺服器,請求和終端代理B恢複通話。
(23)代理伺服器向代理終端B轉發收到的Invite請求。
2、SIP通信過程封包抓取執行個體分析
l 實驗環境:Linux2.6+Asterisk1.4(開源IPPBX)
l 實驗地點:北京郵電大學資訊與通信工程學院創新實驗室
l SIP代理伺服器IP:59.64.135.22 SIP電話号碼:825002(59.64.135.22)
l SIP代理終端IP:59.64.135.67
l 軟終端:X-lite
l 抓包分析工具:WireShark
注:由于過程太多,以下僅僅抓取“成功注冊”,“呼叫--通話” ,“挂斷”“登出”四種情況做典型包的分析。
Ø 注冊流程:
以上是REGISTER包。
我們可以看到在注冊的時候,終端會向代理伺服器59.64.135.22發送REGISTER請求注冊。
以上是REGISTEROK包。伺服器傳回200 OK,表示注冊成功。
Ø 基本呼叫建立過程:
以上是INVITE包。我們可以看到在發起呼叫初期,終端向825002發出Invite的呼叫請求。
以上是Trying包,說明終端825003正在試着連通伺服器,進一步轉接到825002.
由于設定了自動接聽,是以此次通話沒有振鈴的包。
這是ACK包,代表确認信号。
Ø 正常呼叫釋放過程:
以上是BYE包。這是825002挂斷後伺服器向825003發送的釋放呼叫信号。
Ø 登出流程:
以上是825003登出的包,我們注意到expires=0這說明是登出。
3.總結
SIP協定憑借其簡單、易于擴充、便于實作等諸多優點越來越得到業界的青睐,它正逐漸成為NGN(下一代網絡)和3G多媒體子系統域中的重要協定,并且市場上出現越來越多的支援SIP的用戶端軟體和智能多媒體終端,以及用SIP協定實作的伺服器和軟交換裝置。
------------------------------------------------------------------------------------------------------------------------------------------------分割線---------------------------------------------------------------------------------------------------------------
SIP協定
會話發起協定(SIP)是VoIP技術中最常用的協定之一。它是一種應用層協定,與其他應用層協定協同工作,通過Internet控制多媒體通信會話。
SIP - 概述
以下是有關SIP的幾點注意事項 -
- SIP是用于通過網際網路協定建立,修改和終止多媒體會話的信令協定。會話隻不過是兩個端點之間的簡單調用。端點可以是智能電話,筆記本電腦或可以通過網際網路接收和發送多媒體内容的任何裝置。
- SIP是由IETF(Internet Engineering Task Force)标準定義的應用層協定。它在RFC 3261中定義。
- SIP展現了用戶端 - 伺服器體系結構,以及使用HTTP和URL的URL和URI 以及SMTP的文本編碼方案和頭樣式。
- SIP采用SDP(會話描述協定)的幫助,它描述了用于通過IP網絡傳送語音和視訊的會話和RTP(實時傳輸協定)。
- SIP可用于雙方(單點傳播)或多方(多點傳播)會話。
- 其他SIP應用包括檔案傳輸,即時通訊,視訊會議,網絡遊戲,以及流多媒體分發。
下圖說明了SIP在一般方案中的适用性 -
通常,SIP協定用于兩個或多個端點之間的網際網路電話和多媒體分發。例如,一個人可以使用SIP發起對另一個人的電話呼叫,或者有人可以與許多參與者建立電話會議。
SIP協定的設計非常簡單,配置有限的指令。它也是基于文本的,是以任何人都可以讀取SIP會話中的端點之間傳遞的SIP消息。
有一些實體幫助SIP建立其網絡。在SIP中,每個網元由SIP URI(統一資源辨別符)來辨別,它像一個位址。以下是網絡元素 -
- 使用者代理
- 代理伺服器
- 注冊伺服器
- 重定向伺服器
- 位置伺服器
使用者代理
它是SIP網絡的端點和最重要的網絡元素之一。端點可以啟動,修改或終止會話。使用者代理是SIP網絡中最智能的裝置或網絡元件。它可以是軟電話,手機或筆記本電腦。
使用者代理在邏輯上分為兩部分 -
- 使用者代理用戶端(UAC) - 發送請求并接收響應的實體。
- 使用者代理伺服器(UAS) - 接收請求并發送響應的實體。
SIP基于客戶機 - 伺服器架構,其中呼叫者的電話充當發起呼叫的用戶端,被叫方的電話充當響應呼叫的伺服器。
代理伺服器
網絡元素接收來自使用者代理的請求并将其轉發給另一個使用者。
- 基本上代理伺服器的作用就像一個路由器。
- 它有一些智慧來了解SIP請求,并在URI的幫助下發送它。
- 代理伺服器位于兩個使用者代理之間。
- 源和目的地之間最多可以有70個代理伺服器。
有兩種類型的代理伺服器 -
- 無狀态代理伺服器 - 它隻是轉發收到的消息。這種類型的伺服器不存儲任何呼叫或交易的資訊。
- 有狀态代理伺服器 - 這種類型的代理伺服器可以跟蹤收到的每個請求和響應,并且如果需要,可以将來使用它。如果對方沒有響應,它可以重新發送請求。
注冊伺服器
注冊伺服器接受使用者代理的注冊請求。它可以幫助使用者在網絡中進行身份驗證。它将URI和使用者的位置存儲在資料庫中,以幫助同一域内的其他SIP伺服器。
看看下面的示例,顯示SIP注冊的過程。
這裡呼叫者想要向TMC域注冊。是以,它向TMC的Registrar伺服器發送REGISTER請求,并且伺服器在授權用戶端時傳回200 OK響應。
重定向伺服器
重定向伺服器接收請求,并在注冊器建立的位置資料庫中查找請求的預期收件人。
重定向伺服器使用資料庫擷取位置資訊,并以3xx(重定向響應)響應給使用者。我們将在本教程的後面讨論響應代碼。
位置伺服器
位置伺服器提供有關呼叫者可能的位置到重定向和代理伺服器的資訊。
隻有代理伺服器或重定向伺服器可以聯系位置伺服器。
下圖描繪了每個網絡元素在建立會話中所扮演的角色。
SIP - 系統架構
SIP被構造為分層協定,這意味着其行為根據一組相當獨立的處理階段來描述,隻有每個階段之間的松散耦合。
- SIP的最低層是其文法和編碼。其編碼使用增強的Backus-Naur表格文法(BNF)來指定。
- 第二層是傳輸層。它定義用戶端如何發送請求并接收響應,以及伺服器如何接收請求并通過網絡發送響應。所有SIP元素都包含傳輸層。
- 接下來是事務層。事務是由用戶端事務(使用傳輸層)發送到伺服器事務的請求,以及從伺服器事務發送回用戶端的對該請求的所有響應。使用者代理用戶端(UAC)完成的任何任務都将使用一系列事務進行。無狀态代理不包含事務層。
- 事務層上面的層稱為事務使用者。除了無狀态代理之外,每個SIP實體都是一個事務使用者。
下圖顯示了SIP會話的基本呼叫流程。
以下是對上述呼叫流程的逐漸說明 -
- 發送到代理伺服器的INVITE請求負責啟動會話。
- 代理伺服器發送100 嘗試立即響應呼叫者(Alice)以停止INVITE請求的重新發送。
- 代理伺服器在位置伺服器中搜尋Bob的位址。擷取位址後,進一步轉發INVITE請求。
- 此後,Bob手機生成的180 振鈴(臨時響應)傳回給愛麗絲。
- 鮑勃拿起手機後一個200 OK響應很快産生。
- 一旦200 OK到達Alice,Bob 從Alice 收到一個ACK。
- 同時,會話建立,RTP資料包(會話)從兩端開始流動。
- 會話結束後,任何參與者(Alice或Bob)都可以發送一個BYE請求來終止會話。
- BYE直接從Alice到Bob繞過代理伺服器。
- 最後,Bob發送200 OK響應來确認BYE,會話終止。
- 在上述基本呼叫流程中,可以使用三個事務(标記為1,2,3)。
完整的呼叫(從INVITE到200 OK)稱為對話Dialog。
SIP梯形
代理如何幫助一個使用者與另一個使用者連接配接?讓我們在下圖的幫助下找出。
圖中所示的拓撲結構稱為SIP梯形圖。該過程發生如下 -
- 當呼叫方發起呼叫時,将向代理伺服器發送INVITE消息。代理伺服器收到INVITE後,嘗試借助DNS伺服器解析受理者的位址。
- 在獲得下一個路由之後,呼叫者的代理伺服器(代理1,也稱為出站代理伺服器)将INVITE請求轉發給作為被呼叫者的入站代理伺服器(代理伺服器2)的被呼叫者的代理伺服器。
- 入站代理伺服器聯系位置伺服器以擷取使用者注冊的被叫方位址資訊。
- 從位置伺服器擷取資訊後,将呼叫轉發到其目的地。
- 一旦使用者代理知道他們的位址,他們可以繞過呼叫,即直接通話。
SIP消息有兩種類型 - 請求和響應。
- 請求的開始行包含定義請求的方法,以及定義要發送請求的請求URI。
- 類似地,響應的開始行包含響應代碼。
請求方式
SIP請求是用于建立通信的代碼。為了補充它們,SIP響應通常訓示請求是成功還是失敗。
這些被稱為METHODS的SIP請求使SIP消息可行。
- 方法可以被認為是SIP請求,因為它們請求由另一使用者代理或伺服器采取的特定動作。
- 方法被分為兩種類型 -
- 核心方法
- 擴充方法
核心方法
有六種核心方法,如下所述。
邀請
INVITE用于啟動與使用者代理的會話。換句話說,INVITE方法用于在使用者代理之間建立媒體會話。
- INVITE可以在郵件正文中包含主叫方的媒體資訊。
- 如果INVITE已經接收到成功響應(2xx)或已經發送ACK,則會話被認為是建立的。
- 成功的INVITE請求在兩個使用者代理之間建立對話,直到發送BYE才能終止會話。
- 在已建立的對話框内發送的INVITE被稱為re-INVITE。
- Re-INVITE用于更改會話特性或重新整理對話框的狀态。
邀請示例
以下代碼顯示了INVITE如何使用。
INVITE sips:[email protected] SIP/2.0
Via: SIP/2.0/TLS client.ANC.com:5061;branch = z9hG4bK74bf9
Max-Forwards: 70
From: Alice<sips:[email protected]>;tag = 1234567
To: Bob<sips:[email protected]>
Call-ID: [email protected]
CSeq: 1 INVITE
Contact: <sips:[email protected]>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...
v = 0
o = Alice 2890844526 2890844526 IN IP4 client.ANC.com
s = Session SDP
c = IN IP4 client.ANC.com
t = 3034423619 0
m = audio 49170 RTP/AVP 0
a = rtpmap:0 PCMU/8000
BYE
BYE是用于終止既定會話的方法。這是SIP請求,可以由呼叫者或被叫方發送以終止會話。
- 它不能由代理伺服器發送。
- BYE請求通常路由端到端,繞過代理伺服器。
- BYE不能發送到待處理的INVITE或未建立的會話。
注冊
REGISTER請求執行使用者代理的注冊。該請求由使用者代理發送到注冊伺服器。
- REGISTER請求可以轉發或代理,直到它到達指定域的權威注冊商。
- 它在正在注冊的使用者的To頭中攜帶AOR(記錄位址)。
- REGISTER請求包含時間段(3600sec)。
- 一個使用者代理可以代表另一個使用者代理發送REGISTER請求。這被稱為第三方注冊。這裡,From标簽包含代表To标題中辨別的方送出注冊的方的URI 。
取消
CANCEL用于終止未建立的會話。使用者代理使用此請求取消之前發起的未決呼叫嘗試。
- 它可以由使用者代理或代理伺服器發送。
- CANCEL是逐跳請求,即它通過使用者代理之間的元素,并接收下一個有狀态元素生成的響應。
ACK
ACK用于确認對INVITE方法的最終響應。如果INVITE不可用,則ACK始終沿着INVITE.ACK的方向包含SDP主體(媒體特性)。
ACK可能不會用于修改已經在初始INVITE中發送的媒體描述。
- 接收ACK的有狀态代理必須确定ACK應該向下遊轉發到另一個代理或使用者代理。
- 對于2xx響應,ACK是端到端的,但對于所有其他最終響應,它在涉及有狀态代理時基于逐跳的工作。
OPTIONS
OPTIONS方法用于向使用者代理或代理伺服器詢問其功能并發現其目前的可用性。對請求的響應列出了使用者代理或伺服器的功能。代理從不生成OPTIONS請求。
擴充方法
訂閱
使用者代理使用SUBSCRIBE建立訂閱,以擷取有關特定事件的通知。
- 它包含一個Expires頭字段,訓示訂閱的持續時間。
- 期限過後,訂閱将自動終止。
- 訂閱在使用者代理之間建立一個對話。
- 您可以在到期時間之前通過在對話框内發送另一個SUBSCRIBE來重新訂閱。
- 使用者訂閱将收到200 OK。
- 使用者可以使用Expires值0(零)發送另一個SUBSCRIBE方法來取消訂閱。
通知
使用者代理使用NOTIFY來擷取特定事件的發生。通常,當訂戶和通知程式之間存在訂閱時,NOTIFY将在對話框内觸發。
- 如果通知程式接收到,每個NOTIFY将獲得200 OK響應。
- NOTIFY包含訓示事件的事件頭字段和訓示訂閱的目前狀态的subscriptionstate頭字段。
- 始終在訂閱的開始和結束時發送NOTIFY。
釋出
PUBLISH被使用者代理用于向伺服器發送事件狀态資訊。
- 當有多個來源的事件資訊時,PUBLISH是非常有用的。
- PUBLISH請求類似于NOTIFY,除了它不在對話框中發送。
- PUBLISH請求必須包含Expires頭字段和Min-Expires頭字段。
參考
REFER由使用者代理用于引用另一個使用者代理來通路對話框的URI。
- REFER必須包含Refer-To标題。這是REFER的強制标題。
- REFER可以在對話框内部或外部發送。
- A202 Accepted将觸發REFER請求,訓示其他使用者代理已經接受引用。
資訊
INFO由使用者代理使用,以向其已經建立媒體會話的另一使用者代理發送呼叫信令資訊。
- 這是一個端到端的請求。
- 代理将始終轉發INFO請求。
UPDATE
如果會話未建立,則UPDATE用于修改會話的狀态。使用者可以使用UPDATE更改編解碼器。
如果會話建立,則使用重新邀請來更改/更新會話。
PRACK
PRACK用于确認接收到可靠的臨時響應轉移(1XX)。
- 一般來說,PRACK在接收到包含RSeq可靠序列号和supported:100rel頭的臨時響應時由用戶端生成。
- PRACK在race頭部中包含(RSeq + CSeq)值。
- PRACK方法适用于所有臨時響應,除了100嘗試響應,這是永遠不可靠的運輸。
- PRACK可能包含消息體; 它可以用于提供/答複交換。
資訊
它用于使用SIP發送即時消息。IM通常由參與文字會話的參與者實時交換的短消息。
- MESSAGE可以在對話框内或對話框外發送。
- MESSAGE的内容作為MIME附件在郵件正文中載入。
- 一個200 OK被正常接收響應,以訓示該消息已在其目的地被遞送
去期待陌生,去擁抱驚喜。
會話發起協定(SIP)是VoIP技術中最常用的協定之一。它是一種應用層協定,與其他應用層協定協同工作,通過Internet控制多媒體通信會話。
SIP - 概述
以下是有關SIP的幾點注意事項 -
- SIP是用于通過網際網路協定建立,修改和終止多媒體會話的信令協定。會話隻不過是兩個端點之間的簡單調用。端點可以是智能電話,筆記本電腦或可以通過網際網路接收和發送多媒體内容的任何裝置。
- SIP是由IETF(Internet Engineering Task Force)标準定義的應用層協定。它在RFC 3261中定義。
- SIP展現了用戶端 - 伺服器體系結構,以及使用HTTP和URL的URL和URI 以及SMTP的文本編碼方案和頭樣式。
- SIP采用SDP(會話描述協定)的幫助,它描述了用于通過IP網絡傳送語音和視訊的會話和RTP(實時傳輸協定)。
- SIP可用于雙方(單點傳播)或多方(多點傳播)會話。
- 其他SIP應用包括檔案傳輸,即時通訊,視訊會議,網絡遊戲,以及流多媒體分發。
下圖說明了SIP在一般方案中的适用性 -
通常,SIP協定用于兩個或多個端點之間的網際網路電話和多媒體分發。例如,一個人可以使用SIP發起對另一個人的電話呼叫,或者有人可以與許多參與者建立電話會議。
SIP協定的設計非常簡單,配置有限的指令。它也是基于文本的,是以任何人都可以讀取SIP會話中的端點之間傳遞的SIP消息。
有一些實體幫助SIP建立其網絡。在SIP中,每個網元由SIP URI(統一資源辨別符)來辨別,它像一個位址。以下是網絡元素 -
- 使用者代理
- 代理伺服器
- 注冊伺服器
- 重定向伺服器
- 位置伺服器
使用者代理
它是SIP網絡的端點和最重要的網絡元素之一。端點可以啟動,修改或終止會話。使用者代理是SIP網絡中最智能的裝置或網絡元件。它可以是軟電話,手機或筆記本電腦。
使用者代理在邏輯上分為兩部分 -
- 使用者代理用戶端(UAC)- 發送請求并接收響應的實體。
- 使用者代理伺服器(UAS)- 接收請求并發送響應的實體。
SIP基于客戶機 - 伺服器架構,其中呼叫者的電話充當發起呼叫的用戶端,被叫方的電話充當響應呼叫的伺服器。
代理伺服器
網絡元素接收來自使用者代理的請求并将其轉發給另一個使用者。
- 基本上代理伺服器的作用就像一個路由器。
- 它有一些智慧來了解SIP請求,并在URI的幫助下發送它。
- 代理伺服器位于兩個使用者代理之間。
- 源和目的地之間最多可以有70個代理伺服器。
有兩種類型的代理伺服器 -
- 無狀态代理伺服器- 它隻是轉發收到的消息。這種類型的伺服器不存儲任何呼叫或交易的資訊。
- 有狀态代理伺服器- 這種類型的代理伺服器可以跟蹤收到的每個請求和響應,并且如果需要,可以将來使用它。如果對方沒有響應,它可以重新發送請求。
注冊伺服器
注冊伺服器接受使用者代理的注冊請求。它可以幫助使用者在網絡中進行身份驗證。它将URI和使用者的位置存儲在資料庫中,以幫助同一域内的其他SIP伺服器。
看看下面的示例,顯示SIP注冊的過程。
這裡呼叫者想要向TMC域注冊。是以,它向TMC的Registrar伺服器發送REGISTER請求,并且伺服器在授權用戶端時傳回200 OK響應。
重定向伺服器
重定向伺服器接收請求,并在注冊器建立的位置資料庫中查找請求的預期收件人。
重定向伺服器使用資料庫擷取位置資訊,并以3xx(重定向響應)響應給使用者。我們将在本教程的後面讨論響應代碼。
位置伺服器
位置伺服器提供有關呼叫者可能的位置到重定向和代理伺服器的資訊。
隻有代理伺服器或重定向伺服器可以聯系位置伺服器。
下圖描繪了每個網絡元素在建立會話中所扮演的角色。
SIP - 系統架構
SIP被構造為分層協定,這意味着其行為根據一組相當獨立的處理階段來描述,隻有每個階段之間的松散耦合。
- SIP的最低層是其文法和編碼。其編碼使用增強的Backus-Naur表格文法(BNF)來指定。
- 第二層是傳輸層。它定義用戶端如何發送請求并接收響應,以及伺服器如何接收請求并通過網絡發送響應。所有SIP元素都包含傳輸層。
- 接下來是事務層。事務是由用戶端事務(使用傳輸層)發送到伺服器事務的請求,以及從伺服器事務發送回用戶端的對該請求的所有響應。使用者代理用戶端(UAC)完成的任何任務都将使用一系列事務進行。無狀态代理不包含事務層。
- 事務層上面的層稱為事務使用者。除了無狀态代理之外,每個SIP實體都是一個事務使用者。
下圖顯示了SIP會話的基本呼叫流程。
以下是對上述呼叫流程的逐漸說明 -
- 發送到代理伺服器的INVITE請求負責啟動會話。
- 代理伺服器發送100 嘗試立即響應呼叫者(Alice)以停止INVITE請求的重新發送。
- 代理伺服器在位置伺服器中搜尋Bob的位址。擷取位址後,進一步轉發INVITE請求。
- 此後,Bob手機生成的180 振鈴(臨時響應)傳回給愛麗絲。
- 鮑勃拿起手機後一個200 OK響應很快産生。
- 一旦200 OK到達Alice,Bob 從Alice 收到一個ACK。
- 同時,會話建立,RTP資料包(會話)從兩端開始流動。
- 會話結束後,任何參與者(Alice或Bob)都可以發送一個BYE請求來終止會話。
- BYE直接從Alice到Bob繞過代理伺服器。
- 最後,Bob發送200 OK響應來确認BYE,會話終止。
- 在上述基本呼叫流程中,可以使用三個事務(标記為1,2,3)。
完整的呼叫(從INVITE到200 OK)稱為對話Dialog。
SIP梯形
代理如何幫助一個使用者與另一個使用者連接配接?讓我們在下圖的幫助下找出。
圖中所示的拓撲結構稱為SIP梯形圖。該過程發生如下 -
- 當呼叫方發起呼叫時,将向代理伺服器發送INVITE消息。代理伺服器收到INVITE後,嘗試借助DNS伺服器解析受理者的位址。
- 在獲得下一個路由之後,呼叫者的代理伺服器(代理1,也稱為出站代理伺服器)将INVITE請求轉發給作為被呼叫者的入站代理伺服器(代理伺服器2)的被呼叫者的代理伺服器。
- 入站代理伺服器聯系位置伺服器以擷取使用者注冊的被叫方位址資訊。
- 從位置伺服器擷取資訊後,将呼叫轉發到其目的地。
- 一旦使用者代理知道他們的位址,他們可以繞過呼叫,即直接通話。
SIP消息有兩種類型 - 請求和響應。
- 請求的開始行包含定義請求的方法,以及定義要發送請求的請求URI。
- 類似地,響應的開始行包含響應代碼。
請求方式
SIP請求是用于建立通信的代碼。為了補充它們,SIP響應通常訓示請求是成功還是失敗。
這些被稱為METHODS的SIP請求使SIP消息可行。
- 方法可以被認為是SIP請求,因為它們請求由另一使用者代理或伺服器采取的特定動作。
- 方法被分為兩種類型 -
- 核心方法
- 擴充方法
核心方法
有六種核心方法,如下所述。
邀請
INVITE用于啟動與使用者代理的會話。換句話說,INVITE方法用于在使用者代理之間建立媒體會話。
- INVITE可以在郵件正文中包含主叫方的媒體資訊。
- 如果INVITE已經接收到成功響應(2xx)或已經發送ACK,則會話被認為是建立的。
- 成功的INVITE請求在兩個使用者代理之間建立對話,直到發送BYE才能終止會話。
- 在已建立的對話框内發送的INVITE被稱為re-INVITE。
- Re-INVITE用于更改會話特性或重新整理對話框的狀态。
邀請示例
以下代碼顯示了INVITE如何使用。
INVITE sips:[email protected] SIP/2.0
Via: SIP/2.0/TLS client.ANC.com:5061;branch = z9hG4bK74bf9
Max-Forwards: 70
From: Alice<sips:[email protected]>;tag = 1234567
To: Bob<sips:[email protected]>
Call-ID: [email protected]
CSeq: 1 INVITE
Contact: <sips:[email protected]>
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY
Supported: replaces
Content-Type: application/sdp
Content-Length: ...
v = 0
o = Alice 2890844526 2890844526 IN IP4 client.ANC.com
s = Session SDP
c = IN IP4 client.ANC.com
t = 3034423619 0
m = audio 49170 RTP/AVP 0
a = rtpmap:0 PCMU/8000
BYE
BYE是用于終止既定會話的方法。這是SIP請求,可以由呼叫者或被叫方發送以終止會話。
- 它不能由代理伺服器發送。
- BYE請求通常路由端到端,繞過代理伺服器。
- BYE不能發送到待處理的INVITE或未建立的會話。
注冊
REGISTER請求執行使用者代理的注冊。該請求由使用者代理發送到注冊伺服器。
- REGISTER請求可以轉發或代理,直到它到達指定域的權威注冊商。
- 它在正在注冊的使用者的To頭中攜帶AOR(記錄位址)。
- REGISTER請求包含時間段(3600sec)。
- 一個使用者代理可以代表另一個使用者代理發送REGISTER請求。這被稱為第三方注冊。這裡,From标簽包含代表To标題中辨別的方送出注冊的方的URI 。
取消
CANCEL用于終止未建立的會話。使用者代理使用此請求取消之前發起的未決呼叫嘗試。
- 它可以由使用者代理或代理伺服器發送。
- CANCEL是逐跳請求,即它通過使用者代理之間的元素,并接收下一個有狀态元素生成的響應。
ACK
ACK用于确認對INVITE方法的最終響應。如果INVITE不可用,則ACK始終沿着INVITE.ACK的方向包含SDP主體(媒體特性)。
ACK可能不會用于修改已經在初始INVITE中發送的媒體描述。
- 接收ACK的有狀态代理必須确定ACK應該向下遊轉發到另一個代理或使用者代理。
- 對于2xx響應,ACK是端到端的,但對于所有其他最終響應,它在涉及有狀态代理時基于逐跳的工作。
OPTIONS
OPTIONS方法用于向使用者代理或代理伺服器詢問其功能并發現其目前的可用性。對請求的響應列出了使用者代理或伺服器的功能。代理從不生成OPTIONS請求。
擴充方法
訂閱
使用者代理使用SUBSCRIBE建立訂閱,以擷取有關特定事件的通知。
- 它包含一個Expires頭字段,訓示訂閱的持續時間。
- 期限過後,訂閱将自動終止。
- 訂閱在使用者代理之間建立一個對話。
- 您可以在到期時間之前通過在對話框内發送另一個SUBSCRIBE來重新訂閱。
- 使用者訂閱将收到200 OK。
- 使用者可以使用Expires值0(零)發送另一個SUBSCRIBE方法來取消訂閱。
通知
使用者代理使用NOTIFY來擷取特定事件的發生。通常,當訂戶和通知程式之間存在訂閱時,NOTIFY将在對話框内觸發。
- 如果通知程式接收到,每個NOTIFY将獲得200 OK響應。
- NOTIFY包含訓示事件的事件頭字段和訓示訂閱的目前狀态的subscriptionstate頭字段。
- 始終在訂閱的開始和結束時發送NOTIFY。
釋出
PUBLISH被使用者代理用于向伺服器發送事件狀态資訊。
- 當有多個來源的事件資訊時,PUBLISH是非常有用的。
- PUBLISH請求類似于NOTIFY,除了它不在對話框中發送。
- PUBLISH請求必須包含Expires頭字段和Min-Expires頭字段。
參考
REFER由使用者代理用于引用另一個使用者代理來通路對話框的URI。
- REFER必須包含Refer-To标題。這是REFER的強制标題。
- REFER可以在對話框内部或外部發送。
- A202 Accepted将觸發REFER請求,訓示其他使用者代理已經接受引用。
資訊
INFO由使用者代理使用,以向其已經建立媒體會話的另一使用者代理發送呼叫信令資訊。
- 這是一個端到端的請求。
- 代理将始終轉發INFO請求。
UPDATE
如果會話未建立,則UPDATE用于修改會話的狀态。使用者可以使用UPDATE更改編解碼器。
如果會話建立,則使用重新邀請來更改/更新會話。
PRACK
- 一般來說,PRACK在接收到包含RSeq可靠序列号和supported:100rel頭的臨時響應時由用戶端生成。
- PRACK在race頭部中包含(RSeq + CSeq)值。
- PRACK方法适用于所有臨時響應,除了100嘗試響應,這是永遠不可靠的運輸。
- PRACK可能包含消息體; 它可以用于提供/答複交換。
資訊
- MESSAGE可以在對話框内或對話框外發送。
- MESSAGE的内容作為MIME附件在郵件正文中載入。
- 一個200 OK被正常接收響應,以訓示該消息已在其目的地被遞送