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