2021年3月13日 星期六

SIP PRACK

PRACK (Provisional Response ACKnowledgement)  是 SIP 用來確認暫時回應 (Provisional Response) 有順利送達,定義在 RFC3262

INVITE 的最後回應會間隔重送直到收到 ACK,其中成功回應和 ACK 的可靠機制是端對端的。但 180 Ringing 等暫時回應,在 RFC3261 並沒有重送機制,沒送到對方就不知道有振鈴。PRACK 模仿 ACK,暫時回應會主動間隔重送直到收到 PRACK。不同的是,PRACK 和一般 SIP Method (如 BYE) 同款,是獨立的 Transaction 而有自己的回應確認收到。

使用 PRACK 機制,每個暫時回應帶 RSeq 封頭放序號。PRACK 帶 RAck 封頭放要確認暫時回應對應的 RSeq 序號。PRACK 確認並不是 cumulative,為了 congestion control 建議暫時回應 PRACK 後才送下一個。

是否支援或啟用 PRACK 依照 Option Tag 機制,Tag 名稱是 100rel,步驟如下:

  1. UAC 發一開始的 INVITE:Require 或 Supported 放 100rel 表示強制或選用 PRACK。
  2. UAS:
    • 如果強制使用 PRACK 但不支援,回 420 Bad Extension (Unsupported 放 100rel) 後結束。
    • 如果要啟用 PRACK,送非 100 的暫時回應時,放 Require: 100rel 和 RSeq。(exponential backoff?) 重送暫時回應直到收到 PRACK。最後沒收到 PRACK 則回 5xx 拒絕原始請求。重送回應
  3. UAC 收到有啟用 PRACK 的暫時回應:一樣建立 dialog,並送 PRACK 含 RAck,內容是要 acknowledge 的 RSeq 和 CSeq。照一般 Transaction 重送 PRACK。
  4. UAS 收到 PRACK:回 200 OK 並停止重送暫時回應。
新增兩個封頭:RSeq 和 RAck
  • RSeq:只用在可靠的暫時回應,值是 1 ~ 232 - 1 數字。
    Example: RSeq: 988789
  • RAck:只用在 PRACK 請求,內容包括要 acknowladge 的暫時回應的 RSeq 和 CSeq。
    Example: RAck: 776656 1 INVITE
說明
  • PRACK 像一般 SIP 訊息 hop-by-hop 傳送和自己的 response。
  • 100 Trying 是 hop-by-hop,PRACK 是 end-to-end 的機制。
  • 如果有 INVITE 以外需要 100 以外暫時回應的 SIP Method,PRACK 應該也適用。
  • UAS 送 18x 時啟用 PRACK,如果最後成功接聽,除非暫時回應有 SDP 外,可以收到 PRACK 前送最後回應。最後回應後才收到 PRACK 該回 481 還是 200?
  • 重送 ACK 由收到 2xx 驅動,但重送 PRACK 獨立於收到暫時回應,所以暫時回應重送的 exponential backup 毋限 T2。

BNF

PRACKm       = %x50.52.41.43.4B ; PRACK in caps
Method       = INVITEm / ACKm / OPTIONSm / BYEm
               / CANCELm / REGISTERm / PRACKm
               / extension-method
RAck         = "RAck" HCOLON response-num LWS CSeq-num LWS Method
response-num = 1*DIGIT
CSeq-num     = 1*DIGIT
RSeq         = "RSeq" HCOLON response-num

參考

  • 能和 Transaction 整合?
  • exponential backoff (指數型退讓)

沒有留言:

張貼留言

SIP header Via

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