理解會話


一 會話的初始化
  Session用於進行媒體流傳送。當一方發出請求,而另外一方或多方接受請求並通過信令交互成功後才能建立會話。
  一次呼叫只能建立一次會話,但可以建立多個對話(Dialog),因爲接受請求的可能不止一個。

1 UAC的處理
1.1 創建初始IVITE請求
初始的IVITE可以帶有消息體。SIP使用提供/回答模型來進行會話協商,即提供者發送一些提議的媒體信息,而另一方可以迴應選擇的媒體信息(不一定在發送來的媒體中選擇)。而提供/回答的交互是在對話中進行的,所以初始請求可能造成多個獨立的對話。
而提供/回答模型有多個限制,如在這個規範下,提供和回答媒體信息只能存在於INVITE和迴應及ACK中。
作爲初始的請求,還有以下限制:(該限制在以後的擴展中已經被修改,詳見draft-ietf-sipping-sip-offeranswer-04.txt)
1)初始提供媒體信息可以出現於INVITE,否則只能在2**迴應中。
2)如果提供媒體信息在INVITE中,回答媒體信息可以出現在1**或2**迴應中,1**中的媒體信息只是2**的拷貝。
   注意,UAC只是處理第一個提供媒體信息。
3)如果初始提供媒體信息出現在2**迴應中,則回答媒體信息必須在對2**迴應的ACK中。
4) UAC不能在一個媒體提供信息正在進行處理過程中提出新的一個媒體提供信息(即不能在沒收到回答媒體信息之前發送新的提供媒體信息)。
5)在一個事務之中UAS只能提供一次媒體信息,而UAC無此限制。
注:以上的限制僅作用於Content-Disposition頭字段爲session時(如果該字段缺失,則Content-Type字段爲application/sdp時Content-Disposition頭字段爲session,其它時候爲render)。

1.2 處理IVITE迴應

2 UAS的處理
2.1 處理INVITE消息
注:此節中所說的INVITE消息均爲初始化會話的INVITE。
如果INVITE中不包含會話描述,則UAS應在2**的迴應中加上會話描述,轉變爲了媒體提供信息方。
對於INVITE的處理,UAS可以迴應處理、接受、重定向或者拒絕。
2.1.1 處理
如果UAS暫時無法迴應請求,則可以選擇迴應處理中消息,特別是回鈴消息。該類消息可以發送任意多次,但不是可靠性傳送(無ACK迴應)。
代理服務器在處理事務時,如果一段時間內沒有消息迴應的話則會取消該事務,而該類消息可以用於延續事務生命(除100外)。
2.1.2 拒絕
如果INVITE提供媒體信息,而UAS無法接受的話迴應488,這類消息應該包括一個Warning消息頭。
2.1.3 接受
2**迴應中應該包括Allow和Supported消息頭,可能包括Accept消息頭。這些告訴UAC在呼叫過程中允許的特性。
如果作爲回答媒體信息方,之前的迴應中沒有回答媒體信息,則在2**中必須包含媒體信息。
如果2**沒有ACK的迴應,雖然建立起了對話,但也應發送BYE來結束會話。


二 會話的修改
在《理解對話》一章中說過,通過目標更新請求可以修改對話(如修改對話的遠端目標)。而此節主要講的是如何修改會話,如地址、端口、增減媒體流等。這些是通過在同一對話中發送INVITE消息來實現的,即re-INVITE(該消息可以同時修改會話和對話)。UAC和UAS都具有re-INVITE功能。
1 UAC行爲
同樣的提供-迴應模型同樣適用於re-INVITE消息。re-INVITE同樣可以不帶有媒體描述信息,而隨後的處理(包括ACK響應)跟普通INVITE一樣。
不過媒體信息提供方應該修改會話版本(如果存在的話)。
跟普通INVITE不同的是,因爲是在同一對話會中發送的INVITE消息,所以是點到點的交互。即re-INVITE不會衍生(fork),Request-URI不是AOR(address of record),而是對話目標。
雖然UA可以同時建立多個事務,但在同一個對話中只允許一個事務存在,除非舊事務正處在completed、confirmed或者terminated狀態中。
2 UAS行爲
如果收到的新的INVITE消息中的CSeq序號比舊的要小,則迴應500且帶有Retry-After消息頭。


三 會話的結束
對話內BYE的發送可以結束跟該對話相關的會話(如re-INVITE的協商失敗,則關閉新和舊的對話及會話)。而BYE的發送必須在建立對話之後,而建立對話之前取消則應使用CANCEL方法。UAC可以在對話初始和確定狀態時發送BYE,而UAS只能在對話確定狀態時發送BYE。而且UAS在對話確定狀態時,只能在收到對2**的ACK或事務超時的時候才能發送BYE。
一般來說,呼叫發起方在最終迴應未到之前使用CANCEL來結束,而最後迴應到了之後使用BYE方法;被叫方只適用BYE方法,當被叫摘機之後,2**將被產生所以只能等ACK到來之後才能發送BYE。



From : http://blog.sina.com.cn/s/blog_4b839a1b010080rq.html

發佈了86 篇原創文章 · 獲贊 14 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章