語音業(yè)務(wù)VOIP開發(fā)之SIP協(xié)議篇(三) —— SIP報文解析

下面深入了解SIP報文:

?????SIP是基于一個類似HTTP協(xié)議的請求應(yīng)答的通訊模式。每一個通訊都包含對某個功能的請求倦沧,并且起碼需要一個應(yīng)答唇撬。在這個應(yīng)答中,Alice的軟電話發(fā)送一個含有Bbo的SIP URI抵制的INVITE通訊請求展融。INVITE是一個SIP請求的例子窖认,表示請求方(Alice)希望服務(wù)方(Bob)應(yīng)答。INVTE請求包含一系列的包頭域(Header fields)告希。包頭中包含很多屬性并且包含了傳輸消息的附加信息扑浸。在INVITE中有如下的字段:呼叫的唯一標(biāo)志,目的抵制燕偶,Alice的地址喝噪,Alice和Bob建立會話的類型。INVITE請求(圖1中的F1)可能看起來像這樣的:

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’s SDP not shown)

在文本消息的第一行指么,包含了請求的類型(INVITE)酝惧。在這行之后的是這個請求的頭域。這個例子中包含了最少需要的頭域集合伯诬。簡單介紹一下:

VIA域

??????包含了Alice接收發(fā)送請求的服務(wù)器地址(pc33.atlanta.com)晚唇。同樣這個包含了一個分支參數(shù)來標(biāo)志Alice和這個服務(wù)器的會話事務(wù)。

TO域

??????包含了顯示姓名(Bob)和一個SIP或者SIPS URI(sip:bob@biloxi.com)請求將首先傳輸?shù)竭@個URI中盗似。顯示姓名(Display names)在RFC 2822中描述哩陕。

From域

??????也同樣包含一個顯示姓名(Alice)和一個SIP或者SIPS URI(sip:alice@atlanta.com)這個URI用來標(biāo)志請求的原始發(fā)起者。這個域也包含了一個TAG參數(shù)赫舒,這個TAG參數(shù)是一個隨機(jī)字串(1928301774)悍及,是軟電話(softphone)在URI上增加的一個隨機(jī)串。用來做標(biāo)志用途的

Call_ID

??????包含一個全局的唯一標(biāo)志号阿,用來唯一標(biāo)志這個呼叫并鸵,通過隨機(jī)字串和softphone的自己名字或者IP抵制混和產(chǎn)生的。通過TO TAG, FROM TAG和CALL-ID完整定義了Alice和Bob之間的端到端的SIP關(guān)系扔涧,并且表示這個是一個對話性質(zhì)的關(guān)系。

CSEQ或者Command Sequence

??????包含了一個整數(shù)和一個請求名字届谈。這個Cseq數(shù)字是順序遞增的枯夜。每當(dāng)對話中發(fā)起一個新的請求都會引起這個數(shù)字的順序遞增。

Contact域

??????包含一個SIP或者SIPS URI用來表示訪問Alice的直接方式艰山,通常由用戶名和一個主機(jī)的全名(Fully Qualified Domain Name FQDN)組成湖雹。當(dāng)FQDN作為首選的時候,許多終端用戶由于不會由名字登記(而導(dǎo)致不能訪問Alice的主機(jī))曙搬,所以IP地址是可選的摔吏。

?????VIA域告訴大家本請求發(fā)送到哪里并且應(yīng)答到哪里鸽嫂,Contract域告訴大家將來的請求將發(fā)送到哪里(奇怪…不是Alice發(fā)起的么,將來的請求應(yīng)該是Bob才對罢鹘病)据某。

Max-Forwards:

?????最大轉(zhuǎn)發(fā)數(shù)量限制了通訊中轉(zhuǎn)發(fā)的數(shù)量。它是由一個整數(shù)組成诗箍,每轉(zhuǎn)發(fā)一次癣籽,整數(shù)減一。

Content-type

?????包含了消息正文的描述(消息正文在本范例中沒有列出)

Content-length

?????包含消息正文的長度(字節(jié)數(shù))

?????完整的SIP包頭域的定義在20節(jié)滤祖。會話的細(xì)節(jié)筷狼,比如媒體的類型,codec匠童,或者采樣速率埂材,沒有通過SIP來描述。這個可以通過SIP的消息正文來描述汤求,可以通過其他定義的協(xié)議在正文中進(jìn)行描述俏险。有一種是會話描述協(xié)議(Session Descripotion Protocol SDP)(RFC2327[1])。這個SDP消息(沒有在例子中列出)通過SIP的消息中傳送首昔,就像通過附件發(fā)送EMAIL一樣寡喝,或者說通過HTTP傳輸?shù)木W(wǎng)頁一樣。

??????由于softphone并不知道bob或者bob的sip服務(wù)器biloxi.com在哪里勒奇,所以softphone發(fā)送INVITE請求到Alice的sip服務(wù)器,atlanta.com预鬓。這個atlanta.com SIP服務(wù)器應(yīng)該已經(jīng)在Alice的softphone中配置了,或者可以通過DHCP獲得赊颠。atlanta.com SIP服務(wù)器是一臺代理服務(wù)器格二。代理服務(wù)器接收SIP請求并且根據(jù)請求轉(zhuǎn)發(fā)。在這個例子中竣蹦,代理服務(wù)器接收到INVITE請求顶猜,并且回送一個100(Trying)應(yīng)答給Alice的softphone。100(Trying)應(yīng)答表示INVITE請求已經(jīng)收到痘括,并且代理服務(wù)器正在轉(zhuǎn)發(fā)INVITE請求长窄。SIP的應(yīng)答是通過一個三位數(shù)的數(shù)字表示的。SIP應(yīng)答同樣包含TO纲菌、FROM挠日、Call-ID,CSEQ和在VIA中的分支參數(shù)翰舌,這個參數(shù)使得Alice的softphone可以把請求和應(yīng)答關(guān)聯(lián)起來嚣潜。atlanta.com代理服務(wù)器收到INVITE請求之后,就去找biloxi.com可能通過DNS服務(wù)來找提供這個biloxi.com的SIP服務(wù)器椅贱。這在[4]中有描述懂算。最后只冻,轉(zhuǎn)發(fā)INVITE請求到biloxi.com或者能到達(dá)biloxi.com的代理服務(wù)器。在轉(zhuǎn)發(fā)請求之前计技,atlanta.com代理服務(wù)器會在via頭上增加一個一段包含自己抵制的值(INVITE已經(jīng)包含了Alice的的地址VIA域)喜德。biloxi.com代理服務(wù)器收到這個INVITE請求并且返回一個100(Trying)應(yīng)答給atlanta.com代理服務(wù)器標(biāo)志這它已經(jīng)收到這個請求并且正在處理這個請求。這個代理服務(wù)器通過查詢數(shù)據(jù)庫酸役,通常叫做地址服務(wù)住诸,這個服務(wù)中包含了bob的當(dāng)前ip地址。(我們在下一節(jié)可以看到這個數(shù)據(jù)庫是怎么回事)biloxi.com代理服務(wù)增加另一段包含自己地址的VIA頭域并且發(fā)送它到bob的sip 電話涣澡。

?????Bob的SIP電話接收到INVITE請求并且提醒bob有一個從Alice的呼入贱呐,這樣bob可以決定是否響應(yīng)這個呼入。這個意思就是:bob的電話響了入桂。bob的sip電話發(fā)送一個180(Ringing)回應(yīng)奄薇,這個回應(yīng)將通過兩個代理服務(wù)器原路返回給Alice。每一個代理服務(wù)器通過via頭域決定該把這個應(yīng)答發(fā)送給哪里抗愁,并且在發(fā)送之前把自己的地址從頭上拿走馁蒂。雖然DNS和定位服務(wù)在路由最初的INVITE請求,180(ringing)響應(yīng)可以簡單返回給發(fā)起者而不需要查找發(fā)起者在哪里蜘腌,并且不需要在代理服務(wù)器保留狀態(tài)沫屡,同時,每一個轉(zhuǎn)發(fā)INVITE的代理也可以得到INVITE的每一個應(yīng)答撮珠,這樣的特性也非常有用沮脖。

?????當(dāng)Alice的softphone收到180(Ringing)應(yīng)答的時候,它提示Alice,可能是通過一個回鈴音芯急,或者屏幕上的一個消息提示勺届。

???在這個例子中,Bob決定響應(yīng)這個呼叫娶耍。當(dāng)他拿起電話免姿,他的SIP電話發(fā)送200(OK)回應(yīng)給發(fā)送者,表示這個電話已經(jīng)接起來了榕酒。這個200(OK)包含了一個消息體胚膊,這個消息體包含SDP媒體描述,這個媒體描述包含Bob希望和Alice建立何種媒體連接想鹰。同樣澜掩,SDP消息也是兩段交換:Alice發(fā)送一個給Bob,Bob發(fā)送一個回給Alice杖挣。這個兩段的交換提供基本的兼容性協(xié)商,并且基于簡單的SDP提出/應(yīng)答交換模型刚陡。如果Bob不想響應(yīng)這個呼叫或者正在響應(yīng)別的呼叫惩妇,一個錯誤的響應(yīng)會代替正常的200(OK)回送出去株汉,這樣,就不會有連接建立歌殃。SIP完整的返回代碼在21節(jié)有介紹乔妈。Bob發(fā)出的200(OK)(圖一的F9消息)可能長得像這樣的:

SIP/2.0 200 OK

Via: SIP/2.0/UDP server10.biloxi.com

;branch=z9hG4bKnashds8;received=192.0.2.3

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com

;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com

;branch=z9hG4bK776asdhds ;received=192.0.2.1

To: Bob ;tag=a6c85cf

From: Alice ;tag=1928301774

Call-ID: a84b4c76e66710@pc33.atlanta.com

CSeq: 314159 INVITE

Contact:

Content-Type: application/sdp

Content-Length: 131

(Bob’s SDP not shown)

?????應(yīng)答的第一行包含了應(yīng)答代碼(200)和原因(ok)。剩下的行包含了包頭域氓皱。VIA,TO,FROM,CALL-ID,Cseq包頭域是從INVITE請求包中直接拷貝過來的路召。(有三個VIA域值-一個是Alice SIP電話增加的,一個是atlanta.com代理加的波材,一個是biloxi.com代理加的)股淡。Bob的SIP電話增加了一個TAG參數(shù)。這個TAG參數(shù)會被參與對話的各方所使用廷区,并且在以后的對話中被使用唯灵。Contract域包含了一個能直接聯(lián)系到Bob的URI。Content-type和Content_Length域包含了消息體(沒有在例子中體現(xiàn))隙轻,這個消息體里邊是Bob的SDP媒體信息埠帕。

??????除了DNS和位置服務(wù)之外,代理服務(wù)器可以自主決定路由玖绿,也就是說自己決定應(yīng)該向哪里轉(zhuǎn)發(fā)請求敛瓷。比如,如果Bob的SIP電話返回一個486(電話正忙)信號斑匪,biloxi.com這個代理服務(wù)器可以轉(zhuǎn)發(fā)這個INVITE請求到Bob的語音郵箱服務(wù)器呐籽。一個代理服務(wù)器可以同時向N個地方發(fā)送INVITE請求。這種并發(fā)尋找就是傳說中的分流(forking)秤标。

??????在這個例子中绝淡,200(OK)應(yīng)答通過兩個代理并且發(fā)送到Alice的softphone上,Alice的softphone收到這個應(yīng)答苍姜,停止振鈴牢酵,并且標(biāo)志電話Bob已經(jīng)接聽。最后衙猪,Alice的電話發(fā)送一個確認(rèn)消息馍乙,ACK,到Bob的SIP電話來確認(rèn)接收到了這個最后的200(o’k)應(yīng)答垫释。在這個例子中丝格,ACK信號是直接由Alice的softphone發(fā)送到Bob的SIP phone上,跨過了兩個代理服務(wù)器棵譬。這是因為兩個端點(Alice和Bob)通過INVITE/200(OK)的請求應(yīng)答包中的Contact包頭域都知道互相之間的地址了显蝌,這個地址是最開始發(fā)起INVITE請求的時候所不知道的。所以订咸,不需要兩個代理服務(wù)器再查找對方的地址了曼尊,所以代理服務(wù)器不參與接下來的通話流了酬诀。這就完成了一個完整的使用INVITE/200/ACK 三方握手來建立SIP會話的過程。

??????現(xiàn)在骆撇,Alice和Bob的媒體會話開始了瞒御,他們通過發(fā)送剛才建立會話所交換的SDP包中約定的互相明白的媒體包來進(jìn)行會話。一般情況下神郊,端到端的媒體包和SIP信號控制包通過不同的通訊路徑來發(fā)送肴裙。

??????在會話中,Alice或者Bob都可以改變他們自己的媒體會話屬性涌乳。這個可以通過發(fā)送一個包含新媒體屬性描述的re-INVITE請求來完成蜻懦。這個re-INVITE是捆綁在一個現(xiàn)有的會話的,這樣參與會話的對方可以明白這是要改變現(xiàn)有的會話屬性而不是新建立一個會話爷怀。對方收到這個re-INVITE請求后阻肩,會發(fā)送一個200(OK)應(yīng)答表示接受這個改變。請求方通過一個ACK來表示接受了對方的這個200(OK)應(yīng)答运授。如果對方不同意這個媒體屬性變化烤惊,他會發(fā)送一個錯誤的應(yīng)答比如488(暫時不能進(jìn)行),這個也會收到發(fā)起者的一個ACK響應(yīng)吁朦。不管怎樣柒室,就是是re-INVITE的失敗也不會影響到現(xiàn)有的會話-原有的會話還可以用上次的媒體會話屬性繼續(xù)。

???????在通話結(jié)束的時候逗宜,Bob首先斷開(掛機(jī)hangs up)雄右,并且發(fā)送一個BYE的消息。這個BYE的消息將直接送到Alice的softphone纺讲,同樣是跳過代理的擂仍。Alice通過發(fā)送200(OK)應(yīng)答來確認(rèn)收到了這個BYE消息,這個消息終止了會話并且應(yīng)答了BYE的請求熬甚。ACK在這里不需要發(fā)送-一個ACK信號只在響應(yīng)一個INVITE的響應(yīng)的時候被發(fā)送逢渔。我們稍晚一點會討論這個INVITE的特別處理,但是基于SIP的可靠性的機(jī)制乡括,一個通話的時間可以認(rèn)為包含電話振鈴和掛機(jī)的時間(but relate to the reliability mechanisms in SIP, the length of time it can take for a ringing phone to be answered, and forking.)基于這樣的原因肃廓,SIP請求的處理通常根據(jù)是否INVITE請求進(jìn)行分類,INVITE類和非INVITE類請求分開處理诲泌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盲赊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敷扫,更是在濱河造成了極大的恐慌哀蘑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異递礼,居然都是意外死亡惨险,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門脊髓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栅受,你說我怎么就攤上這事将硝。” “怎么了屏镊?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵依疼,是天一觀的道長。 經(jīng)常有香客問我而芥,道長律罢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任棍丐,我火速辦了婚禮误辑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歌逢。我一直安慰自己巾钉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布秘案。 她就那樣靜靜地躺著砰苍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阱高。 梳的紋絲不亂的頭發(fā)上赚导,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音赤惊,去河邊找鬼吼旧。 笑死,一個胖子當(dāng)著我的面吹牛荐捻,可吹牛的內(nèi)容都是我干的黍少。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼处面,長吁一口氣:“原來是場噩夢啊……” “哼厂置!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魂角,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昵济,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體访忿,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瞧栗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了海铆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迹恐。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖卧斟,靈堂內(nèi)的尸體忽然破棺而出殴边,到底是詐尸還是另有隱情,我是刑警寧澤珍语,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布锤岸,位于F島的核電站,受9級特大地震影響板乙,放射性物質(zhì)發(fā)生泄漏是偷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一募逞、第九天 我趴在偏房一處隱蔽的房頂上張望蛋铆。 院中可真熱鬧,春花似錦凡辱、人聲如沸戒职。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洪燥。三九已至,卻和暖如春乳乌,著一層夾襖步出監(jiān)牢的瞬間捧韵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工汉操, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留再来,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓磷瘤,卻偏偏與公主長得像芒篷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子采缚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容