DoT vs DoT vs DoQ

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 协议。

Reference