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