1.1 業務介紹
會話初始協定(Session Initiation Protocol)是一種信令協定,用于初始、管理和終止網絡中的語音和視訊會話,具體地說就是用來生成、修改和終結一個或多個參與者之間的會話。SIP的業務模式是一個點對點協定,其中有兩個要素——SIP使用者代理和SIP網絡伺服器。使用者代理是呼叫的終端系統元素,而SIP伺服器是處理與多個呼叫相關聯信令的網絡裝置。使用者代理本身具有一客戶機元素(使用者代理客戶機UAC)和一伺服器元素(使用者代理伺服器UAS)。客戶機元素初始呼叫而伺服器元素應答呼叫。這允許點到點的呼叫通過客戶機-伺服器協定來完成。下圖是SIP業務的網絡結構和各個參與者的關系。

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請求。
(5)呼叫請求送到被叫終端代理B後,被叫忙,終端代理B向代理伺服器送486被叫忙響應。
(6)代理伺服器向終端代理A轉發該響應消息。
(7)終端代理A向代理伺服器回送ACK确認消息。
(8)代理伺服器向終端代理B送ACK确認資訊。
Ø 被叫無應答流程一:
(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)無嚴格順序關系。
Ø 被叫無應答流程二:
(7)被叫久振鈴無應答,終端代理B判斷逾時後向代理伺服器送408Requesttimeout消息放棄該呼叫。
(8)代理伺服器收到408Requesttimeout消息後,轉發該消息給終端代理A。
(9)代理伺服器回送ACK确認給終端代理B。
(10)終端代理A向代理伺服器回送ACK确認。
注:以上步驟中的(9)到(10)無嚴格順序關系。
Ø 遇忙呼叫前轉:
(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請求;
(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。
Ø 呼叫保持:
(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請求。
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這說明是登出。
SIP協定憑借其簡單、易于擴充、便于實作等諸多優點越來越得到業界的青睐,它正逐漸成為NGN(下一代網絡)和3G多媒體子系統域中的重要協定,并且市場上出現越來越多的支援SIP的用戶端軟體和智能多媒體終端,以及用SIP協定實作的伺服器和軟交換裝置。