這里,讀者要注意,卷1完全是rfc3261的中文翻譯,如果讀者有其他的版本或者更好的學(xué)習資源也可以參考其他的資源學(xué)習,筆者正在翻譯的版本可能結合一些應用場(chǎng)景和拓撲圖,方便讀者更好地了解SIP協(xié)議,所以和rfc3261 官方文檔的格式可能完全不一致,微信格式可能會(huì )造成一些閱讀問(wèn)題,筆者會(huì )在最終以PDF或者word的格式發(fā)布RFC3261 中文版本,希望讀者耐心等待。
筆者僅發(fā)布一些最新的rfc3261的前面的章節,可能不完整,也可能和其他作者的比不是太正確,大家取長(cháng)補短,也基本不妨礙對某些知識點(diǎn)的進(jìn)一步了解。另外,rfc3261本身和其他技術(shù)協(xié)議一樣,完全是非常枯燥的閱讀體驗,沒(méi)有心靈雞湯或者其他勵志的內容匿名煽情,如果讀者想完整閱讀理解了這些協(xié)議的規范,多多少少需要一點(diǎn)耐心,還要耐得住寂寞。如果讀者已經(jīng)有了一些經(jīng)驗的話(huà),結合協(xié)議本身再次閱讀,會(huì )有一種對SIP技術(shù)的重新認識,使得自己的技術(shù)得以大幅提升。無(wú)奈,如果你的才華支撐不了你的夢(mèng)想,只能死磕。所以,還是一步步了解這些枯燥的技術(shù)概念才能逐漸掌握現在的SIP軟交換。
以下是RFC3261的部分中文學(xué)習筆記。格式和排版可能不太好看,在最終的PDF版本中會(huì )糾正。希望諒解!
1、背景介紹
很多基于網(wǎng)絡(luò )的應用軟件都要求可以實(shí)現會(huì )話(huà)創(chuàng )建和管理,這里的會(huì )話(huà)可以看著(zhù)是關(guān)聯(lián)多個(gè)參與方交換數據的方式。實(shí)際部署這些應用軟件是非常復雜的過(guò)程:用戶(hù)可能在幾個(gè)終端之間移動(dòng)切換,用戶(hù)也可能使用多個(gè)名字,用戶(hù)也可能使用不同的媒體,有時(shí)還同時(shí)使用不同的媒體介質(zhì)。目前,有很多不同的協(xié)議被準許在網(wǎng)絡(luò )上運行,這些協(xié)議來(lái)傳輸各種形式的實(shí)時(shí)媒體會(huì )話(huà)數據,例如語(yǔ)音視頻,文本信息。 Session Initiation Protocol (SIP) 支持以上所說(shuō)的這些功能描述和相關(guān)的協(xié)議,它可以支持開(kāi)啟網(wǎng)絡(luò )的終端(called user agents)來(lái)發(fā)現其他的終端,準許其他終端的某些會(huì )話(huà)屬性,終端之間可以共享這些會(huì )話(huà)屬性。
為了查詢(xún)到期望的會(huì )話(huà)參與對象,和其他的功能,SIP支持了網(wǎng)絡(luò )主機設施設備創(chuàng )建(稱(chēng)為代理服務(wù)器),用戶(hù)代理可以對會(huì )話(huà)發(fā)送注冊,邀請和其他的請求。SIP是一個(gè)敏捷,通用的工具,它用來(lái)創(chuàng )建,修改和結束會(huì )話(huà),它可以不依賴(lài)于正在工作的傳輸協(xié)議,并且無(wú)需依賴(lài)于各種已建立的會(huì )話(huà)類(lèi)型。
2、SIP功能概述
SIP 一種應用層的控制協(xié)議,它可以創(chuàng )建,修改和結束多媒體會(huì )話(huà)(會(huì )議),例如網(wǎng)絡(luò )電話(huà)呼叫。SIP也可以邀請參與對象加入到已存在的會(huì )話(huà),例如多方廣播會(huì )議。它可以從當前存在的會(huì )話(huà)中再加入媒體也可以移除媒體。SIP可以透明支持名稱(chēng)映射,服務(wù)重新轉發(fā)服務(wù),這些服務(wù)功能支持個(gè)人移動(dòng)能力-無(wú)論網(wǎng)絡(luò )位置如何,用戶(hù)可以在網(wǎng)絡(luò )中保持一個(gè)對外單點(diǎn)可視的身份。
SIP支持創(chuàng )建和結束媒體通信的五個(gè)方面的功能:
- 用戶(hù)定位: 端系統的決定來(lái)支持通信;
- 用戶(hù)有效性: 決定被呼叫方是否有意愿決定加入通信;
- 用戶(hù)能力: 決定用戶(hù)可使用的媒體和其媒體參數;
- 會(huì )話(huà)創(chuàng )建: "ringing",在呼叫方和被呼叫方之間創(chuàng )建會(huì )話(huà)參數;
- 會(huì )話(huà)管理: 包括轉發(fā),結束會(huì )話(huà),修改會(huì )話(huà)參數和調用服務(wù)。
SIP 不是一個(gè)單一,垂直集成度通信系統。SIP而是一個(gè)模塊,它可以用來(lái)和其他的IETF協(xié)議集成來(lái)構建一個(gè)完整的媒體架構。典型的架構如,和實(shí)時(shí)傳輸協(xié)議(RTP)配合,實(shí)現實(shí)時(shí)數據傳輸,提供QoS反饋,使用實(shí)時(shí)媒體協(xié)議(RTSP)來(lái)控制媒體流和媒體的發(fā)送控制,媒體網(wǎng)關(guān)控制協(xié)議
(MEGACO)(RFC 3015[30]) 來(lái)控制網(wǎng)關(guān)對PSTN網(wǎng)絡(luò )的支持,和會(huì )話(huà)描述協(xié)議 (SDP) (RFC 2327[1])來(lái)描述媒體會(huì )話(huà)。因此,SIP應該結合其他的協(xié)議一起使用對用戶(hù)提供完整的服務(wù)。但是,基本的SIP功能和操作不會(huì )依賴(lài)于其他任何協(xié)議。
SIP 本身不提供服務(wù)。但是,SIP提供基本的操作,這些操作可以支持部署不同的服務(wù)。例如,SIP可以定位一個(gè)用戶(hù),并且對當前定位發(fā)送一個(gè)不透明的對象。如果此基本操作用來(lái)支持發(fā)送一個(gè)寫(xiě)入SDP的會(huì )話(huà)描述,終端可以同意會(huì )話(huà)中的參數。如果同樣的操作用來(lái)傳遞一張呼叫方的圖片和此會(huì )話(huà)描述,那么就可以在早期部署一個(gè)“caller ID”服務(wù)。就像這個(gè)例子所展示的,一個(gè)單個(gè)基本操作往往被用來(lái)提供不同的服務(wù)。
SIP 不提供會(huì )議控制服務(wù)例如發(fā)言權控制和發(fā)言,它不能對會(huì )議發(fā)出命令控制如何管理會(huì )議。SIP可以用來(lái)發(fā)起一個(gè)會(huì )話(huà),這個(gè)會(huì )話(huà)可以用來(lái)支持一些會(huì )議控制協(xié)議。因為,SIP創(chuàng )建的消息和會(huì )話(huà)可以傳遞到完全不同的網(wǎng)絡(luò )中,SIP不能也不會(huì )提供任何網(wǎng)絡(luò )資源預設的支持能力。
SIP所提供的服務(wù)的本質(zhì)使得安全性特別重要。對于對端來(lái)說(shuō),SIP提供了一個(gè)安全服務(wù)單元,這些服務(wù)單元包括拒絕攻擊防止服務(wù),認證(包括用戶(hù)對用戶(hù),代理對用戶(hù)),集成保護,加密和私有服務(wù)。
SIP 可以支持IPv4和IPv6兩種網(wǎng)絡(luò )環(huán)境。
3、術(shù)語(yǔ)
在本文檔中,關(guān)鍵詞 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 和 "OPTIONAL" 通過(guò)BCP 14, RFC 2119[2] 加以解釋?zhuān)⑶艺f(shuō)明了遵從SIP部署要求級別和嚴格程度。讀者需要根據關(guān)鍵詞的字面意思來(lái)區分這些規則的基本和寬泛程度,盡可能最大程度對應SIP協(xié)議的要求。很多時(shí)候,由于開(kāi)發(fā)人員,特別是對英文協(xié)議了解不夠,或者對協(xié)議的理解不同,所以導致一些兼容性問(wèn)題或者功能不一致等問(wèn)題。
4、操作概述
此部分使用一個(gè)簡(jiǎn)單示例介紹了SIP的基本操作。它實(shí)際上是一個(gè)學(xué)習輔導,沒(méi)有包含任何正式的說(shuō)明。
第一個(gè)示例顯示了SIP的基本功能:終端定位,希望通信的意愿,創(chuàng )建會(huì )話(huà)參數的協(xié)商和創(chuàng )建會(huì )話(huà)后會(huì )話(huà)拆線(xiàn)。
圖表1 顯示了一個(gè)典型的介于兩個(gè)用戶(hù)之間的SIP消息交互,兩個(gè)用戶(hù)分別是Alice和 Bob。(每個(gè)消息都通過(guò)一個(gè)帶字母F的標簽來(lái)標注,文本號碼說(shuō)明一個(gè)標注號碼)。在這個(gè)例子中,Alice使用了一個(gè)在PC上運行的SIP應用程序(作為一個(gè)軟電話(huà))來(lái)呼叫Bob,Bob的電話(huà)是一個(gè)基于互聯(lián)網(wǎng)的SIP電話(huà)。這個(gè)圖例也同時(shí)顯示了,這里有兩個(gè)SIP 代理服務(wù)器介于A(yíng)lice和BoB之間來(lái)支持會(huì )話(huà)管理工作。在圖例1中,這種典型的設置方式我們通常稱(chēng)之為“SIP 拓撲圖” "SIP 框架" 。
Alice使用自己的SIP身份 “呼叫”Bob,這種SIP身份是一種URL類(lèi)型,我們這里稱(chēng)之為SIP URL。SIP URLs在Section 19.1中做了定義。它的格式和郵件的格式非常相似,一般都包括一個(gè)用戶(hù)名稱(chēng)和主機名稱(chēng)。在這個(gè)例子中,它就是 sip:bob@biloxi.com, 這里biloxi.com是一個(gè)Bob的SIP服務(wù)提供商。Alice可能也具有和Bob的URL同樣的類(lèi)型,或點(diǎn)擊一個(gè)超鏈接后進(jìn)入一個(gè)地址薄。SIP同樣也提供一個(gè)安全的URL,被稱(chēng)之為SIPS URL。安全URL的示例為sips:bob@biloxi.com。通過(guò)SIPS URL發(fā)起的呼叫可以保證安全,加密的傳輸,它用來(lái)傳輸所有從呼叫方到被呼叫方域的所有SIP消息。 從這里,開(kāi)始,SIP的請求消息安全地發(fā)送到被呼叫方,但是安全機制依賴(lài)于被呼叫方域的安全策略設置。
SIP 是基于一種類(lèi)似于HTTP形式的請求/響應事務(wù)處理模式。每個(gè)事務(wù)處理包括一個(gè)啟動(dòng)了特別method方法的請求,或者一個(gè)功能,和至少一個(gè)來(lái)自于服務(wù)器端的響應構成。在這個(gè)例子中,事務(wù)處理是以Alice的軟電話(huà)開(kāi)始,軟電話(huà)發(fā)送一個(gè)INVITE請求,攜帶了Bob SIP URL地址。這里,INVITE就是一個(gè)SIP method方法,它指定了一個(gè)執行命令,請求方(Alice)想讓服務(wù)器方(Bob)接收這個(gè)請求。這個(gè)INVITE請求中包含了幾個(gè)頭域header fields。Header fields 被命名為屬性值,這些屬性值提供了關(guān)于消息的其他額外信息。在INVITE中的某些屬性表示了呼叫的唯一身份,目的地地址,Alice的地址,和Alice和Bob之間創(chuàng )建會(huì )話(huà)所期望的會(huì )話(huà)類(lèi)型的信息。INVITE (F1消息中)可能類(lèi)似于這樣的流程:

Figure 1: SIP session setup example with SIP trapezoid
INVITE sip:bob@biloxi.com SIP/2.0
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: Bob
From: Alice ;tag=1928301774
Call-ID: a84b4c76e66710@pc33.atlanta.com
CSeq: 314159 INVITE
Contact:
Content-Type: application/sdp
Content-Length: 142
(Alice的SDP 消息不顯示)
文本消息的第一行包含了一個(gè)方法名稱(chēng)method(INVITE)。 緊接著(zhù)的是幾行包含一個(gè)header 值域的列表。在這個(gè)示例中,它們包含了最少的要求設置。這些頭header簡(jiǎn)單描述如下:
Via 包含了一個(gè)地址(pc33.atlanta.com),Alice希望對這個(gè)請求獲得響應的地址。它也包含了一個(gè)branch參數來(lái)確認這個(gè)事務(wù)處理。
To 包含了一個(gè)顯示名稱(chēng)(Bob)和一個(gè)SIP或者SIPS URL(sip:bob@biloxi.com) 。Display names在RFC 2822[3]有介紹。
From 也包含一個(gè)顯示名稱(chēng)(Alice)和一個(gè)SIP或SIPS URI (sip:alice@atlanta.com),它表示這個(gè)請求的發(fā)起方。這個(gè)header同時(shí)還有一個(gè)一個(gè)標簽tag參數,此標簽包含了一個(gè)任意字符串(1928301774),這個(gè)字符串被添加到了軟電話(huà)的URL。此標簽也是為了確認身份的目的。
Call-ID 包含一個(gè)對這個(gè)呼叫的全局唯一確認信息,它是由一個(gè)任意字符串和軟電話(huà)主機名稱(chēng)或IP地址組合而成。To tag的組合,From tag的組合,和Call-ID完整定義了一個(gè)Alice和BoB兩者之間的點(diǎn)對點(diǎn)的SIP關(guān)系,這種關(guān)系可以看作一個(gè)dialog對話(huà)。
CSeq 或Command Sequence包含一個(gè)整數和一個(gè)method名稱(chēng)。這個(gè)CSeq是一個(gè)增長(cháng)的數值,它是支持每一個(gè)在dialog里新的請求,并且是一個(gè)普通的序列號碼。
Contact 包含一個(gè)SIP或者SIPS URI,它用來(lái)表示一個(gè)直接的路由去聯(lián)系Alice,通常情況下,它由一個(gè)用戶(hù)名稱(chēng)以及它所在的全限定域名構成(FQDN)。 如果使用了全限定域名(FQDN)的話(huà),許多終端系統沒(méi)有已注冊的域名,因此,這里IP地址是允許的。Via頭告訴其他參數往哪里發(fā)送響應消息,Contact告訴其他參數往哪里發(fā)送將來(lái)的請求消息。
Max-Forwards 最大前轉來(lái)限定一個(gè)請求到達目的地的最大跳躍(hop)數量。它是由一個(gè)整數數值構成,在經(jīng)過(guò)一個(gè)跳轉時(shí)會(huì )降低一個(gè)數值。
Content-Type 包含一個(gè)信息體的描述,這里忽略。
Content-Length contains an octet (byte) count of the message body.
完整的SIP頭域集合在Section 20 中有詳細的定義。
會(huì )話(huà)的細節,例如媒體類(lèi)型,編碼,采樣率等沒(méi)有在SIP中進(jìn)行描述。 這些細節而是包含在了SIP消息體中,它們通過(guò)編碼以后以各種協(xié)議的格式出現。其中一種協(xié)議格式就是 會(huì )話(huà)描述協(xié)議-Session Description Protocol (SDP) (RFC 2327[1])。這個(gè)SDP消息(沒(méi)有在這里顯示)示例是通過(guò)SIP消息來(lái)傳輸,傳輸的方式類(lèi)似于電子郵件中的附件方式來(lái)傳輸,或類(lèi)似于通過(guò)HTTP消息傳輸網(wǎng)頁(yè)頁(yè)面內容的方式。
因為軟電話(huà)不知道Bob的地址或biloxi.com域名中的SIP服務(wù)器地址,軟電話(huà)發(fā)送一個(gè)INVITE 到SIP 服務(wù)器端,這個(gè)SIP服務(wù)器支持Alice的域,atlanta.com。 atlanta.com SIP 服務(wù)器已經(jīng)配置了Alice的軟電話(huà),或者通過(guò)DHCP發(fā)現了軟電話(huà)地址信息。
這個(gè)atlanta.com SIP 服務(wù)器是一個(gè)代理服務(wù)器。代理服務(wù)器接收請求,然后作為一個(gè)請求者轉發(fā)這些請求。在這個(gè)實(shí)例中,代理服務(wù)器接收到了INVITE請求,然后發(fā)送了一個(gè)100 (Trying) 響應給Alice的軟電話(huà)。這個(gè)100 (Trying) 響應表示這個(gè)INVITE已經(jīng)被收到,代理正在通過(guò)路由設置路由這個(gè)INVITE到其目的地。
在SIP中,響應消息使用一個(gè)三位數的碼和描述短語(yǔ)作為回復消息。這個(gè)響應消息在Via中包括同樣的To, From, Call-ID, CSeq 和 branch參數 parameter,這些參數和INVITE中的一樣,這些參數允許Alice的軟電話(huà)關(guān)聯(lián)響應消息來(lái)發(fā)送INVITE消息。這個(gè)atlanta.com代理服務(wù)器定位到這個(gè)代理服務(wù)器在biloxi.com,它可能執行一個(gè)特別的DNS查詢(xún)來(lái)找到服務(wù)biloxi.com 域的SIP 服務(wù)器。這個(gè)部分的描述在[4]中。 因此,它獲得biloxi.com 代理服務(wù)器的IP地址,然后轉發(fā)或者在這里代理其INVITE請求。在轉發(fā)這個(gè)請求之前,這個(gè) atlanta.com 代理服務(wù)器添加另外一個(gè)Via頭域,這個(gè)頭域包含自己的地址(這個(gè)INVITE已經(jīng)在第一個(gè)Via包含了Alice的地址)。biloxi.com 代理服務(wù)器收到這個(gè) INVITE消息后,然后回復一個(gè)帶100 (Trying) 響應消息到atlanta.com 代理服務(wù)器,表示它已經(jīng)收到了這個(gè)INVITE消息,正在處理這個(gè)請求。代理服務(wù)器會(huì )查詢(xún)一個(gè)定位服務(wù)器,我們稱(chēng)之為定位服務(wù),定位服務(wù)包含當前Bob的IP地址。(我們將會(huì )在下一個(gè)部分看到如何實(shí)現數據庫查詢(xún)。)biloxi.com 代理服務(wù)器會(huì )添加另外一個(gè)Via header ,并且攜帶自己的IP地址,這個(gè)地址是對這個(gè)INVITE請求的,代理轉發(fā)這個(gè)請求到Bob的SIP軟電話(huà)。
Bob的軟電話(huà)收到這個(gè)INVITE 消息后,對 Bob 發(fā)出提示,告訴他有從Alice來(lái)的電話(huà)呼叫,Bob決定是否應答這個(gè)呼叫,這里Bob的軟電話(huà)會(huì )產(chǎn)生振鈴提示。Bob的軟電話(huà)提示180振鈴,這個(gè)響應消息會(huì )路由根據相反的方向回到兩個(gè)代理服務(wù)器。每個(gè)代理使用Via header 域值來(lái)決定發(fā)送響應的地址方向,并且從頂部路由記錄中刪除自己的地址。因此,盡管要求DNS和定位服務(wù)查詢(xún) 路由這個(gè)初始的INVITE請求,180(Ringing)響應返回到呼叫方時(shí)可以沒(méi)有查詢(xún)消息或沒(méi)有代理服務(wù)器中所保持的狀態(tài)。
這樣也獲得了一個(gè)合理的響應屬性,每個(gè)看到INVITE消息的代理服務(wù)器也可以看到所有對INVITE的響應消息。
當Alice的軟電話(huà)收到這個(gè)180 (Ringing)響應后,它會(huì )傳遞這個(gè)信息給Alice,傳遞過(guò)來(lái)的信息方式可以使用一個(gè)回鈴音(ringback tone)或或者在A(yíng)lice終端屏幕顯示一個(gè)消息。
參考資料:
https://www.rfc-editor.org/rfc/pdfrfc/rfc3262.txt.pdf


關(guān)注微信公眾號:asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
Asterisk freepbx 中文官方論壇:http://bbs.freepbx.cn/forum.php
Asterisk freepbx技術(shù)文檔: www.freepbx.org.cn
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
Asterisk/FreePBX中國合作伙伴,官方qq技術(shù)分享群(3000千人):589995817