日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SIP 中的Dialog,call,session 和 transaction .

發(fā)布時(shí)間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SIP 中的Dialog,call,session 和 transaction . 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如果你對(duì)Sip協(xié)議中Call, Dialog, Transaction和Message之間的關(guān)系感覺(jué)到迷惑,那么,那么我可以告訴你,你并不孤單,因?yàn)榇蠖鄶?shù)初學(xué)者對(duì)于這些名詞之間的關(guān)系都會(huì)感到疑惑.
Messages(消息)?消息是在服務(wù)器和客戶(hù)端之間交換的獨(dú)立文本, 有兩種類(lèi)型的消息,分別是請(qǐng)求(Requests)和響應(yīng)(Responses).

Transaction(事務(wù))? 事務(wù)發(fā)生于客戶(hù)端和服務(wù)器端之間,包含從客戶(hù)端發(fā)出請(qǐng)求給服務(wù)器,到服務(wù)器響應(yīng)給客戶(hù)端的最終消息(non-1xx message)之間的所有消息. 如果請(qǐng)求是一個(gè)"Invite"消息,并且最終的響應(yīng)是一個(gè)non-2xx消息,那么該事務(wù)包含一個(gè)"Ack"響應(yīng)消息.如果服務(wù)器的響應(yīng)是一個(gè)2xx消息,那么,隨后的ACK是一個(gè)單獨(dú)的事務(wù).?
A sip transaction consists of a single request and any responses to that request, which includes zero or more provisional responses and one or more final responses.The branch parameter value in the VIA header is used to identify the transaction created by that request

Dialog(對(duì)話(huà))對(duì)話(huà)是兩個(gè)UAs(user agent) 之間持續(xù)一段時(shí)間的端到端(peer-to-peer)的SIP 關(guān)系. 一個(gè)對(duì)話(huà)由一個(gè)Call-ID, 一個(gè)local tag 和 一個(gè)remote tag來(lái)標(biāo)識(shí).對(duì)話(huà)過(guò)去也叫做 "call leg".dialog的建立是收到UAS的響應(yīng)(To tag)時(shí)開(kāi)始建立的。收到180響應(yīng)時(shí)建立dialog叫做早期對(duì)話(huà)(early dialog),收到2XX的應(yīng)答開(kāi)始才是真正的dialog建立。 A dialog represents a peer-to-peer SIP relationship between two user agents that persists for some time, as a call-leg.It is identified at each UA with a dialog ID, which consists of a Call-ID, From tag and To tag. We can call a dialog is established when three values are all generated
Session(會(huì)話(huà)) session 是媒體交換之后才建立的。具體而言就是通過(guò)offer/answer方式交換sdp的媒體。 session的建立可以使INVITE-200 也可以是200-ACK。這要看媒體的交換發(fā)生的時(shí)間。 具體來(lái)說(shuō),INVITE 中的消息體用sdp語(yǔ)言來(lái)描述自己可處理的媒體類(lèi)型,200OK中 帶回UAS端可處理的媒體類(lèi)型。這個(gè)時(shí)候媒體交換就算是完成了。也就是session建立起來(lái)了。?
In the SDP specification, a multimedia session is a set of multimedia senders and receivers and the data streams flowing from senders to receivers. ?A session is defined by the SDP user name, session id, network type, address type, and address elements in the origin field.
A session can have multiple RTP sessions corresponding to the UDP ports define in the line of the SDP.

Call(呼叫)?:一個(gè)呼叫是由一個(gè)會(huì)議中被同一個(gè)發(fā)起者邀請(qǐng)加入的所有成員組成的。一個(gè) SIP 呼叫用全局唯一呼叫標(biāo)識(shí)(CALL_ID)來(lái)識(shí)別。因此,如果一個(gè)用戶(hù)被不同的人邀請(qǐng)參加同一個(gè)多點(diǎn)會(huì)議,每個(gè)邀請(qǐng)都有一個(gè)唯一的呼叫。
注: Dialog和Session都翻譯成了會(huì)話(huà),但兩者顯然不同.
下面的示意圖清晰的顯示了它們之間的關(guān)系 (RINGING 是 1xx 響應(yīng),? OK是 2xx 響應(yīng))?

caller呼叫callee的號(hào)碼來(lái)建立一系列的對(duì)話(huà)(Dialogs),這些對(duì)話(huà)組成了一個(gè)呼叫(Call).

1.對(duì)話(huà)和事務(wù)處于信令層,而會(huì)話(huà)處于媒體傳輸層。SIP使用SDP來(lái)通知傳輸層(RTP)來(lái)創(chuàng)建、增加、移除和修改會(huì)話(huà)。
2.一般來(lái)說(shuō),在會(huì)議應(yīng)用中SIP可以通過(guò)請(qǐng)求來(lái)讓另一方加入已有會(huì)話(huà)中。在這種情況下,新的對(duì)話(huà)會(huì)被創(chuàng)建。
3.對(duì)話(huà)是end-point對(duì)end-point的關(guān)系,即真實(shí)的通信雙方,
??而transaction 是hop by hop的關(guān)系,即路由過(guò)程中交互的雙方。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

呼叫(call):?呼叫是一個(gè)非正式的術(shù)語(yǔ),用來(lái)表示一個(gè)多媒體會(huì)話(huà),用Call-ID來(lái)標(biāo)識(shí);不論兩方通話(huà)還是在多方通話(huà)中,在每個(gè)UA中是使用同一個(gè)Call-ID;


事務(wù)(transaction):?請(qǐng)求(UAC)+最終響應(yīng)(相鄰的UAS),SIP基于事務(wù)。所謂相鄰就是說(shuō)transaction存在于相鄰的SIP實(shí)體,而不是存在于兩個(gè)UA之間。CSeq標(biāo)識(shí)。一個(gè)事務(wù)中包含一個(gè)請(qǐng)求消息、0個(gè)或多個(gè)臨時(shí)響應(yīng)消息、1個(gè)或多個(gè)最終響應(yīng)消息(2xx~6xx)。SIP是事務(wù)性的協(xié)議。事務(wù)的區(qū)分通過(guò)Via字段棧頂?shù)腂ranch的值來(lái)確定,這是由于對(duì)于請(qǐng)求消息每經(jīng)過(guò)一個(gè)有事務(wù)狀態(tài)的Proxy的時(shí)候,該P(yáng)roxy需要為這個(gè)事務(wù)創(chuàng)建一個(gè)服務(wù)器端事務(wù)和一個(gè)客戶(hù)端事務(wù),并且將自己的URI添加到Via的棧頂,并生成一個(gè)Global ID做為Branch的值,以此值來(lái)表示一個(gè)與之相對(duì)應(yīng)的事務(wù)。SIP在事務(wù)層面定義了狀態(tài)機(jī)和定時(shí)器來(lái)實(shí)現(xiàn)重傳。

?

下圖是一個(gè)回復(fù)200 OK的成功的INVITE事務(wù):是不是INVITE事務(wù)區(qū)別在于?UAC需要為每個(gè)INVITE最終請(qǐng)求(2xx~6xx)生成ACK響應(yīng),而其他的請(qǐng)求消息(INFO,OPTION,etc)則不必如此。因?yàn)镮NVITE的地位比較重要, 所以需要這樣一個(gè)三次握手的機(jī)制來(lái)保證會(huì)話(huà)的雙方都能夠確保事務(wù)的完整性,這一點(diǎn)和TCP連接建立的三次握手比較像。

?

?

注意在上圖這兩個(gè)UA中,每一個(gè)代理服務(wù)器都將自己的地址加入返回的ACK的Via頭域中,而非成功的transaction則不會(huì)加入,見(jiàn)RFC 3261 (p.24)。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í)。一旦客戶(hù)端UAC的事務(wù)在Calling狀態(tài)收到任何中間響應(yīng)消息1xx,事務(wù)則自動(dòng)切換到Processing狀態(tài),停止請(qǐng)求消息的重發(fā)。并且需要將中間響應(yīng)消息傳送給TU事務(wù)用戶(hù)。在呼叫業(yè)務(wù)中,TU以及上層應(yīng)用可以根據(jù)中間響應(yīng)消息在用戶(hù)界面上提示用戶(hù)。一旦事務(wù)切換到Processing狀態(tài),任何其他中間響應(yīng)消息也都要傳送給TU。

?

而非INVITE事務(wù)則如下:

當(dāng)UAC發(fā)出非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ù)將被刪除。

?

對(duì)話(huà)(dialog/leg):?代表著兩個(gè)SIP UA之間持續(xù)一段時(shí)間的端到端的聯(lián)系(如:一段通話(huà))。也就說(shuō)僅僅存在于端到端的信令關(guān)系。當(dāng)一個(gè)UAS發(fā)出對(duì)于INVITE(或者REFER)的非失敗最終響應(yīng)<=>200OK(BYE),則Dialog建立,同時(shí)這也是session的開(kāi)始。UA和SIP代理服務(wù)器之間不會(huì)有對(duì)話(huà)。在SIP中呼叫中包含一個(gè)或多個(gè)Dialog(這僅僅存在于多方通話(huà)中)。Dialog終結(jié)于任意一端發(fā)出 BYE。Early Dialog可以通過(guò)UAC發(fā)出的CANCEL進(jìn)行終結(jié),更確切的說(shuō),所有早期對(duì)話(huà)在接收到非2XX最終響應(yīng)時(shí)就被終結(jié)了。 Call-ID-value、To、From進(jìn)行標(biāo)識(shí)。Forking時(shí)體現(xiàn)明顯。

在這個(gè)Forking的例子中,這個(gè)用戶(hù)注冊(cè)了三個(gè)設(shè)備,在用戶(hù)被呼叫時(shí),INVITE的Contact頭域就被轉(zhuǎn)換為三個(gè)INVITE發(fā)往三個(gè)設(shè)備。后邊的q指的是優(yōu)先級(jí),q越小,優(yōu)先級(jí)越高。其中的SIP注冊(cè)服務(wù)器相當(dāng)于一個(gè)Forking代理,盡管這個(gè)實(shí)體接收到兩個(gè)ACK,但是除了這些ACK外,它與主叫方的信令交互都是屬于一個(gè)transaction的,而與被叫方則分別建立了Transaction。另外,被叫方收到的兩個(gè)ACK由分別建立了Transaction。注意Device3返回了488這樣的非成功響應(yīng),SIP注冊(cè)服務(wù)器(Forking代理服務(wù)器)沒(méi)有將該響應(yīng)發(fā)回主叫方,這是SIP代理一個(gè)重要的特征,SIP代理還能自行發(fā)出Request:CANCEL消息。

?

?

?

UAS對(duì)話(huà)層接收到一個(gè)新的對(duì)話(huà)請(qǐng)求INVITE消息后,在建立會(huì)話(huà)的響應(yīng)消息2xx中,將請(qǐng)求消息里面的所有Route-Record字段拷貝到2xx消息中,并且UAS的對(duì)話(huà)層必須添加一個(gè)Contact字段使得對(duì)話(huà)中后續(xù)的響應(yīng)(INVITE在2xx響應(yīng)的情況下也包括ACK消息)、請(qǐng)求消息可以直接和本UA聯(lián)系。當(dāng)UAC收到UAS的INVITE的2xx響應(yīng)消息后,如果2xx中不包含任何Route-Record字段的,則UAC可以選擇直接發(fā)送ACK到Contact中地址&端口。

?


會(huì)話(huà)(session):?多方用戶(hù)的媒體關(guān)系,在對(duì)話(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(此處存疑,國(guó)外有資料將其視為一個(gè)新的transaction,但是RFC3261中的意思卻是ACK不屬于INVITE Transaction,也不創(chuàng)建新的Transaction,但會(huì)重新計(jì)算Transaction參數(shù)--branchID)。早期對(duì)話(huà)是UAS以一個(gè)1XX響應(yīng)作為回應(yīng)時(shí)建立的。這樣做的好處是在UAC可能在早期對(duì)話(huà)中發(fā)出諸如UPDATE這樣的SIP請(qǐng)求。

總結(jié)

以上是生活随笔為你收集整理的SIP 中的Dialog,call,session 和 transaction .的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。