會話發起協議(SIP)是VoIP技術中最經常使用的協議之一。它是一種應用層協議,與其餘應用層協議協同工做,經過Internet控制多媒體通訊會話。數據庫
如下是有關SIP的幾點注意事項 -服務器
SIP是用於經過因特網協議建立,修改和終止多媒體會話的信令協議。會話只不過是兩個端點之間的簡單調用。端點能夠是智能電話,筆記本電腦或能夠經過因特網接收和發送多媒體內容的任何設備。網絡
SIP是由IETF(Internet Engineering Task Force)標準定義的應用層協議。它在RFC 3261中定義。架構
SIP體現了客戶端 - 服務器體系結構,以及使用HTTP和URL的URL和URI 以及SMTP的文本編碼方案和頭樣式。併發
SIP採用SDP(會話描述協議)的幫助,它描述了用於經過IP網絡傳送語音和視頻的會話和RTP(實時傳輸協議)。app
SIP可用於雙方(單播)或多方(多播)會話。編碼
其餘SIP應用包括文件傳輸,即時通信,視頻會議,網絡遊戲,以及流多媒體分發。spa
下圖說明了SIP在通常方案中的適用性 -設計
一般,SIP協議用於兩個或多個端點之間的互聯網電話和多媒體分發。例如,一我的可使用SIP發起對另外一我的的電話呼叫,或者有人能夠與許多參與者創建電話會議。3d
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的最低層是其語法和編碼。其編碼使用加強的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梯形圖。該過程發生以下 -
當呼叫方發起呼叫時,將向代理服務器發送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:Bob@TMC.com SIP/2.0 Via: SIP/2.0/TLS client.ANC.com:5061;branch = z9hG4bK74bf9 Max-Forwards: 70 From: Alice<sips:Alice@TTP.com>;tag = 1234567 To: Bob<sips:Bob@TMC.com> Call-ID: 12345601@192.168.2.1 CSeq: 1 INVITE Contact: <sips:Alice@client.ANC.com> 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是用於終止既定會話的方法。這是SIP請求,能夠由呼叫者或被叫方發送以終止會話。
它不能由代理服務器發送。
BYE請求一般路由端到端,繞過代理服務器。
BYE不能發送到待處理的INVITE或未創建的會話。
REGISTER請求執行用戶代理的註冊。該請求由用戶代理髮送到註冊服務器。
REGISTER請求能夠轉發或代理,直到它到達指定域的權威註冊商。
它在正在註冊的用戶的To頭中攜帶AOR(記錄地址)。
REGISTER請求包含時間段(3600sec)。
一個用戶代理能夠表明另外一個用戶代理髮送REGISTER請求。這被稱爲第三方註冊。這裏,From標籤包含表明To標題中標識的方提交註冊的方的URI 。
CANCEL用於終止未創建的會話。用戶代理使用此請求取消以前發起的未決呼叫嘗試。
它能夠由用戶代理或代理服務器發送。
CANCEL是逐跳請求,即它經過用戶代理之間的元素,並接收下一個有狀態元素生成的響應。
ACK用於確認對INVITE方法的最終響應。若是INVITE不可用,則ACK始終沿着INVITE.ACK的方向包含SDP主體(媒體特性)。
ACK可能不會用於修改已經在初始INVITE中發送的媒體描述。
接收ACK的有狀態代理必須肯定ACK應該向下游轉發到另外一個代理或用戶代理。
對於2xx響應,ACK是端到端的,但對於全部其餘最終響應,它在涉及有狀態代理時基於逐跳的工做。
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能夠在對話框內部或外部發送。
A 202 Accepted將觸發REFER請求,指示其餘用戶代理已經接受引用。
INFO由用戶代理使用,以向其已經創建媒體會話的另外一用戶代理髮送呼叫信令信息。
這是一個端到端的請求。
代理將始終轉發INFO請求。
若是會話未創建,則UPDATE用於修改會話的狀態。用戶可使用UPDATE更改編解碼器。
若是會話創建,則使用從新邀請來更改/更新會話。
PRACK用於確認接收到可靠的臨時響應轉移(1XX)。
通常來講,PRACK在接收到包含RSeq可靠序列號和supported:100rel 頭的臨時響應時由客戶端生成。
PRACK在race頭部中包含(RSeq + CSeq)值。
PRACK方法適用於全部臨時響應,除了100嘗試響應,這是永遠不可靠的運輸。
PRACK可能包含消息體; 它能夠用於提供/答覆交換。
它用於使用SIP發送即時消息。IM一般由參與文字會話的參與者實時交換的短消息。
MESSAGE能夠在對話框內或對話框外發送。
MESSAGE的內容做爲MIME附件在郵件正文中載入。
一個200 OK被正常接收響應,以指示該消息已在其目的地被遞送。