DNSでは、ドメイン名をIPアドレスに変換するための通信に、主に UDP と TCP の2つのプロトコルが使われます。
一般的な名前解決ではUDPが多く使われますが、状況によってはTCPが使われることもあります。
そのため、DNSを正しく理解するには、「DNSはUDPで動く」と覚えるだけでは不十分です。
実際には、用途や通信内容に応じてUDPとTCPを使い分けている と考えるのが正確です。
DNSは、Webサイトの閲覧やメール送信など、インターネット上のさまざまな通信の前提となる仕組みです。
たとえば、ブラウザでWebサイトを開くときは、まずそのドメイン名に対応するIPアドレスを調べるためにDNSへの問い合わせが行われます。
このときDNSは、通信方法としてUDPまたはTCPを利用します。
どちらを使うかは、応答データの大きさや通信の目的によって変わります。
大まかにいうと、次のように整理できます。
つまりDNSは、軽量で高速な通信と、信頼性の高い通信を状況に応じて使い分けているのです。
UDPは User Datagram Protocol の略で、通信相手との接続を事前に確立せずにデータを送る方式です。
UDPには次のような特徴があります。
DNSの問い合わせは、1回あたりのデータ量が比較的小さいことが多いため、こうしたUDPの性質と相性がよいとされています。
DNSでUDPが広く使われてきた最大の理由は、軽量で効率的だから です。
DNSの名前解決は、Webアクセスのたびに何度も発生する可能性があります。
そのたびに接続確立の処理を行うと、応答速度やサーバー負荷に影響しやすくなります。
UDPであれば、接続を張るための事前手続きなしに問い合わせを送れるため、次のようなメリットがあります。
このため、AレコードやAAAAレコード、MXレコード、CNAMEレコードなど、一般的なDNS問い合わせではUDPが使われることが多くなっています。
TCPは Transmission Control Protocol の略で、通信相手との接続を確立したうえで、データの到達や順序を確認しながら通信する方式です。
TCPの主な特徴は次の通りです。
UDPよりも手軽さでは劣りますが、より確実にデータをやり取りしたい場面ではTCPが適しています。
DNSはUDPだけで動作するわけではありません。
実際には、次のような場面でTCPが重要な役割を果たします。
DNS応答が大きくなり、UDPでは収まりきらないことがあります。
このような場合、DNSサーバーは応答が途中で切り詰められたことを示す TC(Truncated)フラグ を返すことがあります。
クライアントはこの情報を受け取り、必要に応じてTCPで再度問い合わせを行います。
大きな応答が発生しやすい例としては、次のようなものがあります。
DNSサーバー同士でゾーン情報をやり取りする ゾーン転送 では、TCPが使われます。
代表的なゾーン転送には、次の2種類があります。
ゾーン転送では、大量のDNS情報を正確に送受信する必要があるため、信頼性の高いTCPが適しています。
従来のDNS over UDPでは、扱えるメッセージサイズに制限がありました。
その後、EDNS(0) によって、UDPで扱える応答サイズを拡張できるようになりました。
ただし、EDNS(0)を使っても、すべての大きな応答を安定してUDPで扱えるとは限りません。
ネットワーク機器の制限やフラグメントの問題などにより、最終的にTCPでの再問い合わせが必要になることがあります。
DNSにおけるUDPとTCPの違いを簡潔に整理すると、次のようになります。
DNSについて簡単に説明するとき、「DNSはUDPを使う」と紹介されることがあります。
これは間違いとは言えませんが、正確には不十分です。
実際には、DNSは歴史的にUDPを広く使ってきた一方で、TCPも正式な通信手段として利用されています。
特に現在では、大きな応答への対応や運用上の要件を考えると、TCPは単なる例外ではなく、DNSにとって重要な役割を持つ存在です。
そのため、DNSを説明する際は、次のように理解するのが適切です。
DNSでは通常の名前解決でUDPが多く使われるが、必要に応じてTCPも使われる。
つまりDNSは、UDPとTCPを使い分けて動作する仕組みである。
一般的なDNS通信の流れは、次のようになります。
多くのケースではUDPだけで処理が完了しますが、応答内容によってはTCPが必要になります。
UDPは高速で効率的ですが、DNSで利用する際にはいくつか注意点もあります。
UDP自体には再送制御がないため、途中でパケットが失われる可能性があります。
その場合、再試行はDNSクライアントやリゾルバ側の実装によって行われます。
大きなUDPパケットは、IPレベルで分割される場合があります。
この断片化が途中で失敗すると、名前解決エラーの原因になることがあります。
UDPは接続状態を持たないため、過去にはDNSを悪用した増幅攻撃の踏み台として問題になることがありました。
TCPは信頼性が高い一方で、次のような特徴があります。
UDPと比べると、通信開始までの処理が増えるため、単発の問い合わせでは不利になりやすいです。
TCPは接続状態を管理する必要があるため、サーバーのメモリや処理資源をより使います。
運用や実装によっては、UDPより遅く感じられることがあります。
ただし、接続の再利用などによって影響を抑えられる場合もあります。
DNSのUDPとTCPを理解するうえで、実務上は次の点を押さえておくと役立ちます。
一般的なWeb閲覧やアプリ利用時のDNS問い合わせは、まずUDPで行われることが多いです。
TCPは例外的なものではなく、DNSの正常な運用に必要な仕組みのひとつです。
DNSサーバー運用に関わる場合は、AXFRやIXFRといったゾーン転送とTCPの関係を理解しておく必要があります。
DNS関連の通信では、UDP 53だけ許可していれば十分とは限りません。
環境によってはTCP 53も必要になるため、設定時には両方を意識することが大切です。
DNSでは、一般的な名前解決においてはUDPがよく使われます。
これは、UDPが接続確立不要で軽量なため、すばやく効率的に問い合わせを処理しやすいからです。
一方で、応答データが大きい場合やゾーン転送を行う場合には、信頼性の高いTCPが使われます。
そのため、DNSはUDPだけで動く仕組みではなく、用途に応じてUDPとTCPを使い分ける仕組み と理解するのが正確です。
以上、DNSのUDPとTCPについてでした。
最後までお読みいただき、ありがとうございました。