一藏否、基本概念
1、Messages(消息)
消息是在服務(wù)器和客戶端之間交換的獨(dú)立文本, 有兩種類(lèi)型的消息,分別是請(qǐng)求(Requests)和響應(yīng)(Responses)充包。
兩種類(lèi)型的消息都由一個(gè)起始行副签、一個(gè)或多個(gè)頭字段、一個(gè)標(biāo)識(shí)頭字段結(jié)束的空行基矮、一個(gè)可選的消息體組成淆储。
2、Transaction(事務(wù))
事務(wù)發(fā)生于客戶端和服務(wù)器端之間,包含從客戶端發(fā)出請(qǐng)求給服務(wù)器,到服務(wù)器響應(yīng)給客戶端的最終消息(non-1xx message)之間的所有消息(也就是說(shuō)家浇,事務(wù)是一次完整的請(qǐng)求)本砰。如果請(qǐng)求是一個(gè)"Invite"消息,并且最終的響應(yīng)是一個(gè)non-2xx消息,那么該事務(wù)包含一個(gè)"Ack"響應(yīng)消息.如果服務(wù)器的響應(yīng)是一個(gè)2xx消息,那么,隨后的ACK是一個(gè)單獨(dú)的事務(wù).
Branch是一個(gè)事務(wù)ID(Transaction ID),用于區(qū)分同一個(gè)Client所發(fā)起的不同Transaction钢悲。
對(duì)于遵循RFC3261規(guī)范的實(shí)現(xiàn)点额,這個(gè)branch參數(shù)的值必須用magic cookie”z9hG4bK”打頭。其它部分是對(duì)“To, From, Call-ID頭域和Request-URI”按一定的算法加密后得到莺琳。
這7個(gè)字母是一個(gè)亂數(shù)cookie(定義成為7位的是為了保證舊s版本的RFC2543實(shí)現(xiàn)不會(huì)產(chǎn)生這樣的值)还棱,這樣服務(wù)器收到請(qǐng)求之后,可以很方便的知道這個(gè)branch ID是否由本規(guī)范所產(chǎn)生的(就是說(shuō)惭等,全局唯一的)珍手。
事務(wù)分類(lèi)
事務(wù)根據(jù)類(lèi)型還分Invite和Non-Invite型,即邀請(qǐng)和非邀請(qǐng)類(lèi)型辞做。Non-Invite類(lèi)型事務(wù)主要處理的是除Invite和ACK類(lèi)型外的所有Sip信息琳要。而非Invite里的ACK信息要處理的話就不屬于事務(wù)處理的范圍了,一般由程序自己把信息發(fā)送給傳輸層直接發(fā)送秤茅。Invite需要三次握手稚补,所以需要的時(shí)間比較長(zhǎng);而Non-Ivite類(lèi)型只需兩次握手框喳,要求回應(yīng)時(shí)間短课幕。
INVITE事務(wù)三次握手:
注意在上圖這兩個(gè)UA中,每一個(gè)代理服務(wù)器都將自己的地址加入返回的ACK的Via頭域中帖努,而非成功的transaction則不會(huì)加入撰豺。CSeq頭域的值必須與INVITE相同,并且CSeq的方法必須是ACK拼余。
中間響應(yīng)消息1xx的使用則是為了節(jié)省網(wǎng)絡(luò)開(kāi)銷(xiāo)設(shè)計(jì)的,一旦 UC 收到任何一個(gè)中間響應(yīng)消息亩歹,則UC必須停止消息重發(fā)定時(shí)器匙监,不再?gòu)陌l(fā)這個(gè)請(qǐng)求消息凡橱,反之則直到收到最終響應(yīng)消息或重發(fā)定時(shí)器超時(shí)。一旦客戶端UAC的事務(wù)在Calling狀態(tài)收到任何中間響應(yīng)消息1xx亭姥,事務(wù)則自動(dòng)切換到Processing狀態(tài)稼钩,停止請(qǐng)求消息的重發(fā)。并且需要將中間響應(yīng)消息傳送給TU事務(wù)用戶达罗。在呼叫業(yè)務(wù)中坝撑,TU以及上層應(yīng)用可以根據(jù)中間響應(yīng)消息在用戶界面上提示用戶。一旦事務(wù)切換到Processing狀態(tài)粮揉,任何其他中間響應(yīng)消息也都要傳送給TU巡李。
注意,從INVITE到200OK都是一個(gè)事務(wù)(branck值相同)扶认,而最后的確認(rèn)消息ACK卻是一個(gè)的單獨(dú)的事務(wù)侨拦。后面的BYE到200OK又屬于另一個(gè)新的事務(wù)。
INVITE響應(yīng):
ACK響應(yīng):
這里抓包和上面提到的一致辐宾。
非INVITE二次握手:
當(dāng)UAC發(fā)出non-INVITE請(qǐng)求時(shí)狱从,它就會(huì)在事務(wù)管理子層上開(kāi)啟定時(shí)器F(TCP)或者是E(UDP),確保超時(shí)的時(shí)候進(jìn)行重傳叠纹。這適用于除了 ACK請(qǐng)求外的其他非INVITE請(qǐng)求季研。每次超時(shí)重傳時(shí)E的時(shí)間都被翻倍,直到最大的4秒誉察。而F超時(shí)時(shí)训貌,UAC就會(huì)認(rèn)為是Timeout,這個(gè)事務(wù)將被刪除冒窍。
3递沪、Dialog(對(duì)話)
會(huì)話是兩個(gè)UAs(user agent) 之間持續(xù)一段時(shí)間的端到端(peer-to-peer)的SIP 關(guān)系.?一個(gè)會(huì)話由一個(gè)Call-ID, 一個(gè)local tag 和 一個(gè)remote tag來(lái)標(biāo)識(shí).會(huì)話過(guò)去也叫做 "call leg"。一個(gè)對(duì)話由SIP消息建立综液,就像用2xx響應(yīng)INVITE請(qǐng)求款慨。
dialog的建立是客戶端收到UAS的響應(yīng)(To tag)時(shí)開(kāi)始建立的。**收到180響應(yīng)時(shí)建立dialog叫做早期對(duì)話(early dialog),收到2XX的應(yīng)答開(kāi)始才是真正的dialog建立谬莹。
4檩奠、Session(會(huì)話)
用于進(jìn)行媒體流傳送。當(dāng)一方發(fā)出請(qǐng)求附帽,而另外一方或多方接受請(qǐng)求并通過(guò)信令交互成功后才能建立會(huì)話埠戳。具體而言就是通過(guò)offer/answer方式交換sdp的媒體。
具體來(lái)說(shuō)蕉扮,INVITE中的消息體用sdp語(yǔ)言來(lái)描述自己可處理的媒體類(lèi)型整胃,200OK中帶回UAS端可處理的媒體類(lèi)型。這個(gè)時(shí)候媒體交換就算是完成了喳钟。也就是session建立起來(lái)了屁使。
一次呼叫只能建立一次會(huì)話在岂,但可以建立多個(gè)對(duì)話(Dialog),因?yàn)榻邮苷?qǐng)求的可能不止一個(gè)蛮寂。
5蔽午、Call(呼叫)
一個(gè)呼叫是由一個(gè)會(huì)議中被同一個(gè)發(fā)起者邀請(qǐng)加入的所有成員組成的。一個(gè) SIP 呼叫用全局唯一呼叫標(biāo)識(shí)(CALL_ID)來(lái)識(shí)別酬蹋。因此及老,如果一個(gè)用戶被不同的人邀請(qǐng)參加同一個(gè)多點(diǎn)會(huì)議,每個(gè)邀請(qǐng)都有一個(gè)唯一的呼叫范抓。
SIP幾個(gè)重要的參數(shù)
- 如下三個(gè)值相同代表同一個(gè)dailog(會(huì)話)
Call-id
Form tag
To tag
2)branch值相同骄恶,代表同一個(gè) transaction(事務(wù))
3) cseq
Cseq,其生存域是一個(gè)會(huì)話尉咕。用于將一個(gè)會(huì)話中的請(qǐng)求消息序列化叠蝇,以便用于重復(fù)消息、“遲到”消息的檢測(cè)年缎,響應(yīng)消息與相應(yīng)請(qǐng)求消息的匹配等悔捶。包含兩部分:一個(gè)32位的序列號(hào),一個(gè)請(qǐng)求方法单芜。
通常在會(huì)話開(kāi)始時(shí)確定一個(gè)初始值蜕该,其后再發(fā)送消息時(shí)將該值加1。主叫方與被叫叫各自維護(hù)自己的CSeq序列洲鸠,互不干擾堂淡,這有點(diǎn)像TCP/IP中IP包的序列號(hào)。
一個(gè)響應(yīng)消息有與其對(duì)應(yīng)的請(qǐng)求消息相同的CSeq值扒腕。
【注意】SIP中CANCEL消息與ACK消息總是比較特殊绢淀。CANCEL消息的CSeq中的序列號(hào)總是跟其要cancel的消息的相同,而對(duì)于ACK消息:如果它所要確認(rèn)的是INVITE請(qǐng)求的non-2xx響應(yīng)瘾腰,則ACK消息的CSeq中的序列號(hào)與對(duì)應(yīng)INVITE請(qǐng)求的相同皆的;如果是2xx響應(yīng),則不同蹋盆,此時(shí)ACK被當(dāng)作一個(gè)新的事務(wù)费薄。
Dialog,call栖雾,session 和 transaction關(guān)系圖
Transaction:維護(hù)hop to hop狀態(tài)楞抡,包括一個(gè)請(qǐng)求和其觸發(fā)的所有響應(yīng),包括若干暫時(shí)響應(yīng)和一個(gè)最終響應(yīng)析藕。生命周期從請(qǐng)求產(chǎn)生到收到最終響應(yīng)召廷。
Dialog:維護(hù)peer to peer狀態(tài),目前只有invite和subscribe請(qǐng)求會(huì)觸發(fā)dialog。其生命周期貫穿一個(gè)端到端會(huì)話的始終柱恤。
Early dialog数初、Session找爱、Dialog梗顺、Transaction等的在一個(gè)UA-UA的呼叫中的體現(xiàn):
在這個(gè)例子中,通過(guò)INVITE事務(wù)而成功建立起來(lái)的dialog必須有一個(gè)ACK進(jìn)行回應(yīng)车摄,這是第二個(gè)transaction的開(kāi)始寺谤,盡管ACK并沒(méi)有回復(fù),但是由于新的 branch-value被填入吮播,所以這個(gè)ACK代表了一個(gè)新的Transaction的開(kāi)始变屁。注意,此時(shí) transaction number (CSeq) 并沒(méi)有根據(jù)INVITE而增加--也就是說(shuō)若收到的最終響應(yīng)不是2XX(是3XX--6XX)意狠,則該transaction中包含ACK粟关,若最終響應(yīng)是2XX,則ACK屬于一個(gè)新的transaction环戈。
參考資料
SIP協(xié)議入門(mén):初學(xué)者必須明白的幾個(gè)重要概念(原創(chuàng))
SIP 中的Dialog闷板,call,session 和 transaction