sip協(xié)議詳細(xì)分析與實(shí)現(xiàn)
SIPSIP(Session IniTIaTIon Protocol)是一個(gè)應(yīng)用層的信令控制協(xié)議。用于創(chuàng)建、修改和釋放一個(gè)或多個(gè)參與者的會話。這些會話可以是Internet多媒體會議 、IP電話或多媒體分發(fā)。會話的參與者可以通過組播(mulTIcast)、網(wǎng)狀單播(unicast)或兩者的混合體進(jìn)行通信。
SIP與負(fù)責(zé)語音質(zhì)量的資源預(yù)留協(xié)議(RSVP) 互操作。它還與若干個(gè)其他協(xié)議進(jìn)行協(xié)作,包括負(fù)責(zé)定位的輕型目錄訪問協(xié)議(LDAP)、負(fù)責(zé)身份驗(yàn)證的遠(yuǎn)程身份驗(yàn)證撥入用戶服務(wù) (RADIUS) 以及負(fù)責(zé)實(shí)時(shí)傳輸?shù)?RTP 等多個(gè)協(xié)議。
SIP 的一個(gè)重要特點(diǎn)是它不定義要建立的會話的類型,而只定義應(yīng)該如何管理會話。有了這種靈活性,也就意味著SIP可以用于眾多應(yīng)用和服務(wù)中,包括交互式游戲、音樂和視頻點(diǎn)播以及語音、視頻和 Web 會議。SIP消息是基于文本的,因而易于讀取和調(diào)試。新服務(wù)的編程更加簡單,對于設(shè)計(jì)人員而言更加直觀。SIP如同電子郵件客戶機(jī)一樣重用 MIME 類型描述,因此與會話相關(guān)的應(yīng)用程序可以自動啟動。SIP 重用幾個(gè)現(xiàn)有的比較成熟的 Internet 服務(wù)和協(xié)議,如 DNS、RTP、RSVP 等。不必再引入新服務(wù)對 SIP 基礎(chǔ)設(shè)施提供支持,因?yàn)樵摶A(chǔ)設(shè)施很多部分已經(jīng)到位或現(xiàn)成可用。
對 SIP 的擴(kuò)充易于定義,可由服務(wù)提供商在新的應(yīng)用中添加,不會損壞網(wǎng)絡(luò)。網(wǎng)絡(luò)中基于 SIP 的舊設(shè)備不會妨礙基于 SIP 的新服務(wù)。例如,如果舊 SIP 實(shí)施不支持新的 SIP 應(yīng)用所用的方法/標(biāo)頭,則會將其忽略。
SIP 獨(dú)立于傳輸層。因此,底層傳輸可以是采用 ATM 的 IP。SIP 使用用戶數(shù)據(jù)報(bào)協(xié)議(UDP) 以及傳輸控制協(xié)議(TCP),將獨(dú)立于底層基礎(chǔ)設(shè)施的用戶靈活地連接起來。SIP 支持多設(shè)備功能調(diào)整和協(xié)商。如果服務(wù)或會話啟動了視頻和語音,則仍然可以將語音傳輸?shù)讲恢С忠曨l的設(shè)備,也可以使用其他設(shè)備功能,如單向視頻流傳輸功能。
通信提供商及其合作伙伴和用戶越來越渴求新一代基于 IP 的服務(wù)。如今有了 SIP(The Session IniTIation Protocol 會話啟動協(xié)議),一解燃眉之急。SIP 是不到十年前在計(jì)算機(jī)科學(xué)實(shí)驗(yàn)室誕生的一個(gè)想法。它是第一個(gè)適合各種媒體內(nèi)容而實(shí)現(xiàn)多用戶會話的協(xié)議,如今已成了 Internet 工程任務(wù)組 (IETF) 的規(guī)范。
SIP協(xié)議解析與實(shí)現(xiàn)SIP協(xié)議是一個(gè)基于應(yīng)用層的會話控制協(xié)議。它可以創(chuàng)建、修改、終止多媒體會話(會議),也可以邀請參與者加入到一個(gè)現(xiàn)有的會話。
因?yàn)镾IP是一個(gè)基于應(yīng)用層的協(xié)議,所以它不是一套完整的通訊系統(tǒng)方案,它需要和其它的方案或者協(xié)議結(jié)合起來實(shí)現(xiàn)整套系統(tǒng)。例如,實(shí)時(shí)傳輸協(xié)議(RTP)(RFC1889)用來傳輸音視頻等實(shí)時(shí)的流媒體數(shù)據(jù)。實(shí)時(shí)流協(xié)議(RTSP)(RFC2326)用來控制媒體流的傳遞。媒體網(wǎng)關(guān)控制協(xié)議(MEGACO)(RFC3015)用來控制PSTN網(wǎng)關(guān)。
由此可見,SIP協(xié)議應(yīng)該用來組合其它協(xié)議,從而實(shí)現(xiàn)完整的服務(wù)。但是,SIP基礎(chǔ)的功能和操作不依賴于其它協(xié)議。
SIP( Session Initiation Protocol ,RFC 3261)是由 IETF (國際互聯(lián)網(wǎng)標(biāo)準(zhǔn)制定組織)制定的面向 Internet 會議和電話的信令協(xié)議。SIP是一個(gè)應(yīng)用層的協(xié)議,可以建立,修改或者中止多媒體會話或者呼叫。它是一個(gè)基于ASCII的端到端的協(xié)議,它實(shí)際上是在因特網(wǎng)上提供“約會”服務(wù)。用來實(shí)現(xiàn)VoIP的開放協(xié)議,最常用的有三種,SIP、MGCP(Media Gateway Control Protocol)和H.323。
SIP協(xié)議是專門為 IP 電話,尤其是結(jié)合 Internet 設(shè)計(jì)的協(xié)議,同傳統(tǒng)的 H.323 協(xié)議相比,SIP 擁有明顯的優(yōu)越性:優(yōu)異的可擴(kuò)展性--大大提高了系統(tǒng)的處理能力;與 Internet 緊密結(jié)合--使通訊更加輕松便捷的;卓越的開放性--不僅能夠?qū)κ謾C(jī)、 PDA 等移動設(shè)備提供良好的支持,對于在線即時(shí)交流、語音和視頻數(shù)據(jù)傳輸?shù)榷嗝襟w應(yīng)用也能夠很好地完成。
SIP協(xié)議的特性和優(yōu)勢
與SIP兼容的協(xié)議
SIP協(xié)議可以單獨(dú)地工作,也可以與下面的協(xié)議一起工作。
二第一個(gè)例子
下面引用RFC3261的例子來說明sip的基本功能,包括:定位終端,發(fā)送通訊請求,協(xié)商會話參數(shù),建立會話和撤銷建立的會話。圖1顯示了用戶Alice和Bob使用SIP交換信息的一個(gè)典型的例子(每一個(gè)消息用字母F和一個(gè)數(shù)字來標(biāo)號,標(biāo)號的前面有一個(gè)簡短的消息類型說明)。在這個(gè)例子中,Alice使用一個(gè)在她的PC機(jī)中的SIP應(yīng)用程序呼叫Bob,Bob使用他的SIP電話,這個(gè)SIP電話登錄了互聯(lián)網(wǎng)。同時(shí),請注意兩個(gè)SIP代理服務(wù)器在Alice和Bob的會話的建立中起到的作用。
Alice呼叫Bob是使用他的SIP標(biāo)識符。SIP標(biāo)識符是一種URI(Uniform Resource Identifier),稱之為SIP URI。SIP URI格式很象email地址,包含一個(gè)用戶名和一個(gè)主機(jī)名,如:sip:bob@biloxi.com。這里biloxi.com是Bob的SIP服務(wù)提供者的域名。Alice的SIP URI是:sip:alice@atlanta.com。SIP也支持安全URI,叫做SIPS URI,例如,sips:bob@biloxi.com。一個(gè)向SIPS URI的呼叫使用加密傳輸(也就是TLS)來攜帶從呼叫者到被呼叫者所有的SIP消息。
SIP是一個(gè)與HTTP協(xié)議很像的,請求/應(yīng)答式的事務(wù)模型。每一個(gè)事務(wù)最少由一個(gè)要完成特定方法或功能的請求,和服務(wù)器端的一個(gè)應(yīng)答組成。在這個(gè)例子中,這個(gè)事務(wù)從Alice的軟電話發(fā)送一個(gè)INVITE請求到Bob的SIP URI開始。INVITE是一個(gè)SIP消息,它表示請求者Alice想與Bob通話。INVITE請求包含一些頭域。頭域被稱為屬性,可以提供關(guān)于這個(gè)消息的額外信息。關(guān)于頭域我們一會兒將會詳細(xì)說明它們。圖1中的INVITE信息(F1)可能像這樣:
第一行文本是這個(gè)請求的方法名(INVITE)。后面的行是多個(gè)頭域。這里只列出了最少需要的頭域。先在這里對這些頭域做一個(gè)簡要的介紹:
Via頭域包含Alice希望收到對于這個(gè)請求的應(yīng)答的地址。也就是她告訴請求的接收者,應(yīng)答應(yīng)該發(fā)送到 pc33.atlanta.com。后面的branch參數(shù)是這個(gè)事務(wù)的標(biāo)識符。
To頭域包含一個(gè)顯示名(Bob)和一個(gè)SIP URI或者SIPS URI,這里是使用的SIP URI(sip:bob@biloxi.com)。這個(gè)SIP URI就是這個(gè)請求要發(fā)送的目標(biāo)。
From頭域也包含一個(gè)顯示名(Alice)和一個(gè)SIP URI或者SIPS URI,這里是使用的SIP
URI(sip:alice@atlanta.com)來指出請求的發(fā)起人。這個(gè)頭域還包含了一個(gè)tag參數(shù),這個(gè)參數(shù)包含了一個(gè)隨機(jī)字符串(1928301774),這個(gè)字符串的數(shù)字會被軟電話自動增加,它主要起到鑒別的作用,后面還會說明它。
Call-ID頭域包含一個(gè)全局唯一標(biāo)識符來標(biāo)識這次呼叫。這個(gè)標(biāo)識符使用一個(gè)隨即字符串和軟電話所在的主機(jī)名(或者IP地址)一起生成。這樣,To頭域、From頭域和Call-ID這三個(gè)頭域就可以唯一的確定了Alice和Bob的這條點(diǎn)對點(diǎn)的通信關(guān)系,并且將這個(gè)通信關(guān)系交給一個(gè)對話(dialog)來處理了。
Cseq頭域(命令序列)包含一個(gè)整數(shù)和一個(gè)方法名字。在這個(gè)對話中每一個(gè)新的請求都會增加這個(gè)整數(shù)的值,保證這個(gè)數(shù)值是有序的。
Contact頭域包含一個(gè)SIP URI或者SIPS URI指出一個(gè)能夠接觸到Alice的直接路由,一般這個(gè)SIP URI由用戶名和一個(gè)完全限定域名(FQDN)構(gòu)成。因?yàn)樵S多終端系統(tǒng)沒有注冊域名,所以也可以使用IP地址代替FQDN。Via頭域向?qū)Ψ街赋隽诉@個(gè)請求的應(yīng)答應(yīng)該發(fā)送到哪里,而Contact頭域向?qū)Ψ街赋隽藢淼恼埱髴?yīng)該發(fā)送到哪里。
Max-Forwards頭域限制了在這個(gè)請求傳送到目的地的時(shí)候最多可以有多少跳。它包含一個(gè)整數(shù),在每一跳這個(gè)整數(shù)都會被減少。
Content-Type頭域描述消息體的類型(在這個(gè)例子里消息體采用了SDP描述,但是消息體內(nèi)容沒有給出)。
Content-Length頭域指出了消息體的字節(jié)數(shù)。
在后面我們將完整的介紹SIP頭域(RFC3261第20節(jié))。
在會話中像媒體類型、編碼方式、采樣率等信息都不使用SIP描述,而是在消息體中使用其它會話描述協(xié)議的格式。這個(gè)例子中采用了SDP描述(RFC2327)。
軟電話不知道Bob或者擁有biloxi.com域名的SIP服務(wù)器,它將INVITE請求發(fā)送給為Alice提供服務(wù)的域名為atlanta.com的SIP服務(wù)器。關(guān)于Alice如何獲得atlanta.com SIP服務(wù)器的地址,可以使用由Alice的軟電話指定,或者使用DHCP探測到等方式。
atlanta.com SIP服務(wù)器是一個(gè)SIP代理服務(wù)器。一個(gè)代理服務(wù)器接收SIP請求,為請求的發(fā)送者轉(zhuǎn)發(fā)請求。在這個(gè)例子中,代理服務(wù)器接收到INVITE請求后發(fā)送一個(gè)100應(yīng)答(Trying)給Alice的軟電話。100應(yīng)答(Trying)指出這個(gè)INVITE請求已經(jīng)被代理服務(wù)器接收到,并且已被經(jīng)進(jìn)一步向目的地路由。
SIP中的應(yīng)答使用3位數(shù)字表示,每一個(gè)編號都表示一個(gè)描述短語。這個(gè)100應(yīng)答(Trying)也同樣包含和INVITE請求一樣的To、From、Call-ID、CSeq和Via以及branch參數(shù),這樣可以使Alice的軟電話知道這個(gè)應(yīng)答是對應(yīng)發(fā)送的INVITE請求的。atlanta.com代理服務(wù)器定位出biloxi.com代理服務(wù)器(這可能需要通過域名解析服務(wù)器(DNS)等實(shí)現(xiàn),后面還會詳細(xì)講解)獲得了它的IP地址,并且準(zhǔn)備把INVITE請求轉(zhuǎn)發(fā)給biloxi.com代理服務(wù)器。在轉(zhuǎn)發(fā)請求之前,atlanta.com代理服務(wù)器增加了一個(gè)額外的Via頭域,這個(gè)Via頭域包含自己的地址(這時(shí)候這個(gè)INVITE請求的第一個(gè)Via頭域包含Alice的軟電話的地址)。
biloxi.com代理服務(wù)器接收到這個(gè)INVITE請求,并且也發(fā)送一個(gè)100(Trying)應(yīng)答給atlanta.com代理服務(wù)器指出它已經(jīng)接收到這個(gè)INVITE請求,并正在處理這個(gè)請求。biloxi.com代理服務(wù)器知道Bob的IP地址(這可能需要定位服務(wù)),它又在這個(gè)INVITE請求中加入了一個(gè)新的Via頭域,值為自己的地址,然后它把這個(gè)INVITE請求發(fā)送給Bob的SIP電話。
Bob的SIP電話接收到這個(gè)INVITE請求,發(fā)送一個(gè)180(Ringing)應(yīng)答,同時(shí)使用鈴聲通知Bob有一個(gè)來自Alice的呼叫,讓Bob決定是否接聽。這個(gè)180(Ringing)應(yīng)答反向經(jīng)過這兩個(gè)代理服務(wù)器被發(fā)送到Alice。每一個(gè)代理服務(wù)器使用Via頭域決定向哪里發(fā)送這個(gè)應(yīng)答,并且把移除它自己添加的Via頭域。這樣,雖然只有初始的INVITE請求發(fā)送的時(shí)候使用了DNS服務(wù)和定位服務(wù),而這個(gè)180(Ringing)應(yīng)答沒有使用,同時(shí)代理服務(wù)器也不需要記錄整個(gè)通訊的狀態(tài),但是這個(gè)應(yīng)答還是能夠成功的發(fā)送給請求的發(fā)送者Alice。
當(dāng)alice的軟電話接收到180(Ringing)應(yīng)答后,它將這個(gè)消息告訴給Alice,也許使用一個(gè)聲音(彩鈴)或者在Alice的屏幕上顯示一個(gè)消息。
在這個(gè)例子中,Bob決定接聽電話,當(dāng)他按下接聽按鈕時(shí),他的SIP電話發(fā)送200(OK)應(yīng)答表示接受了這個(gè)呼叫。這個(gè)200(OK)應(yīng)答包含一個(gè)消息體,消息體使用SDP描述Bob準(zhǔn)備和Alice建立的會話的媒體類型等信息。這樣,Alice和Bob交換了一次SIP信息:Alice用INVITE請求發(fā)送一次給Bob,Bob用200(OK)應(yīng)答發(fā)送一次給Alice。這個(gè)交換實(shí)現(xiàn)了基本的協(xié)商能力和簡單的offer/answer模型。如果Bob不希望接聽電話,或者他現(xiàn)在正忙(接聽其它電話),那么他會發(fā)送一個(gè)錯(cuò)誤應(yīng)答而不是200(OK)應(yīng)答。一個(gè)錯(cuò)誤應(yīng)答將不會建立會話。
Bob發(fā)送的200(OK)應(yīng)答可能是這樣的:
應(yīng)答的第一行包含一個(gè)應(yīng)答代碼(200)和一個(gè)解釋短語(OK)。其它行就是應(yīng)答的頭域。Via,To,F(xiàn)rom,Call-ID和CSeq頭域的值都從INVITE請求拷貝而來(這時(shí)候應(yīng)該有3個(gè)Via頭域,分別由Alice的SIP軟電話,atlanta.com代理服務(wù)器,和biloxi.com代理服務(wù)器添加)。Bob的SIP電話添加一個(gè)tag參數(shù)到To頭域。以后所有的屬于這個(gè)對話的請求和應(yīng)答都要包含這個(gè)tag參數(shù)。
當(dāng)Alice的軟電話接收到這個(gè)200(OK)應(yīng)答后,馬上停止響鈴并顯示呼叫已經(jīng)被接聽了。最后,Alice發(fā)送一個(gè)確認(rèn)信息(ACK)給Bob的SIP電話,表示自己收到了最終應(yīng)答(200(OK))。這個(gè)例子中的最終應(yīng)答由Alice直接發(fā)送給了Bob,這是因?yàn)锳lice的軟電話從Contact頭域里面可以得到Bob的地址信息。通過INVITA/200/ACK的三步握手,SIP會話就建立起來了。關(guān)于SIP會話建立的詳細(xì)步驟請參看RFC3261第13節(jié)。
現(xiàn)在Alice和Bob的多媒體會話已經(jīng)建立起來了,他們可以發(fā)送通過SDP協(xié)商好的格式的媒體數(shù)據(jù)了。一般來說,媒體數(shù)據(jù)包的傳輸與SIP消息的傳輸采用不同的通信方式。SIP消息大多通過代理服務(wù)器轉(zhuǎn)發(fā),而媒體數(shù)據(jù)多使用點(diǎn)對點(diǎn)的傳輸。
在會話過程中,無論是Alice還是Bob決定改變這個(gè)媒體會話,都要通過發(fā)送一個(gè)re-INVITE請求。這個(gè)re-INVITE請求包含新的媒體描述(可能是SDP),它不會建立新的會話,而是修改當(dāng)前已經(jīng)存在的會話。對方接收到這個(gè)請求后,發(fā)送一個(gè)200(OK)同意這個(gè)改變,最后請求者發(fā)送ACK。如果對方不同意這個(gè)修改,可能會發(fā)送一個(gè)錯(cuò)誤應(yīng)答,比如488(不接受)。但是這個(gè)失敗應(yīng)答不會使已存在的會話退出,而是繼續(xù)使用以前協(xié)商的媒體進(jìn)行通信。關(guān)于修改一個(gè)會話的詳細(xì)說明,請參看RFC3261第14節(jié)。
最后,Bob發(fā)送BYE消息掛斷電話。BYE消息直接發(fā)送到Alice的軟電話。Alice發(fā)送200(OK)確定接收到了BYE消息,并且終止這個(gè)會話。Bob不用發(fā)送ACK,因?yàn)锳CK只有在接收到對INVITE的應(yīng)答時(shí)才被發(fā)送。關(guān)于終止一個(gè)會話更詳細(xì)的說明,請參看RFC3261第15節(jié)。還有一個(gè)問題就是關(guān)于biloxi.com服務(wù)器如何獲得Bob的位置。Bob的SIP電話開機(jī)的時(shí)候會向一個(gè)注冊服務(wù)器發(fā)送REGISTER消息。REGISTER消息的作用是將Bob的SIP URI或者SIPS URI與Bob當(dāng)前使用的電話地址進(jìn)行幫定,并將這個(gè)幫定信息保存到數(shù)據(jù)庫中,這被稱之為定位服務(wù)(location service)。biloxi.com代理服務(wù)器使用定位服務(wù)獲得Bob的地址。注冊服務(wù)器、代理服務(wù)器、定位服務(wù)器都是邏輯上的服務(wù)器,而不是物理上的服務(wù)器,所以他們可以位于同一臺服務(wù)器上。