なぜIPv6とIPv4の名前解決は別々に行なわれるのか?

   このエントリをはてなブックマークに登録    2017/6/5-1

www.example.comなどの「名前」に対応するIPアドレスをDNSサーバに問い合わせるとき、IPv4とIPv6に関する名前解決を単一の問い合わせで行うことはできません。そのため、DNSサーバに対して、IPv4に関する問い合わせと、IPv6に関する問い合わせを、別々に2度行う必要があります。

これは、DNSサーバに対しての問い合わせが単一のレコードに対してしか行えないためです。 Aレコード(IPv4アドレス)の問い合わせと、AAAAレコード(IPv6アドレス)の問い合わせは、それぞれ別々のレコードに対する問い合わせなので、両方を同時には行えないのです。

ただし、「IPv4とIPv6に関するDNSサーバへの問い合わせは別々に行わなければならない」というのは、事実上の話であって、「仕様上そうなっている」と言い切れるのかどうかは微妙かも知れません。

DNSに関するRFCは、悪名高いRFC 1034とRFC 1035を基本としています。 RFC 1034がDNSのコンセプトを解説し、RFC 1035に仕様が記載されています。 これらのRFCは、1987年に発行されていますが、現時点においてRFC 1034とRFC 1035を上書きして廃止するRFCは存在しないため、DNSに関してはRFC 1034とRFC 1035がベースになるのです。

DNSサーバに対して問い合わせを行うときに利用されるDNSメッセージのフォーマットは、RFC 1035に記載されていますが、そこに書いてある仕様上は、複数の問い合わせを1つのDNSメッセージで行えるようにも読めます。

RFC 1035の28ページにある「4.1.2. Question section format」には、「The section contains QDCOUNT (usually 1) entries」と書いてあります。1987年のRFCなので、いまほど厳密な記述方法になってないとはいえ、「普段は1(usually 1)」という仕様を見ると、どうして良いのかわからなくなります。そして、この「普段は1」という仕様は今も上書きされずにそのまま残っています。そもそも、QDCOUNTのQDが何の略であるかも書いてません。QはQuestionだと推測されますが、Dは何なのか明確に定義されていないので謎です。

「普段は1」ということは、普段とは違う内容も明確に禁止しているわけではないので、RFCの仕様上は複数のQuestionを同時に送信できるようにも読めなくはないです。RFC 1035だけを読む限りは、QDCOUNTを2にしたうえで、QuestionセクションとしてIPv4用のAレコードとIPv6用のAAAAレコードを同時に送信できれば、IPv4とIPv6に関する問い合わせを同時にできなくはないとも思えるわけです。

ただし、現時点ではQDCOUNTが1ではない値を受け付ける実装がありません。複数の問い合わせを同時に含むDNSメッセージを受け入れる実装が存在しないため、単一のDNSメッセージで行える問い合わせは事実上1つだけになっているのです。

昔のRFCに謎仕様が残されていることも多いのですが、DNSというインターネットの根幹的な仕組みにおいても、修正されずに残っている謎仕様が存在し、それを元に世界中での運用が行われているのです。

   このエントリをはてなブックマークに登録