前提
DNSでは、UDPとTCPの2つのプロトコルを使い分けています。
- UDP: 通常のDNSクエリ(512バイト以下)
- TCP: 応答データサイズが512バイトを超える場合、またはゾーン転送などの複雑なタスクで信頼性・同期が重視される場合
参考: この512バイト制限はRFC 1035で定められた標準仕様です。
TCPが使われる場合
ゾーン転送(Zone Transfer)
DNSサーバはIPアドレスとドメイン名を対応付けたデータベースを持っています。このデータベースは通常、特定のネットワーク内に2台以上用意されています。
片方が更新された場合、もう一方のデータベースも整合性が取れるように更新する必要があります。このようなDNSサーバ間のデータ同期がゾーン転送です。
- 実際の環境では、もっと多くのサーバが存在する場合があります
- 更新するデータが多くなると、同期の整合性確認がより重要になります
- このような場合はスピードよりも安全性が重視されるため、TCPが利用されます
512バイトを超える応答
DNS応答が512バイトを超える場合、UDPでは送信できないため、自動的にTCPに切り替わります。
UDPが使われる場合
通常の名前解決
Webブラウザからのリクエストがあるような通信の場合、名前解決が行われます。
- 名前解決はIPアドレスを求める処理で、ユーザが求める本筋の処理ではありません
- このような場合は高速性が重視されます
- 名前解決の通信は通常小規模(512バイト以下)です
- 万が一クライアントがレスポンスを受信できなかった場合は、クライアント側からクエリが再送信されます
これらの理由から、通常の名前解決ではUDPが使われます。
参考資料
公式仕様
参考記事
- When do DNS queries use TCP instead of UDP?
- Domain Name System - DNS transport protocols
- DNSの基礎知識
- DNS works on both TCP and UDP
- DNSの仕組みとTCP/UDPの使い分け
技術書
- ネットワークはなぜつながるのか 第2版 - 第2章も参考になります