SIP 請求方法(10) PRACK

2021-10-18 22:42:04 字數 1849 閱讀 2902

rfc3262定義了prack方法,它用於保證臨時應答(1xx)的傳輸可靠性。invite請求的2xx, 3xx, 4xx, 5xx, 與 6xx應答的可靠性是通過ack方法確定的。但是,如果臨時應答(比如180 ringing)對呼叫狀態至關重要,則可能需要對收到的臨時應答進行確認。prack方法適用於除了100 trying之外的所有臨時應答訊息,它們在3261中沒有可靠性保證。

uac收到臨時應答時,如果訊息中包含rseq可靠序列號和supported: 100rel頭域字段,那麼應當生成prack。prack訊息中攜帶乙個rack頭域,並在這個頭域中回顯rseq和cseq的序列號。下圖是信令交換的流程。在這個例項中,uas發的180 ringing中包含rseq頭域,啟用臨時應答可靠性機制。如果uas直到定時器超時也沒有收到prack(圖中的「x」表示訊息丟失),那麼重發之前的臨時應答。收到prack確認後傳送應答訊息並停止後續的(臨時應答)重傳。prack的200 ok應答停止prack請求的重傳。

可靠應答的重傳,使用invite最終應答一樣的的指數回退機制。call-id, cseq 序列號, 與 rack 號碼的組合,允許ua匹配臨時應答與prack。如下圖所示,prack收到200 ok應答,可以通過cseq頭域中的方法名區分invite方法對應的200 ok。

prack方法總是會遞增cseq計數。prack可以攜帶訊息體,也可以用於offer/answer交換。訊息交換例項:

sip/2.0 180 ringing

via: sip/2.0/udp lucasian.cambridge.example.org;branch=z9hg4bk452352;received=1.2.3.4

to: descartes ;tag=12323

from: newton ;tag=981

call-id: da6fa909f1c0188c539feb08d4496eb7

rseq: 314

cseq: 10 invite

content-length: 0

prack sip:[email protected] sip/2.0

via: sip/2.0/udp lucasian.trinity.cambridge.example.com;branch=z9hg4bkdtyw max-forwards: 70

to: descartes ;tag=12323

from: newton ;tag=981

call-id: da6fa909f1c0188c539feb08d4496eb7

cseq: 2 prack

rack: 314 10 invite

supported: 100rel

content-length: 0

sip/2.0 200 ok

via: sip/2.0/udp lucasian.trinity.cambridge.example.org;branch=z9hg4bkdtyw ;received=1.2.3.4

to: descartes ;tag=12323

from: newton ;tag=981

call-id: da6fa909f1c0188c539feb08d4496eb7

cseq: 2 prack

require: 100rel

content-length: 0

prack訊息的必要頭域 to

viafrom

call-id

cseq

max-forwards

rack

SIP 請求方法(2) REGISTER

ua用register方法通知sip網路它當前的聯絡 uri ip address 和路由到這個聯絡位址對應的uri。sip註冊與手機初始化時的註冊過程有點類似。ua通過 伺服器外呼時並不要求註冊。但是,除非使用其它非sip的定位手段告知終端當前的聯絡uri,否則,ua想通過 伺服器接收來電,就必須...

SIP 請求方法(11) UPDATE

rfc3311定義了update方法,可以在不改變dialog狀態的前提下修改會話的引數。sip中使用invite請求建立會話,過程中使用offer answer模型。通常,invite中帶offer,而在它對應的應答中帶answer。在會話建立之後,可以用re invite修改會話引數。但是,會話...

10 Flask請求擴充套件

flask 可以通過 擴充套件 裝飾器 來實現類似於django 中介軟體的功能 類似django中介軟體,在執行檢視函式之前,之後執行默寫功能 執行一次,第一次請求結束,在第一批函式執行後就不再執行 狀態改為false def before first request1 print before ...