SIP協(xié)議中的重傳機(jī)制
SIP中的重傳機(jī)制的基本原理
包括事務(wù)層和應(yīng)用層的重傳,比如INVITE和non-INVITE請求的不同處理。然后,結(jié)合他之前的問題,說明為什么FreeSWITCH會重復(fù)發(fā)送200 OK,可能是因?yàn)?span>ACK未被正確接收或處理,導(dǎo)致服務(wù)端認(rèn)為響應(yīng)未被確認(rèn),從而觸發(fā)重傳。
SIP 重傳機(jī)制的作用
SIP 基于 UDP(默認(rèn))或 TCP 傳輸,而 UDP 不保證消息可靠性。為了確保關(guān)鍵消息(如 INVITE、200 OK、ACK)的送達(dá),SIP 協(xié)議定義了事務(wù)層的自動重傳機(jī)制:
客戶端重傳:發(fā)送方未收到響應(yīng)時,自動重傳請求。
服務(wù)端重傳:服務(wù)端未收到 ACK 時,重傳 2xx 響應(yīng)(僅針對 INVITE 事務(wù))。
區(qū)分請求和響應(yīng)的重傳
對于INVITE事務(wù),客戶端會重傳請求直到收到臨時響應(yīng),而服務(wù)端會重傳響應(yīng)直到收到ACK。對于非INVITE事務(wù),客戶端也會重傳請求直到收到最終響應(yīng),但服務(wù)端不會重傳響應(yīng),因?yàn)檫@類事務(wù)沒有ACK機(jī)制。
重傳觸發(fā)的場景
(1) INVITE 事務(wù)的客戶端重傳
觸發(fā)條件:客戶端發(fā)送 INVITE 后未收到任何響應(yīng)(如 100 Trying 或 180 Ringing)。
初始重傳間隔為 T1(默認(rèn) 500ms),每次重傳間隔翻倍(500ms → 1s → 2s → 4s ...),直到達(dá)到 T2(默認(rèn) 4s)。最大重傳次數(shù)為 6 次,總超時時間為 64*T1 ≈ 32秒。若超時后仍無響應(yīng),客戶端終止事務(wù)并觸發(fā) 408 Request Timeout。
(2) INVITE 事務(wù)的服務(wù)端重傳
觸發(fā)條件:服務(wù)端發(fā)送 2xx 響應(yīng)后未收到 ACK。
服務(wù)端會重復(fù)發(fā)送 200 OK,間隔時間為 T1(500ms),最多重傳 7 次。若始終未收到 ACK,服務(wù)端認(rèn)為事務(wù)失敗,可能釋放會話資源。非 2xx 響應(yīng)(如 4xx)不需要 ACK,因此不會重傳。
(3) Non-INVITE 事務(wù)的重傳
適用于 BYE、OPTIONS、REGISTER 等請求。
客戶端重傳:未收到最終響應(yīng)(如 200 OK)時重傳請求,規(guī)則與 INVITE 相同。
服務(wù)端不重傳響應(yīng):因?yàn)?span> Non-INVITE 事務(wù)沒有 ACK 機(jī)制。
為什么 FreeSWITCH 會重復(fù)發(fā)送 200 OK?
FreeSWITCH 作為服務(wù)端發(fā)送 200 OK 后未收到合法的 ACK,觸發(fā)以下流程:FreeSWITCH 發(fā)送 200 OK。等待 ACK,若超時(初始 500ms),重傳 200 OK。每次重傳間隔加倍,直到達(dá)到 T2(4s),最終超時(總時間約 32秒)。若始終未收到 ACK,FreeSWITCH 認(rèn)為會話建立失敗,釋放資源。
定時器的設(shè)置
T1和T2的時間,默認(rèn)值是多少,以及這些定時器如何影響重傳的時間間隔。例如,初始重傳間隔是T1(通常500ms),之后每次翻倍,直到達(dá)到T2(4s),之后固定間隔直到超時。