My Day One

毎日東京の隅っこでコードを書いているエンジニアのブログです。

【ネットワークの基礎】DNSとは?

はじめに

この記事は「DNS」という用語に焦点を当てて、できる限り初心者でもわかりやすいようにまとめたものです。 できるだけわかりにくい表現や用語、仕組みを話さないようにすることを心がけているので、細かいところにはあまり触れず、大枠を掴んでもらうために書いています。

そのため、若干内容を端折ったりする部分もありますがそこはご容赦ください。

DNSとは

さて、早速ですが、「DNS」って何なんでしょうか?

先に答えを言ってしまうと、DNSはDomain Name Systemの略で、ドメイン名とIPアドレスの対応関係を管理する仕組みのことを指します。

DNSはインターネットの世界において、とても大事なものです。 正直、これがないと、インターネットの世界は成り立たないと言っても過言ではありません。 インターネットがつながらないというわけではないですが、少なくともDNSがない世界では、人間がインターネットを使いたいとは思わないでしょう。そのくらい大事な要素です。

もちろん他の要素(例えばLANがちゃんと動いているかとか)も重要ですが、とにかくDNSがないと我々が当たり前に享受している「ブラウザでネットサーフィンすること」もままならなくなりますし、何か思い立って検索...なんてこともしなくなるでしょう。

それはなぜでしょうか?

実はDNSがないと、blog.hatena.jpyahoo.co.jp のようなドメイン名とIPアドレスの関係性がわからず、私たちは「192.168.1.1 がはてなってサイトで、192.168.1.2がYahooってサイトで...」という具合に、意味不明な数字の文字列を覚えて、正確に打ち込まないとそのページにアクセスできなくなります。

上記の2個だったらいいのですが、世界には無数のIPアドレスがあり、好きなページやサービスを100個、200個暗記するのも大変です。 IPアドレスを間違って覚えたり、打ち間違えたりすると、見たいページやサービスにアクセスできないわけですし、とても不便ですよね。

この不便さを解消するにあたり、DNSが活躍するわけです。

DNSのおかげで我々は、yahoo.co.jpとかgoogle.comみたいな名前を覚えておくだけで(しかも大半はブラウザが補完してくれる)、世界中のサイトやサービスにアクセスできるようになります。

ありがとうDNS!!!

ドメイン名とは

さて、DNSの偉大さはここまででわかったかと思いますが、先ほど私は「ドメイン名とIPアドレスの対応関係を管理する」と書きました。IPアドレス先日の記事で少し触れましたが、ドメイン名とは何を指しているのでしょうか?

実は、IPアドレスと役割はほぼ同じで、インターネット上の住所を表しています。IPアドレスと表記の仕方が違うだけで、結局は住所を人間にわかりやすく表示するためのものです。

ちなみにドメイン名は世界にたった1つしかありません。当然、google.com は世界に1つしかないですし、会社や個人で作ったしがないサービスでも、ドメイン名は1つしかありません。勝手に複数作ることもできません。

このドメイン名とIPアドレスの対応関係を管理するのがDNSというわけです。

ちなみに、ドメイン名をよく見ると、yahoo.co.jp のように . で繋がれた形になっていますが、これにもちゃんと意味があります。

これを . で区切ったところで分解すると yahoocojp に分かれます。これらをドメインといいます。ドメイン名とは少し違って、ドメインは、ネットワーク上のコンピュータのグループ(集まり)を表す単位だと考えればよく、ドメイン名を構成する1つの要素であるという感じで理解をするとわかりやすいのではないかと思います。

ドメインについてもう少し説明しますと、ドメインはツリー構造の形式になっており、一番上に「ルートドメイン」が存在します。

その下にトップレベルドメイン、そしてその下に別のドメイン群...という風になっていて、例えば jpcomorgトップレベルドメインにあたります。

例えば、yahoo.co.jpjp (日本)という国のドメイン群にある、 co という企業を表すドメイン群にある yahoo という企業のページですよ、というふうに分解することができて、ドメイン名というのは、それぞれの名前を . を使って繋げたものだということです。

色々なドメインがあるので、その組み合わせでドメイン名が成り立っているということですね。それによって、ドメイン名がたった1つに決まるようになっています。

ドメインドメイン名、DNSという用語についてはある程度理解できたかと思いますので、次の話にうつりましょう。

私たちがブラウザにドメイン名を入力した時に、どのようにIPアドレスを探しにいっているのでしょうか?

DNSの仕組み

DNSドメイン名とIPアドレスの対応関係を管理する仕組みのこと、であると先ほど書きました。対応関係を知ることができればいいので、基本的にはその情報を持った表があり、そこにアクセスするような形になります。

なので、IPアドレスを知りたいと思ったら、DNSサーバー(ネームサーバーともいう)にそれを問い合わせます。

以下のような図のイメージです。ちなみにこの時、OSにある名前解決のための仕組みである「DNSゾルバ」と呼ばれるものを使って、ネットワーク上のDNSにアクセスしています。

ただし、あくまでこの図はイメージであり、1台のDNSサーバーが世界中のドメイン名とIPアドレスを管理しているわけではありません。

実際はドメインの階層ごとに管理するサーバーが存在していて、それぞれの階層のサーバーに問い合わせながら、IPアドレスを知るという形になっています。

ルートサーバーに問い合わせて、その次はトップレベルドメイン(.jpとかを管理する)サーバーに問い合わせて...というような形で、最終的に求めているドメイン名のIPアドレスを取得します。

例えば yahoo.co.jp というドメイン名のDNSの流れとしては、ざっくり以下のようになります。

  1. ルートサーバーにjpサーバーのアドレスを聞く
  2. jpサーバーにco.jpサーバーのアドレスを聞く
  3. co.jpサーバーにyahoo.co.jpサーバーのアドレスを聞く

上記のような過程を経て、IPアドレスを知ることになります。

もう少し細かいことをいうと、必ずルートサーバーを経由してIPアドレスを尋ねるようになると、ルートサーバーへの負荷がとんでもないことになってしまうので、DNSキャッシュサーバーと呼ばれるものを介してIPアドレスを知ることが一般的になっています。

DNSキャッシュサーバーは、過去のDNS情報をキャッシュに保存しておき、同じ問い合わせに対しては、上位のDNS(ルートサーバーとか)に問い合わせを行わず、キャッシュに保存された情報から回答するという役割を担っていて、基本的にはキャッシュサーバーを介して、我々はIPアドレスを知ることになります。

こうした仕組みを設けることで、キャッシュサーバーにないものだけをルートサーバーや他のドメインのサーバーに問い合わせる形にして、負荷を軽減しています。

上記の内容を図にまとめると以下のようになります。

このような形でDNSは動いており、日々、我々のインターネットにおける利便性を高めてくれています。DNSは開発していても普段意識しないですが、とても重要な技術なんですね〜。こんな仕組みを作ってくれた先人に感謝です。

というわけで、今日はこの辺でおしまいにしようと思います。最後まで読んでくださりありがとうございました!