DNSプロトコル
読み:ディーエンエス-プロトコル
外語:DNS protocol

 DNSを照会する際に用いる通信プロトコル
目次

概要
 TCP/IPのポート53(53/tcpおよび53/udp)が使われる。
 DNSでは、問い合わせや応答について、DNSプロトコルと呼ばれるプロトコルを使う。その仕様は、美しさに欠け、解読にも苦慮するが、少しでもデータサイズを縮めるための努力が込められている(らしい)。

512バイトの壁

原因
 DNSプロトコル自体は、UDPでもTCPでも利用できる。しかし、通常は速度優先でUDPを用いている。
 速度と信頼性はトレードオフの関係にあり、UDPはシンプルなプロトコルであるため高速だが信頼性に欠く。それでも、速度のためにUDPがよく使われている。この影響で逆に、TCPでDNSプロトコルが利用できない実装も少なくないという状況を作り出した。ここで発生するのが、DNSが返すデータのサイズが、DNSの想定する最小MTUを越えてしまった場合の動作である。
 IPv4用DNSプロトコルは、IPv4の最小MTUである548オクテット以内で動作することを想定している。このため、データサイズが512オクテットを越える場合、そのリザルトはパケット分割に対応したTCPにする(TCPフォールバック)か、UDPの場合でもEDNS0という手法を使わざるを得なくなる。どちらも一長一短がある。

TCPフォールバック
 リザルトを53/tcpで返信することで、通信の継続を図る手法である。最小MTU以下にTCP層で分割して送信することで、512バイトを越える場合でも情報のやりとりが可能となる。
 しかしTCPのコネクション処理が必要になるため、どうしてもレスポンスの低下が発生してしまう。
 更に、主要な実装(各種ネットワーク装置や、安物ルーターなども含む)はTCPのDNSプロトコル(53/tcp)に対応していない可能性が高い。仮にルーター自体は対応していても、セキュリティのために53/tcpを通さない設定になっていることもありうる。このためDNSのレコードが膨らみ512バイトを超えてしまうと、正常に通信できない問題が頻発することになる。
 クライアントはUDPで要求を投げ、UDPでレスポンスが戻ることを期待している。この状況でTCPでリザルトを返して来ても、それを受け取る処理がない。結果、いくら待ってもクライアントが期待した(UDPの)応答が返って来ないため、通信することが出来ないことになる。これが「512バイトの壁」である。
 基本的にクライアント側の問題であるため、サーバー側で打てる手はない。512バイトを越えないようにする消極的対応しか無いが、IPv6対応なども進む中、レコードサイズは増える状況にあり、512バイト以内に収めることは困難となってきた。

EDNS0 (Extension mechanism for DNS)
 EDNS0は、STD 75(RFC 6891)で標準化されたDNSの拡張技術で、512バイトを超えるUDPでのDNSプロトコルを実現するものである。
 そもそもEthernetのMTUは1500バイトあるので、UDPのDNSでも1500バイトのパケットを扱うことは難しいことではない(はずである)。問題は、クライアント側、サーバー側の双方が、512バイトを越えるMTUがあるかどうか、である。そこで、互いのMTUを送受信する機能を、DNSプロトコルの水準で設けた。これがEDNS0である。
 転送可能バイト数は16ビットの長さが用意されるため、最大で65535まで可能である。ただし、あまり大きいとパケットのフラグメントが発生する。特にEthernetならMTUが1500バイトなので、これを超えれば確実にフラグメントが発生するため、パケットドロップ率が高い環境の場合、あまり実用的でなくなる。

仕様

資源レコード
 DNSが提供する各情報を、リソースレコード(RR)という。
 zoneファイルに書かれた情報を、DNSプロトコルでクライアントに送信することが主たる目的となり、そのための手法が用意されている。

プロトコル構造
 DNSプロトコルのメッセージフォーマットは、大きく5つのセクションがある。DNSメッセージヘッダーのみ必須で、それ以外は空となるセクションが存在する。

DNSメッセージヘッダー
 ヘッダー内の各項目は、全て16ビット長である。したがって12オクテット、96ビット固定長である。フラグは、MSB→LSBの順に記載する。

質問欄

リソースレコード
 回答欄、オーソリティ、追加情報は次の共通の構造となる。

構造
 リソースレコード(資源レコード)は可変長である。
 RDATAの大きさや内容、構造などはTYPEごとに様々である。詳細なフォーマットについては、RFC 1035の3.3章に記載がある。

TYPE
 リソースレコードに使われるTYPE値。
 以下は、質問(Query)時に使われるQTYPE値。

CLASS
 リソースレコードに使われるCLASS値。
 以下は、質問(Query)時に使われるCLASS値。

再検索