DoT vs DoT vs DoQ
Categories:
DoT
DNS over TLS(DoT)是一种基于 TLS 的 DNS 加密协议。TLS 1.2 至少需要四次往返,TLS 1.3 则至少需要三次往返,而 DNS 请求仅需一次往返。
时间轴
↓
┌───────────────────────────────────────────────────────────────────────┐
│ 客户端 服务器
│ │
│ 客户端发送 SYN 段 │
│ ────────────────────────────────────────────────────────────────────▶│
│ SYN = 1, Seq = x │
│ │
│ ←─────────────────────────────────────────────────────────────────────│
│ 服务器响应 SYN-ACK 段 │
│ SYN = 1, ACK = 1, Seq = y, Ack = x + 1 │
│ │
│ 客户端发送 ACK 段 │
│ ────────────────────────────────────────────────────────────────────▶│
│ ACK = 1, Seq = x + 1, Ack = y + 1 │
│ │
│ TCP 连接建立 │
│ 客户端发送 ClientHello │
│ ────────────────────────────────────────────────────────────────────▶│
│ │
│ ←─────────────────────────────────────────────────────────────────────│
│ 服务器响应 ServerHello │
│ 服务器发送证书链 │
│ │
│ 客户端发送密钥交换消息 │
│ ────────────────────────────────────────────────────────────────────▶│
│ │
│ 服务器发送密钥交换消息 │
│ ←─────────────────────────────────────────────────────────────────────│
│ │
│ 客户端发送 Finished │
│ ────────────────────────────────────────────────────────────────────▶│
│ │
│ 服务器发送 Finished │
│ ←─────────────────────────────────────────────────────────────────────│
│ │
│ TLS 握手完成 │
│ 客户端发送 DNS 查询 │
│ ────────────────────────────────────────────────────────────────────▶│
│ │
│ ←─────────────────────────────────────────────────────────────────────│
│ 服务器响应 DNS 查询 │
│ │
└───────────────────────────────────────────────────────────────────────┘
TLS 1.2 的握手过程需要至少两个往返(RTT),即客户端发送 ClientHello,服务器回复 ServerHello 和证书,然后客户端发送 ClientKeyExchange 和 ChangeCipherSpec,最后服务器发送 Finished。TLS 1.3 将握手过程简化为一个往返(1-RTT)。客户端在发送 ClientHello 时可以包含密钥共享信息(ClientKeyShare),服务器在回复 ServerHello 时也包含密钥共享信息,从而在第一个往返内完成密钥协商和握手。
DoH
DNS over HTTPS(DoH)是一种基于 HTTPS 的 DNS 加密协议。HTTPS 是基于 TCP 的协议,建立连接需要至少三次往返,而 DNS 请求仅需一次往返。因此,DoH 在三种加密 DNS 协议中速度最慢。
相较于 DoT,DoH 的协议开销较大,需要额外的 HTTP 协议头,导致服务略慢于 DoT。其他方面与 DoT 类似。
DoQ
DNS over QUIC(DoQ)是一种基于 QUIC 的 DNS 加密协议。QUIC 是基于 UDP 的协议,建立连接需要两次往返,DNS 请求仅需一次往返。因此,DoQ 是三种加密 DNS 协议中速度最快的。
时间轴
↓
┌───────────────────────────────────────────────────────────────────────┐
│ 客户端 服务器
│ │
│ 客户端发送初始包(Initial Packet) │
│ 包含:QUIC版本号、连接ID、加密握手消息(ClientHello)、可能的应用层数据 │
│ ────────────────────────────────────────────────────────────────────▶│
│ │
│ │
│ ←─────────────────────────────────────────────────────────────────────│
│ 服务器响应初始包(Initial Packet) │
│ 包含:加密握手消息(ServerHello、Certificate、ServerKeyExchange等) │
│ 可能包含对客户端0-RTT数据的确认或拒绝 │
│ │
│ 客户端发送加密握手消息(EndOfEarlyData、Finished) │
│ ────────────────────────────────────────────────────────────────────▶│
│ │
│ 服务器发送加密握手消息(Finished) │
│ ←─────────────────────────────────────────────────────────────────────│
│ │
│ 握手完成 │
│ 连接建立 │
│ 数据传输开始 │
│ ────────────────────────────────────────────────────────────────────▶│
│ ←─────────────────────────────────────────────────────────────────────│
│ 数据传输 │
│ 数据传输 │
│ 数据传输 │
└───────────────────────────────────────────────────────────────────────┘
QUIC 使用 TLS 1.3 或更高版本来保护其连接的安全性。加密握手过程与传统的 TLS 握手相似,但通过 QUIC 的数据包格式进行,允许在握手的同时开始数据传输。如果客户端之前已与服务器建立了 QUIC 连接,则在新的连接尝试中可以立即发送应用层数据,无需等待服务器响应。这种机制称为 0-RTT,可以显著减少交互延迟。然而,0-RTT 数据可能因重放攻击的风险而被服务器拒绝。
QUIC 的设计目标是提供比 TCP 更快的连接建立速度和更好的拥塞控制,同时保持与现有网络基础设施的兼容性。通过上述步骤,QUIC 能够在首次连接时实现快速握手,并在后续连接中利用 0-RTT 进一步减少延迟。
结论
在较为稳定的网络环境中,DoQ 理论上速度最快,这得益于其基于 UDP 和 TLS 1.3 的特性。然而,实际网络中由于 UDP 的无连接状态,业务繁忙时可能会被运营商随机丢弃,导致连接不稳定。DoT 的速度略慢于 DoQ,但基于 TCP,其连接更为稳定。DoH 的速度稍慢,由于基于 HTTP 的协议功能更多,可以在服务后端实现更多功能。应根据自身的网络环境和需求选择合适的加密 DNS 协议。