若是你對Sip協議中Call, Dialog, Transaction和Message之間的關係感受到迷惑,那麼,那麼我能夠告訴你,你並不孤單,由於大多數初學者對於這些名詞之間的關係都會感到疑惑.服務器
呼叫(call): 呼叫是一個非正式的術語,用來表示一個多媒體會話,用Call-ID來標識;不論兩方通話仍是在多方通話中,在每一個UA中是使用同一個Call-ID;網絡
事務(transaction): 請求(UAC)+最終響應(相鄰的UAS),SIP基於事務。所謂相鄰就是說transaction存在於相鄰的SIP實體,而不是存在於兩個UA之間。CSeq標識。一個事務中包含一個請求消息、0個或多個臨時響應消息、1個或多個最終響應消息(2xx~6xx)。SIP是事務性的協議。事務的區分經過Via字段棧頂的Branch的值來肯定,這是因爲對於請求消息每通過一個有事務狀態的Proxy的時候,該Proxy須要爲這個事務建立一個服務器端事務和一個客戶端事務,而且將本身的URI添加到Via的棧頂,並生成一個Global ID作爲Branch的值,以此值來表示一個與之相對應的事務。SIP在事務層面定義了狀態機和定時器來實現重傳。session
下圖是一個回覆200 OK的成功的INVITE事務:是否是INVITE事務區別在於 UAC須要爲每一個INVITE最終請求(2xx~6xx)生成ACK響應,而其餘的請求消息(INFO,OPTION,etc)則沒必要如此。由於INVITE的地位比較重要, 因此須要這樣一個三次握手的機制來保證會話的雙方都可以確保事務的完整性,這一點和TCP鏈接創建的三次握手比較像。ide
注意在上圖這兩個UA中,每個代理服務器都將本身的地址加入返回的ACK的Via頭域中,而非成功的transaction則不會加入,見RFC 3261 (p.24)。CSeq頭域的值必須與INVITE相同,而且CSeq的方法必須是ACK。中間響應消息 1xx 的使用則是爲了節省網絡開銷設計的,一旦 UC 收到任何一箇中間響應消息,則 UC 必須中止消息重發定時器,再也不從發這個請求消息,反之則直到收到最終響應消息或重發定時器超時。一旦客戶端UAC的事務在Calling狀態收到任何中間響應消息1xx,事務則自動切換到Processing狀態,中止請求消息的重發。而且須要將中間響應消息傳送給TU事務用戶。在呼叫業務中,TU以及上層應用能夠根據中間響應消息在用戶界面上提示用戶。一旦事務切換到Processing狀態,任何其餘中間響應消息也都要傳送給TU。.net
而非INVITE事務則以下:翻譯
當UAC發出非INVITE請求時,它就會在事務管理子層上開啓定時器F(TCP)或者是E(UDP),確保超時的時候進行重傳。這適用於除了 ACK請求外的其餘非INVITE請求。每次超時重傳時E的時間都被翻倍,直到最大的4秒。而F超時時,UAC就會認爲是Timeout,這個事務將被刪除。設計
對話(dialog/leg): 表明着兩個SIP UA之間持續一段時間的端到端的聯繫(如:一段通話)。也就說僅僅存在於端到端的信令關係。當一個UAS發出對於INVITE(或者REFER)的非失敗最終響應<=>200OK(BYE),則Dialog創建,同時這也是session的開始。UA和SIP代理服務器之間不會有對話。在SIP中呼叫中包含一個或多個Dialog(這僅僅存在於多方通話中)。Dialog終結於任意一端發出 BYE。Early Dialog能夠經過UAC發出的CANCEL進行終結,更確切的說,全部早期對話在接收到非2XX最終響應時就被終結了。 Call-ID-value、To、From進行標識。Forking時體現明顯。代理
在這個Forking的例子中,這個用戶註冊了三個設備,在用戶被呼叫時,INVITE的Contact頭域就被轉換爲三個INVITE發往三個設備。後邊的q指的是優先級,q越小,優先級越高。其中的SIP註冊服務器至關於一個Forking代理,儘管這個實體接收到兩個ACK,可是除了這些ACK外,它與主叫方的信令交互都是屬於一個transaction的,而與被叫方則分別創建了Transaction。另外,被叫方收到的兩個ACK由分別創建了Transaction。注意Device3返回了488這樣的非成功響應,SIP註冊服務器(Forking代理服務器)沒有將該響應發回主叫方,這是SIP代理一個重要的特徵,SIP代理還能自行發出Request:CANCEL消息。blog
UAS對話層接收到一個新的對話請求INVITE消息後,在創建會話的響應消息2xx中,將請求消息裏面的全部Route-Record字段拷貝到2xx消息中,而且UAS的對話層必須添加一個Contact字段使得對話中後續的響應(INVITE在2xx響應的狀況下也包括ACK消息)、請求消息能夠直接和本UA聯繫。當UAC收到UAS的INVITE的2xx響應消息後,若是2xx中不包含任何Route-Record字段的,則UAC能夠選擇直接發送ACK到Contact中地址&端口。three
會話(session): 多方用戶的媒體關係,在對話的控制下創建。
下圖是Early dialog、Session、Dialog、Transaction等的在一個UA-UA的呼叫中的體現:
在這個例子中,經過INVITE事務而成功創建起來的dialog必須有一個ACK進行迴應,這是第二個transaction的開始,儘管ACK並無回覆,可是因爲新的 branch-value被填入,因此這個ACK表明了一個新的Transaction的開始。注意,此時 transaction number (CSeq) 並無根據INVITE而增長--也就是說若收到的最終響應不是2XX(是3XX--6XX),則該transaction中包含ACK,若最終響應是2XX,則ACK屬於一個新的transaction(此處存疑,國外有資料將其視爲一個新的transaction,可是RFC3261中的意思倒是ACK不屬於INVITE Transaction,也不建立新的Transaction,但會從新計算Transaction參數--branchID)。早期對話是UAS以一個1XX響應做爲迴應時創建的。這樣作的好處是在UAC可能在早期對話中發出諸如UPDATE這樣的SIP請求。