マルチキャストDNS

コンピュータネットワークにおいて、マルチキャストDNS(mDNS) はローカルネームサーバーの存在しない小さなネットワーク内でホスト名からIPアドレスを解決するプロトコルである。Zeroconfサービスであり、基本的にユニキャストのDomain Name System (DNS) と同じプログラミングインターフェース、パケットフォーマット、意味論をもつ。はmDNSをスタンドアロンプロトコルとして設計したが、標準的なDNSサーバーと協調して動作することもできる。
として公開されたmDNSプロトコルはIPマルチキャストUDPパケットを用いたもので、AppleのBonjourやオープンソースのAvahiとして実装されており、Avahiは多くのLinuxディストリビューションに同梱されている。Windows 10でも実装されており、これは当初ネットワークプリンタの検出にのみ使用できたが、後にホスト名の解決も可能になった。
mDNSはで別に定義されたZeroconf技術であるDNS-SD (DNS based Service Discovery)と併せて動作させることが可能である。
概要.
ホスト名を解決するとき、mDNSクライアントはIPマルチキャストクエリメッセージを送信し、そのホスト名を自分のものとしているホストに呼びかける。その後対象の機器は自身のIPアドレスを含むメッセージをマルチキャストする。サブネット内にいるすべての機器はこの情報を基に自身のmDNSキャッシュを更新できる。この情報はTime to Live (TTL) をゼロにした応答パケットを送ることで任意のホストが破棄できる。
デフォルトでは、mDNSはトップレベルドメインで終わるホスト名のみを解決する。これはmDNSを実装していないが従来のユニキャストDNSサーバーで解決できるホストが.localドメインに含まれている際に問題となりうる。そのような衝突を解決するにはmDNSが衝突を回避するようネットワーク設定を変更する必要がある。
パケット構造.
mDNSメッセージは以下のアドレスに送信されるマルチキャストUDPパケットである。
ペイロードの構造はユニキャストDNSパケットフォーマットを基にしており、ヘッダーとデータの2部からなる。
ヘッダーはユニキャストDNSと同一であり、クエリ、応答、権威DNSサーバー、追加レコードのようなデータ部のサブセクションも同じである。各サブセクションのレコード数はヘッダーの対応するCOUNTフィールドの値と一致する。
クエリ.
クエリセクションのレコードはユニキャストDNSからわずかに変更されており、1ビットのUNICAST-RESPONSEフィールドが追加されている。
ユニキャストDNSの場合と同じように、QNAMEフィールドはラベルと呼ばれる長さと値からなる一連のサブフィールドからなる。各ラベルは完全修飾ドメイン名 (FQDN) のドットで分けられた部分文字列を表現している。
リストはDNSの"root"を表現するヌルバイトで終了する。
UNICAST−RESPONSEフィールドは不必要なブロードキャストを最小化するために使われる。このビットがセットされている場合、応答者はネットワーク全体に応答をブロードキャストする代わりに、問い合わせたノードに対してユニキャスト応答を直接送ることが望ましい (SHOULD)。
QCLASSフィールドはユニキャストDNSのものと同じである。
リソースレコード.
応答、権威DNSサーバー、追加レコードセクション内のすべてのレコードは同じフォーマットを持ち、まとめてリソースレコード (RR) と呼ばれる。
リソースレコードもユニキャストDNSのものからわずかに変更されている。
CACHE-FLUSHビットはそのRRNAMEとRRTYPEに対応するキャッシュエントリをこのレコードで追記でなく上書きすべきであることを近隣ノードに指示する。
RDATAのフォーマットはユニキャストDNSの対応物と同じである。ただしmDNSの一般的な使用場面であるはフォーマットをわずかに (特にTXTレコードを) 変更している。