TCPだけでDNSサーバにqueryできるようになってた

   このエントリをはてなブックマークに登録    2016/7/14-1

DNSメッセージといえばUDPの53番というイメージの方々も非常に多いと思いますが、1987年に発行されたRFC 1035の時点でDNSメッセージのトランスポートとして利用できるのはUDPとTCPであると記述されています。

しかし、これまでDNSにとってはUDPが基本でした(ゾーン転送を除く)。「RFC 1123: Requirements for Internet Hosts」には、以下のようにあります。

DNS resolvers and recursive servers MUST support UDP, and SHOULD support TCP, for sending (non-zone-transfer) queries. Specifically, a DNS resolver or server that is sending a non-zone-transfer query MUST send a UDP query first. If the Answer section of the response is truncated and if the requester supports TCP, it SHOULD try the query again using TCP.

ゾーン転送ではないDNSサーバへの問い合わせは、まずはUDPで行わなければならず、そこで得られた返答がUDPのDNSメッセージで収まりきらない大きさ(truncated)であることを示すTCビットが立っている場合に、TCPでのDNS queryを試すべきであるとあるのです。

このように、DNSサーバへの問い合わせはUDPの53番で行うべきもので、最初からTCPでDNSサーバへの問い合わせを行うことはRFCに違反でした。

しかし、今年(2016年)の3月に、この状況が変わりました。「RFC 7766: DNS Transport over TCP - Implementation Requirements」で、DNSサーバへの問い合わせをTCPだけで行っても良いと記述されたのです。

Stub resolvers and recursive resolvers MAY elect to send either TCP or UDP queries depending on local operational reasons. TCP MAY be used before sending any UDP queries. If the resolver already has an open TCP connection to the server, it SHOULD reuse this connection. In essence, TCP ought to be considered a valid alternative transport to UDP, not purely a retry option.

DNSサーバに対する問い合わせは、UDPから必ず始めなくてはならないという従来の規定を緩和し、UDPよりも先にTCPを利用しても良いとされました。さらに、TCPはUDPが使えない場合の代替手段として捉えるのではなく、TCPを有効なDNSメッセージ用トランスポートとして捉えるべきであると記述されています。

TCPの方がUDPよりもDNSサーバに負荷をかけるという意見や、エニーキャストとTCPの相性が悪いという意見も依然根強くありますが、RFC 7766の登場によって、UDPを利用しないDNSクライアントを作ることもRFC違反ではなくなりました。このRFCによって、徐々にUDPが使われなくなるのかどうか、今後どうなるのか興味があります。

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