Appendix A. 使用 TCP 承载 DNS 的优缺点摘要
TCP 握手通常可以防止地址欺骗, 因而也可以防止困扰 UDP 的反射/放大攻击.
与 UDP 相比, IP 分片 (IP fragmentation) 对 TCP 造成的问题较少. TCP 栈通常实现路径 MTU 发现 (Path MTU Discovery), 因此可以避免 TCP 段发生 IP 分片. 另一方面, UDP 不提供重组; 这意味着超过路径 MTU 大小的数据报必须经历分片 [RFC5405]. 已知中间盒 (middleboxes) 会阻止 IP 分片, 从而导致超时, 并迫使客户端实现去 "探测" 网络路径所支持的 EDNS0 应答大小值. 此外, 分片还可能导致缓存投毒 (cache poisoning) [fragmentation-considered-poisonous].
与 UDP 查询相比, TCP 建连会额外消耗一个 RTT. 可以通过重用连接, 对查询进行流水线化, 以及启用 TCP Fast Open 来摊销建连开销.
TCP 对客户端和服务器提出了额外的状态维护要求. 使用 TCP Fast Open 可以降低关闭并重新打开 TCP 连接的开销.
到任播 (anycast) 服务器的长寿命 TCP 连接可能会因路由变化而中断. 使用 TCP 承载 DNS 的客户端需要始终准备好重新建立连接, 或以其他方式重试未完成查询. 多路径 TCP (Multipath TCP) [RFC6824] 也可能允许服务器将连接从任播地址移交到单播地址.
当前使用中的许多 "middleboxes" 会干扰端口 53 上的 TCP [RFC5625]. 除了绝对明确 TCP 是 DNS 的有效传输方式, 并且所有实现都要求支持 TCP 之外, 本文档不提出任何解决方案.
关于面向连接 DNS (connection-oriented DNS) 的更深入讨论可参见其他资料 [Connection-Oriented-DNS].