2015年1月29日 星期四

SIP

SIP (Session Initiation Protocol,會話發起協定) 讓兩個或以上用戶間建立各種形式的通話,稱為會話,包括多方會議、視訊、多媒體播放等等,主要的規格寫在 RFC 3261

會話 (session) 由 SIP 協定的 INVITE 方法建立,內容包含可用的媒體描述,讓各方協調出可互通的媒體類型。SIP 使用一些代理伺服器 (proxy) 協助轉送請求到用戶目前的位置、服務存取認證、服務提供者轉送政策等。SIP 也提供機制讓用戶註冊目前位置,給 proxy server 使用。

發話端知道受話端的電話號碼,但不知道目前的位置,所以 INVITE 請求會先在 SIP 的代理伺服器間轉送,直到受話端目前的位置,這個動作叫 routing。當請求到達受話端,受話端會回 response 給發話端。response 裡面包含受話端的 Contact,也就是受話端目前的位置。一開始的請求也包含了發話端的 Contact,這樣雙方就知道彼此的目前位置,接下來的訊息就可以直送對方,沒必要經過 SIP 代理伺服器轉送,增進整體效能,也減少處理延遲。


SIP 網路元件 (SIP elements)

SIP Methods

一些名詞
  • Transaction (交易):包括一個請求及其所有回應,採用類似 HTTP request/response transaction 模型。
    • 回應包括選擇性的 provisional 回應,到其最後回應。失敗的 INVITE 之後的 ACK 也算在同一 transaction。
    • regular transaction:INVITE、ACK、CANCEL 以外的 transaction
      • REGISTER
    • SIP transaction:
      • INVITE/2xx:接受 INVITE 並建立 session。
      • ACK:
      • INVITE/non-2xx/ACK:這是個特例,包含 ACK 也算在同一個 transaction,沿用 Via branch。
      • CANCEL:沿用 Via branch,取消 pending transaction。
    • stateful:會紀錄 transcation 狀態,當請求或回應進來會看是否屬於已存在的 transaction,方式是看 Via header 的 branch 參數。以前 RFC 2543 的舊方式比較複雜,需要去 hash To, From, Request-URI 及 CSeq。
    • stateless UAS:不送 1xx 回應、不重送回應、忽略 ACK 請求、忽略 CANCEL 請求、To tag
  • Call 或 Session (會話):由 dialog 建立及維護,包含所有參與的 dialog 及影音,可能有多個 dialog 的多方通話。

SIP Header 欄位 (UAC 送出的 SIP 請求至少要有 To、From、CSeq、Call-ID、Max-Forwards、及 Via)
DTMF relay
BLF
軟體

參考

  1. 相關 RFC
  2. http://www.iptel.org/sip/intro
Header 欄位格式

host = hostname / IPv4address / IPv6reference
  • 以 To header 為例,都會有 addr-spec 這部份,且必須是某個 scheme 加「:」開頭,常見的有 sip:、sips:、或 tel:
  • 不管是 sip: 或 sips:,以「@」結尾的 userinfo 是選項,hostport 是必須的,可有「;」開頭的 uri-parameters,「?」開頭的 headers 也是選項。

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...