下面深入了解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類請求分開處理诲泌。