【初心者向け】DNSの大まかな仕組みについて調べてみた

# はじめに
DNS (Domain Name System) について、基本的な部分を調べてまとめました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/cfa88a16-bcef-4352-86dd-8b7e6cfa3425.png" width=55%>

# 目次
- [概要](#概要)
- [ドメインとは](#ドメインとは)
- [歴史](#歴史)
- [DNSサーバーとは](#dnsサーバーとは)
- [URLからDNSを使用してWebページが表示されるまで](#urlからdnsを使用してwebページが表示されるまで)
- [メールアドレスからDNSを使用してメールが送信されるまで](#メールアドレスからdnsを使用してメールが送信されるまで)
- [ルートドメインについて](#ルートドメインについて)
- [ドメインの種類](#ドメインの種類)
- [キャッシュDNSサーバーと権威DNSサーバーの設置場所について](#キャッシュdnsサーバーと権威dnsサーバーの設置場所について)
- [その他](#その他)

# 概要
DNSとは、ドメイン名とIPアドレスの対応を管理するための仕組みのことです。
例えば`https://www.hoge.co.jp`というURLのWebページにアクセスしたい場合、クライアントPCはこのURLの文字列ではどのWebサーバーに接続すればよいかわかりません。コンピュータはIPアドレスはわかりますが、URLの文字列をみても何のことか分からないからです。そのためDNSサーバーというドメイン名とIPアドレスの対応表をもっているサーバーを使用して、アクセスしたいWebサーバーのIPアドレスを取得します。
例えばブラウザを使用して`https://www.hoge.co.jp`にアクセスしたい場合、DNSサーバーを使用してURLのドメイン名からIPアドレス xx.xxx.xxx.xx (xは数字) に変換します。

このようにドメイン名からIPアドレスを得ることを「名前解決」と呼びます。IPアドレスからドメイン名を得ることも同じく名前解決といいますが、通常はドメイン名からIPアドレスを得るパターンの方が多いです。

:::note
アドレスとは、インターネット上における住所を意味します。Addressは英語で「住所」という意味です。
URLといわれる「ホームページアドレス」、メールで使用される「メールアドレス」、コンピュータの住所である「IPアドレス」など、様々な箇所でアドレスという言葉が使用されています。
:::

# ドメインとは
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/73d13891-6873-4b26-95ed-76684076defa.png" width=55%>

ドメインは英語で「領域」や「領土」を指す言葉で、IT用語ではサーバーの位置情報を示すためのIPアドレスを文字列に変換したものを指します。IPアドレスだけしか使用されていないと、人間からみたら数字の違いだけになるので区別がかなり難しいです。そこでIPアドレスを人間に分かりやすく変換したドメインを使用して、URLをみてもどういったサイトに接続している、みたいなイメージができるようになっています。

以下ではURLとメールアドレスの場合の2パターンのドメインを紹介します。

### URL
URLはUniform Resource Locator (統一資源位置指定子) の略で、インターネット上のリソース (資源) を特定するための、決まった記号の並びのことです。
例えば`https://www.hoge.co.jp`というURLがあるとすると`hoge.co.jp`がドメイン部分にあたります。

:::note
ドメイン以外の部分について、`https`はプロトコル、`https://`はスキーム、`www`はホスト名と呼ばれます。
:::

#### メールアドレス
メールアドレスでは、@より右側の部分がドメインと呼ばれます。@より左側の部分はローカル部と呼びます。その他、ユーザー名と呼ばれたりもします。
例えば`hoge@Sample.co.jp`というメールアドレスがあるとすると`Sample.co.jp`がドメイン部分にあたります。

# 歴史
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/3ae968ed-2ac1-46be-8926-313025d74e93.png" width=55%>


DNSは1983年ごろに誕生しました。それまではホスト名とIPアドレスの対応は[SRI](https://ja.wikipedia.org/wiki/SRI%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8A%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB)が管理している「SRI-NIC」というホストコンピュータが「HOSTS.TXT」というファイルで一元管理していました。また当時はTCP/IPは誕生していなく、[NCP](https://ja.wikipedia.org/wiki/Network_Control_Program)という通信プロトコルが使用されており、そのプロトコルではコンピュータのアドレス表記は"192.168.1.1"みたいな表記ではなく、"1"や"2"などの番号がそのまま使用されていました。
ただ1983年にTCP/IPが採用しはじめられてネットワークが急激に拡大していくと、インターネットが成長してユーザー数が増加して一元管理に課題が沢山生じてしまいました。
そこで、「ドメイン名」を使用するアイデアやドメインを管理するサーバーを分散させて階層化させるDNSの仕組みが誕生し、採用されていきました。
今は国際的な非営利団体である[ICANN](https://www.bing.com/search?pglt=129&q=ICANN+wiki&cvid=ac4b151daf084fb68e30695fd40a2a65&gs_lcrp=EgRlZGdlKgYIABBFGDkyBggAEEUYOTIGCAEQABhAMgYIAhAAGEAyBggDEAAYQDIGCAQQABhAMgYIBRAAGEAyBggGEAAYQDIGCAcQABhAMgYICBAAGEAyCAgJEOkHGPxV0gEIMjQ2NWowajGoAgCwAgE&FORM=ANNAB1&PC=U531)が全体を管理しています。

参考：
- [DNS前史：HOSTS.TXTとドメイン名ができるまで](https://heartbeats.jp/hbblog/2022/08/hoststxt.html)

# DNSサーバーとは
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/d30ede52-9dc5-4423-aacb-5ab1b77fd72d.jpeg" width=60%>

ドメインからIPアドレスを教えてくれる働きをするサーバーのことです。
DNSサーバーは2種類あります。

### 権威DNSサーバー
コンテンツDNSサーバーとも呼ばれます。ドメインからIPアドレスを割り出す仕事をします。権威DNSサーバーは世界中に多くありますが、それでも権威DNSサーバーだけだと通信が集中してしまいます。そのため、次のキャッシュDNSサーバーというものがあります。

### キャッシュDNSサーバー
フルサービスリゾルバとも呼ばれます。よく使用するWebサーバーやメールサーバーのIPアドレスをキャッシュしてくれているサーバーです。
クライアントPCからアクセスしたいWebページがあるとき、まずこのキャッシュDNSサーバーに問い合わせます。DNSサーバーにIPアドレスをもっている場合は権威DNSサーバーを使用せず、そのままIPアドレスの情報をクライアントに返します。これを「キャッシュヒット」といいます。
キャッシュヒットしない場合は、キャッシュDNSサーバー自身が権威DNSサーバーと通信し、IPアドレスを探して答えをもってきてくれます。

:::note
- DNSサーバーは「権威DNSサーバー」と「キャッシュDNSサーバー」の2種類があります。
- リゾルバは resolve (解決する) のerが付いたものです。解決する人みたいなイメージです。
:::

# URLからDNSを使用してWebページが表示されるまで

一例として、クライアントPCからURLを指定してDNSサーバーを使用してWebページが表示されるまでの流れを記載しました。
クライアントPCから`https://www.hoge.co.jp`というURLにアクセスしたいという場合で説明します。

### 1. キャッシュDNSサーバーに問い合わせる
クライアントPCは、まずは接続したいWebサイトのページを持っているWebサーバーのIPアドレスを知ろうとします。そこで最初に[キャッシュDNSサーバー](#キャッシュdnsサーバー)に問い合わせます。
キャッシュDNSサーバーがIPアドレスを持っていれば、WebサーバーのIPアドレスをクライアントPCに返します。持っていなければ権威DNSサーバーに聞きに行きます。

:::note
クライアントPCからキャッシュDNSサーバーへ行われる問い合わせは「再帰問い合わせ」と呼ばれます。② 以降で説明しますが、キャッシュDNSサーバー内に情報が無いと、キャッシュDNSサーバーはいろいろな[権威DNSサーバー](#権威dnsサーバー)に問い合わせてIPアドレスの情報を取得しようとします。権威DNSサーバーへの問い合わせを再帰的に行い必ずWebサーバーのIPアドレスを教えて、みたいなニュアンスがあります。

ちなみに、②以降で出てくるDNSサーバーはたくさんありますが、キャッシュDNSサーバー以外は全て権威DNSサーバーになります。

:::

### 2. ルートDNSサーバーに問い合わせる
(1)でキャッシュDNSサーバーにWebページの情報が無い場合、キャッシュDNSサーバーはルートDNSサーバーに問い合わせに行きます。ルートDNSサーバーが`https://www.hoge.co.jp`という情報を受け取ると、これは「jp」ドメインを管理している権威DNSサーバーに聞いて、と返答します。

:::note
- URLのドメイン部分は後ろからたどっていきます。なのでルートDNSサーバーからは「jp」を知っている権威DNSサーバーを紹介されます。
- ルートDNSサーバーは世界に13台しかありません。しかもそのうちの10台はアメリカにあります。アジアでは日本に一つしかありません。残りの2台はそれぞれオランダ、スウェーデンにあります。
※[こちらのサイト](https://ryonotes.com/where-is-route-dns-server/)にDNSルートサーバーの設置場所の世界地図が掲載されています。
※厳密には台数が13台ではありません。冗長化や分散化が行われているからです。13の[ルートゾーン](https://ja.wikipedia.org/wiki/DNS%E3%83%AB%E3%83%BC%E3%83%88%E3%82%BE%E3%83%BC%E3%83%B3)があるようなイメージです
:::

### 3.「jp」ドメインを管理している権威DNSサーバーに問い合わせる
「jp」ドメインを管理している権威DNSサーバーが`https://www.hoge.co.jp`という情報を受け取ると、これは「co」ドメインを管理している権威DNSサーバーに聞いて、と返答します。
※「jp」ドメインを管轄しているグループの中の「co」ドメインを知っているサーバーを紹介されるイメージです。

:::note
ここで「jp」ドメインの中の「co」ドメインを知っているサーバーを紹介されましたが、権威DNSサーバーはこのように階層構造のようになっています。階層構造にして権威DNSサーバーを何台も使用して、サーバーの負荷を減らしています。
:::

### 4. 「co」ドメインを管理している権威DNSサーバーに問い合わせる
「jp」ドメインの中の「co」ドメインを管理している権威DNSサーバーが`https://www.hoge.co.jp`という情報を受け取ると、これは「hoge」ドメインを管理している権威DNSサーバーに聞いて、と返答します。

### 5. 「hoge」ドメインを管理している権威DNSサーバーに問い合わせる
「jp」ドメインの中の「co」ドメインの中の「hoge」ドメインを管理している権威DNSサーバーが`https://www.hoge.co.jp`という情報を受け取ると、「このページを管理しているWebサーバーのIPアドレスは知っているよ」といってIPアドレスを教えてくれます。
これで、クライアントPCはどのWebサーバーにアクセスすればいいかがわかりました。
このようにキャッシュDNSサーバーはいくつかの権威DNSサーバーからたらい回しにされて、得たいIPアドレスを取得できます。

:::note
クライアントPCからキャッシュDNSサーバーへ行う問い合わせは「再帰問い合わせ」といいましたが、キャッシュDNSサーバーが権威DNSサーバーへ行う問い合わせを「反復問い合わせ」といいます。
:::
### 6. IPアドレスをもとにWebサーバーに接続する
取得したIPアドレスを元に、クライアントPCがWebサーバーに接続して、Webページを表示します。

:::note
例えばURLが`https://www.hoge.co.jp/fuga/piyo`の場合も、ドメイン部分は変わらず`hoge.co.jp`の部分です。`fuga/piyo`の部分はパスと言われ、ドメインから割り出されたWebサーバーがこのパスをみてどのWebページを表示したらよいか判断します。なので`fuga/piyo`というパスの部分はDNSとは直接関係はありません。
:::

(1)～(6)を図にするとこのようになります。(キャッシュヒットしていない場合です)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/5aa06cfb-8072-4efa-8411-f06fd06161e9.png" width=100%>

# メールアドレスからDNSを使用してメールが送信されるまで

メールアドレスからメールを送信する際のDNSの仕組みも大きくは一緒です。
例えば、宛先`hoge@Sample.co.jp`にメールを送信したい、となったときに、メールアドレスのドメイン部分からメールサーバーのIPアドレスを取得します。まずはキャッシュDNSサーバーに問い合わせて、なければ権威DNSサーバーを使用してトップレベルドメインからたどっていく、という形も同じです。
ただしURLの場合はクライアントPCからキャッシュDNSサーバーに直接名前解決を依頼しましたが、メール送信の場合はまずクライアントPCから送信メールサーバーに情報が渡り、送信メールサーバーからキャッシュDNSサーバーに接続して、メールを送る宛先のメールサーバーのIPアドレスを割り出します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/fb959734-00f5-4c89-a18b-ee88f0773593.png" width=100%>

# ルートドメインについて
ここまでドメインという言葉を多く使用しましたが、一般的に使用されているドメインは「ルートドメイン」が省略されています。ルートドメインとはドメイン名空間の最上位階層を明示的に示すためのドメインで、ドメインの最後に付く「.」のことを指します。
なので本来は最後に「.」があるものが正しいドメインとなります。

`https://www.hoge.co.jp.`  ← [完全修飾ドメイン](#完全修飾ドメインについて)（正しい）
`https://www.hoge.co.jp`   ← 不完全なドメイン（一般的なURL表記）

### 完全修飾ドメインについて
省略できるところを省略せず、きちんと全部書いたドメイン名のことを完全修飾ドメインといいます。
FQDN (Fully Qualified Domain Name) とも呼ばれます。例えば`https://www.hoge.co.jp`だと、`www.hoge.co.jp.`が完全修飾ドメインになります。

# ドメインの種類
ドメインの種類も色々あります。ここではトップレベルドメイン、セカンドレベルドメイン、サードレベルドメインを紹介します。

## トップレベルドメイン (TLD)
一般的な表記のドメイン (例：`https://www.hoge.co.jp`) をピリオド (.) で区切ったときの一番後ろの部分です。
ドメインの種類ごとに主な対象者は決められていますが、大半は誰でも取得が可能です。

### ドメイン例

#### .jp
 <table>
    <tr>
      <td>意味</td>
      <td>日本</td>
    </tr>
    <tr>
      <td>元の英単語</td>
      <td>Japan</td>
    </tr>
    <tr>
      <td>URL例</td>
      <td><a href="https://www.yahoo.co.jp">https://www.yahoo.co.jp</a><br><a href="https://www.ipa.go.jp">https://www.ipa.go.jp</a></td>
    </tr>
 </table>

#### .com
 <table>
    <tr>
      <td>意味</td>
      <td>商用</td>
    </tr>
    <tr>
      <td>元の英単語</td>
      <td>Commercial</td>
    </tr>
    <tr>
      <td>URL例</td>
      <td><a href="https://www.youtube.com">https://www.youtube.com</a></td>
    </tr>
 </table>

#### .org
 <table>
    <tr>
      <td>意味</td>
      <td>団体</td>
    </tr>
    <tr>
      <td>元の英単語</td>
      <td>Organization</td>
    </tr>
    <tr>
      <td>URL例</td>
      <td><a href="https://foundation.mozilla.org/en">https://foundation.mozilla.org/en</a></td>
    </tr>
 </table>

:::note
- .jpや.de (ドイツ) など、国名を表すTLDを「ccTLD（country code TLD）」と呼びます。
- .edu (教育機関)や.mil (軍事) など、特定の組織によって提供されるTLDを「sTLD (Sponsored TLD) 」と呼びます。
- 上記以外の.comや.orgなどは一般的なTLDとして「gTLD（generic TLD）」と呼びます。
- comは最も人気なドメインになっています。
- 「org」は「オーグ」、または「オルグ」と読むらしいです。
:::

#### 参考
- [トップレベルドメイン一覧](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E4%B8%80%E8%A6%A7)

## セカンドレベルドメイン (SLD)
ドメインをピリオド (.) で区切ったときの後ろから2番目の部分のことです。
### ドメイン例
#### .co
 <table>
    <tr>
      <td>意味</td>
      <td>企業、会社</td>
    </tr>
    <tr>
      <td>元の英単語</td>
      <td>commercial</td>
    </tr>
    <tr>
      <td>URL例</td>
      <td><a href="https://www.yahoo.co.jp">https://www.yahoo.co.jp</a></td>
    </tr>
 </table>
 
#### .ne
 <table>
    <tr>
      <td>意味</td>
      <td>ネットワーク</td>
    </tr>
    <tr>
      <td>元の英単語</td>
      <td>network service</td>
    </tr>
    <tr>
      <td>URL例</td>
      <td><a href="https://biz.biglobe.ne.jp/index.html">https://biz.biglobe.ne.jp/index.html</a></td>
    </tr>
 </table>

## サードレベルドメイン (3LD)
ドメインをピリオド (.) で区切ったときの後ろから3番目の部分のことです。

例えば`https://www.yahoo.co.jp`なら`yahoo`、`https://www.ipa.go.jp/`なら`ipa`になります。

# キャッシュDNSサーバーと権威DNSサーバーの設置場所について
一般的には家庭用のルーターがキャッシュDNSサーバーの役割を担っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/8a2647b9-1061-4d9d-86a4-83cc1836f6c6.png" width=55%>
権威DNSサーバーは当たり前ですが自宅にはなく、データセンターのような場所に設置されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533049/d338f4bc-3af6-47c5-a3ff-d1882371bb51.png" width=55%>

# その他
### [自⁠分だ⁠け⁠のド⁠メ⁠イ⁠ン⁠名をこ⁠こ⁠か⁠ら検⁠索](https://domains.squarespace.com/ja/?_gl=1*z3kf7c*_up*MQ..&gclid=CNKm-MD0qIsDFUG0rAIdgrkyog&gclsrc=ds)
こちらのサイトでドメイン名を入力することで、ドメイン名が使用できるか確認ができます

# 終わりに
知らなかったことが多くて勉強になりました。引き続き、詳しい部分も学んでいきたいです。

# 参考
- [#123 ネットワーク知識避けがちなあなたに、面白おかしくDNSをお話しする会 - まじんプログラマーの週末エンジニアリングレッスン](https://podtail.com/podcast/e1fc74a8/-123-dns/)
- [DSNとは - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1287.html)
- [メールを支えるドメイン名とDNSの仕組み](https://ascii.jp/elem/000/000/432/432823/)