はじめまして!BFTの新卒エンジニアの山下です。 
私は文系大学生から新卒一年目でインフラエンジニアとして働いています。  

前回は、Windowsの名前解決について、基本的なhostsファイルと DNS (Domain Name System)についてご説明しました。 (前回の記事はこちら)

後編となる今回は、私自身がこの記事を書くきっかけともなった「沼」についてお話したいと思います。 

Windowsの名前解決とは 

前回のおさらいとなりますが、 Windowsの名前解決はいくつかあり、それぞれが違う特徴を持っています。 
代表的な方法は hostsファイル やDNS (Domain Name System)といった手法がありますが、他にはどんなものがあるのでしょうか? 

1.hostsファイル   
2.DNS 
3.MDNS  
4.LLMNR  
5.NBT  

これらはhostsファイルを最優先として、hostsファイルがだめならDNS、DNSがだめならMDNS…というように処理がなされていきます。 

後編となる今回は、 LLMNR (Link-Local Multicast Name Resolution)を始めとした、普段はあまり意識しないWindowsの名前解決手法についてご紹介します。 

NBTによる名前解決 

まず、一つ目に解説するのは「NBT」です。正式名称は「NetBIOS over TCP/IP」です。名前にある通り、「TCP/IP」を使用して通信をします。「TCP/IP」というのはプロトコルの一種です。つまり「NetBIOS over TCP/IP」というのは、「TCP/IP」というプロトコルの上で「NetBIOS」を動かす、という意味になります。  

ここまで聞いてもなんのこっちゃわからないとなる人もいると思います。なので、ひとつひとつ紐解いていくことにしましょう。 

プロトコルとは

まず「プロトコル」についてですが、コンビューターとコンピューターが通信する際に必要になる決まり事だと思ってください。人間で例えると、今私と皆さんは「文字」を通じて意思疎通をしています。この私と皆さんとの間に「文字」というプロトコルが決まっているからこそ、皆さんは私の伝えたい事を受け取れるようになるのです。同じようにして、コンピューター同士にもこのプロトコルというものが決まっているからこそ、さまざまなやりとりができるようになっているのです。  

プロトコルにはいろいろな種類があります。今回議題にあがっているTCP/IPは「TCP」と「IP」という二つのプロトコルからなっています。  

「TCP」というのは、Transmission Control Protocolというのが正式名称で、データを送る際や送ったときに毎回確認をしてくれるまめなやつです。この相手はデータを送っていい相手なのか、相手にデータは届いたのか、届いていないならもう一度送ろうか、とデータを送る際に正確性を大事にしてくれます。なので、メールなど特定の相手にきちんとデータを送りたいときに使用されます。 しかし、まめさ故に通信が遅いという欠点があります。  

「IP」はInternet Protcolが正式名称になります。「IPアドレス」についている「IP」と同じですね。IPはこのインターネット上で相手を特定するためのルールで、そのためにIPアドレスがあったりするのです。先ほど紹介したTCPやUDPなどのプロトコルはIPによって相手を特定したあとに役目があるのです。  

なので、「TCP/IP」はこの二つのプロトコルを一緒くたにした表現と思っていただければ問題ないと思います。  

NetBiosとは

では、「NetBIOS」はどのような存在なのでしょうか。結論から述べると、 Windowsネットワークで使用されるNetBIOSはコンピューター同士を通信させるものです。プロトコルではなくインターフェースで、通信先の相手にNetBIOS名(NetBIOSにおけるホスト名)を付けて通信します。名前解決と似ていますね。ですが、現代ではNetBIOSをインターフェースではなくプロトコルの意をもって表すことが多く、今回の記事でも古くにNetBIOSというプロトコルがあったという認識で構わないと思っています。  

NetBIOSを拡張したものとして「NetBEUI」というプロトコルが生まれました。しかし、このNetBEUIはルーティング機能を持たないので一つのルーターを越えることができないですし、小規模なネットワークでしか使用できません。今の時代にそぐわなくなってきたNetBEUIではなく、TCP/IP上でNetBIOSを使えるようにしよう!となったのが「NetBIOS over TCP/IP」になるのです。ややこしい! 

TCP/IP上で動けるようになったことで、ルーターを越えてNetBIOS名解決することが可能になりました。ただ、lmhostsファイルやWINSサーバーが必要になります。この二つはWindowsネットワーク上でのhostsファイルとDNSサーバーのようなものです。今現在では、ほとんどhostsファイルとDNSサーバーに置き換わっているようです。  

なので、NetBIOS over TCP/IPが現代で使われているのは、同じネットワーク内にいるコンピューターをDNSサーバーがなくても、NetBIOS名でアクセスできるという点にあります。つまり、NBTの機能が使われているというよりは、NetBEUIとしての機能が名残として使用されているのです。 

NBTがどのように名前解決を行っているかというと、ローカルネットワーク内で名前解決をしたいデバイスが問い合わせをブロードキャスト通信を使って送ります。その通信を受けたデバイスの中で対応するデバイスが返事をする、という流れになっています。 

ブロードキャスト通信とは、一つの通信元から同じネットワーク内にいるユーザーすべてにデータを送る通信のことです。ブロードキャストアドレスにリクエストを送ることで行うことができます。通信する相手のことを選択することができないので、全員に問答無用で通信をすることになります。なので、送りたくない相手にも送ってしまうなんてこともあるのがこの通信方式です。ただし、ルーターを越えてほかのネットワークへ通信を送ることはできません。 

NBTの名前解決

LLMNRによる名前解決 

次に紹介するのはLLMNRです。Link-Local Multicast Name Resolutionの略でNetBIOS over TCP/IPと同じように同一のネットワークにいれば、DNSサーバーがなくても名前解決を行うことができるシステムです。  

NBTは単一のネットワークしか存在しない家庭内などでは、名前解決のためにわざわざDNSサーバーを作成する必要がなく有用ですが、IPv4にしか対応しておらずIPv6でも簡易的な名前解決をしたいときに手段がありませんでした。 

そこで誕生したのがLLMNRです。NetBIOS over TCP/IPではIPv4の通信にしか対応していませんでしたが、LLMNRはIPv6にも対応しています。 DNSサーバーやhostsファイルを必要としない名前解決という点においては、LLMNRはすべての要素でNBTより優れているといってよいでしょう。 

LLMNRの通信方法

LLMNRもNetBEUIと同じようにルーターを飛び越える通信ができません。できませんというよりか、する必要性がないのです。LLMNRはローカルな名前解決に特化しているプロトコルであり、ほかのネットワークにまで通信を及ぼす必要がないのです。 

LLMNRは“ブロードキャスト通信”と”マルチキャスト通信”を使用します。 

ブロードキャスト通信は先ほどのNBTの名前解決でも使用されていた通信方式です。IPv4を使用する場合、LLMNRはブロードキャスト通信を使って通信をします。 

マルチキャスト通信とは、一つの通信元から複数の宛先へ同じデータを送る通信のことです。ブロードキャスト通信との最大の違いは、送る相手は全員ではなく指定した複数の相手になるという点です。そして、ブロードキャスト通信と違いほかのネットワークへ通信可能です。動画の配信やオンライン会議など、リアルタイムでの映像配信などで使われます。 LLMNRはIPv6の通信を行うときにのみマルチキャスト通信を行います。IPv6だとブロードキャスト通信は廃止されているからです。 

ブロードキャスト通信と同じく、マルチキャスト通信にもマルチキャストアドレスというものがあり、マルチキャストアドレスを指定してリクエストを送ることで、データを送信したい相手を決めることができます。 

また、LLMNRでは基本的に一対一の通信を想定しているTCPを使うことはなく、UDPを使用して通信をします。UDP (User Datagram Protocol)とはTCPとは違い、とりあえずデータを送信します。その相手がだれかきちんとデータを送ることができているのか、そんなことは確認しないのです。正確性に劣る代わりに速度に関してはTCPよりも勝っています。なので、マルチキャスト通信と組み合わせて、リアルタイムで通信をしたいときに使用されることが多いです。  

UDPを使用していること、サーバーを経由しないことから、LLMNRはWindowsネットワーク内で遅延が少ない高速な通信を可能にしているというわけです。 

どのようにして名前解決を行っているのか?

LLMNRがどのように名前解決を行っているかというと、環境内で名前解決を行いたいデバイスが必要に応じて、問い合わせをブロードキャストアドレス(マルチキャストアドレス)へ送り、ブロードキャスト通信(マルチキャスト通信)でネットワーク内に送ります。その通信を受けたデバイスの中で対応するデバイスが返事をする、という流れになっています。 

(1)IPv4の場合 

LLMNRの名前解決(IPv4)

(2)IPv6の場合 

LLMNRの名前解決(IPv6)

マルチキャスト通信の特徴を強調するような図にはなっていますが、LLMNRで名前解決を行う場合はローカルネットワーク内のすべてのコンピューターに通信する場合が多いと思います。 

MDNSによる名前解決 

最後に「MDNS」についてお話ししたいと思います。正式名称は「マルチキャストDNS」であり、LLMNRと同じようにローカルネットワークにマルチキャスト通信を飛ばして名前解決を行うプロトコルです。 

IPv4とIPv6の両方に対応していて、「224.0.0.251(IPv6の場合は ff02::fb) 」というマルチキャストアドレスに問い合わせを発信します。そのあとに、この問い合わせをルーターがLAN内にIPv4とIPv6の両方を使用してマルチキャスト通信で送信します。これに対して、対応するデバイスが「224.0.0.251」に応答するという流れになっています。  

MDNSはWindows特化のLLMNRとは違い、さまざまなデバイスとの名前解決が可能になっています。LLMNRの完全上位互換ですね。 

 スマートフォンやプリンターにMDNSをサポートしている場合、パソコンからこれらのデバイスに名前でアクセスできるようになるのです。 

MDNSの名前解決

この「MDNS」はApple社がよく利用していることでも知られており、WindowsでもWindows 10から標準的に実装されるようになり、LLMNRからこのMDNSに移行しようという動きが出てきています。現在では、今回紹介した3つの名前解決法がすべてWindowsで使える状態ですが、近い将来MDNSだけになり、ものすごくシンプルになっているかもしれませんね。  

ここまで、NBTとLLMNRとMDNSの三種類の名前解決の方法を紹介してきました。正直に言ってこの三つの機能でできることはすべて同じです。NBTに関してはルーターを越えての名前解決も可能ですが、その機能もDNSで十分に同じ役割を果たすことができるでしょう。  

なぜ、同じ役割を果たすものが何個もある(ここがややこしい原因)のかというと、Windowsの歴史が関係しています。この記事で深く扱うことはしませんが、いずれはNBTとLLMNRが二つとも廃止され、MDNSだけの状況になるのではないかと考えています。 

まとめ 

今回皆さんに紹介させていただいたとおり、Windowsにはたくさんの名前解決の方法があります。要件によってはインターネットに接続しなかったり、ルーターを飛び越えない環境だったりするかもしれません。そんな時に、この記事が役に立ってくれたらうれしいです。  

最後にNetBIOS over TCP/IP、LLMNRの存在はエンジニアをするうえでそこまで重要ではない(と私が勝手に思っているだけ)かもしれません(MDNSですべてまかなえてしまいそうですしね)が、知識として持っているのはすごく大切だと思います。 

しかし、この調査をしたことで名前解決についての理解だけでなく、ネットワークなど幅広い範囲の理解が少し深まった気がしました。そこまで重要なものに感じなくても、調査を進めていくうちにほかの分野の知見も深めていけるのは、エンジニアとして大事なポイントなのではないかと感じています。