mDNSの謎について
動機
もともと, macでbonjourっていうやつによって*.localという名前で名前解決ができるようになっているという知識と、同様のことがlinuxではavahi-daemonというものをインストールすることによってできるということは知っていた。しかし、その仕組みについては全然勉強していなかったので学んでみた。
mDNSの詳細について
もともとは2000年に提案された仕組みっぽい。割と新しいなとおもったけどもう15年も前の話なのか。
で、このmDNSというのはzeroconf, ゼロコンフィギュレーションネットワークという枠組み(?)のなかの一つのお話っぽくて、zeroconfはとても便利っぽい話っぽい。あまり広がっていないような気がしたけど、僕はUPnPとか使ったりしてるし意外と徐々に広まりつつあるのかもしれない。と考えたところでUPnPの仕組みもしらないことに気づいたのでそのうち勉強したい。
で、肝心のmDNSの話だが、Bonjourのドキュメントのp12に簡単に書いてあった。
Because these DNS queries are sent toa multicast address, no single DNS server with global knowledge is required to answer the queries.
つまり、mDNSを使えるノードはマルチキャストアドレス(224.0.0.251)のUDP, ポート5353にDNSのクエリをなげ、対応するマシンがいればそのノードが返事を返すというような感じっぽい。意外と単純だった。
いろいろ調べてるついでに、 mDNS - A Proposal for Hierarchical Multicast Session Directory Architecture (ICOMP'08) なんていう論文もみつかった。abstractしか読んでないけど、これは名前解決に関してまとめた論文なのかな?
global deployment which may allow end users to enjoy the true power and eciency of IP multicast.
なんて言っているけど、IP multicastってそんなに新しい技術なのだろうか?(よく知らない)
nsswitch
名前解決の順序を決め、順番に名前解決を行うシステム。設定ファイルは/etc/nsswitch.conf。
僕の/etc/nsswitch.confは以下のようになっている。
hostsが, files, mdns4_minimul dnsとなっているので、/etc/hosts探してからmdnsを行い、なければdnsを行うという手順であることがわかる。_minimul
の意味だが、mDNSで.localのホストの名前解決を行う(nss-mdns)に詳しい説明が記述されている。簡単にまとめると、*.localというホスト名であればmdnsするし、そうでなければ即時にスキップするということらしい。これによって無駄にmdnsをすることをなくしているようだ。
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat
group: compat
shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis