DNSで使用するトランスポート層のプロトコル
DNSはトランスポート層のプロトコルであるTCPとUDPの内どちらでも使用できますが、問い合わせはオーバーヘッドが少ないことが好まれますので、一般的にはUDPが使用されています。
ただし、UDPだけが使用されているのではありません。他の項で少し触れましたが、ネームサーバは障害時にそなえて、複数用意できます。その時、セカンダリサーバにプライマリサーバが管理している情報を転送しなくてはなりません。これを「ゾーン転送」と呼びます。ゾーン転送時には、信頼性が求められますので、信頼性が高いTCPが使用されます。また、問い合わせ結果として512バイトを超える応答データ返された場合、リゾルバは一般的にはTCPを使用して要求を再発行します。
これから、DNSのデータ通信を解説するに先だってUDPを使用した通信を、サンプルプロジェクト「UdpTest」を用いて解説します。記事に添付されているサンプルコードをダウンロードして、実行してみてください(C#版とVB.NET版を用意しています)。
前回紹介したサンプルプロジェクトTcpTestの実行結果と見比べると、UDPがオーバーヘッドがほとんどないプロトコルであることが分かります。 ただし、信頼性を確保しようとすれば、プログラマ自身が処理をしなくてはなりません。DNSの問い合わせはUDPを使用しているので、パフォーマンスは高いものの信頼性が低く、パケットがロストする危険があることを頭の隅に置いてください。
これで、DNSでの通信方法を理解する下地ができましたので、次項でDNSの問い合わせ処理について解説します。
DNSの問い合わせ処理
DNSでホスト名のIPアドレスを問い合わせる様をプログラムで表現しましたので、まずはサンプルプロジェクトの「QueryTest」を実行してみてください。
DNSのIPアドレス問い合わせの様子が窺えます。ただし、これはあくまでも解説のための例であり、実際とは異なる点に注意してください。これから、このプログラムを基にDNSのIPアドレス問い合わせについて解説していきます。