Ipsec
為什麼 IKEv2 使用 UDP 而不是 TCP?
根據 IKEv2 RFC 7296,它是一種可靠的協議。
由於 UDP 是一種數據報(不可靠)協議,IKE 在其定義中包括從傳輸錯誤中恢復,包括封包遺失、數據包重放和數據包偽造。
此外,它還具有重傳計時器(第 2.1 節)、消息 id 形式的序列號(第 2.2 節)和視窗大小(第 2.3 節)。雖然,RFC 明確提到視窗大小的目的不是為了實現擁塞控制。
視窗大小通常是特定實現的(可能可配置的)屬性,與擁塞控制無關(例如,與 TCP 中的視窗大小不同)。
我的問題是為什麼 IKEv2 使用 UDP,而不是利用 TCP?
一個原因是與 IKEv1 的向後兼容性。另一個是與 NAT 遍歷(UDP 封裝,RFC 3948)的兼容性,因為它利用 IKE 連接創建的現有 NAT 映射通過 NAT 傳輸 ESP(通過 TCP 執行此操作可能會影響性能,見下文)。
但是,現在可以對 IKEv2 和 ESP 使用 TCP 封裝(甚至可以使用 TLS 隧道)。此擴展在RFC 8229中定義,旨在作為無法通過 UDP 建立連接(例如,由於防火牆)時的備份。
如該 RFC 的第 12 節所述,使用它(例如 TCP-in-TCP)可能會對性能產生一些負面影響,因此通常最好使用 UDP。由於它是一個相對較新的擴展,因此對它的支持還不是很廣泛(Linux 核心從 2020 年 3 月/2020 年 4 月發布的 5.6 開始支持它)。