Domain Name Systemってなんのこと？

## ドメイン名からIPアドレスを特定する仕組み
[前の記事](https://qiita.com/tamago3keran/items/dce288a5aa47787f313c)で、Webブラウザが作成したリクエスト・メッセージのリクエスト・ラインに書かれているURI（送信先）はWebサーバのドメイン名で書かれていて、それをOSに送信してもらうときには、ドメイン名ではなくIPアドレスを指定する必要があることを説明しました。

そこで登場するのが、**DNS（Domain Name System）**です。DNSによってドメイン名からIPアドレスを特定することができます。

今回はドメイン名からIPアドレスを特定するDNSの仕組みについてまとめていきます。

## これは何の記事か？
プログラミングしか学んでこなかったエンジニアが本を参考に、DNSの仕組みについてまとめた記事です。

**対象読者**

- プログラミングしか学んでこなかった
- DNSってなんですか？？

## この記事のゴール
- リクエスト・メッセージに書かれているドメイン名からIPアドレスを特定する仕組みについて説明できる

## DNSってなに？？
**DNS（Domain Name System）**とは、ドメイン名とIPアドレスを相互に変換する仕組みです。ドメイン名とIPアドレスの対応表を持った**DNSサーバ**をインターネット上に配置し、DNSサーバに問い合わせることでドメイン名に対応するIPアドレスを取得するというものです。

![network-DNS.png](https://qiita-image-store.s3.amazonaws.com/0/186009/665e021f-9f51-3005-d10c-47305908aac3.png)

## DNSの実現方法
上記の説明は、問い合わせしたDNSサーバにドメイン名とIPアドレスが登録されている場合を想定しています。しかし、IPアドレスは43億個もあるので、ドメイン名とIPアドレスの対応表だけでも膨大な情報量になってしまいます。

一台のDNSサーバでDNSを実現しようとすると、保持する情報が膨大になるだけでなく、Webサーバにアクセスしようとする度にDNSサーバへの問い合わせが発生するので、一台のサーバではとてもさばききれません。さらに、そのDNSサーバがダウンしてしまったら、世界中でインターネットが利用できなくなってしまいます。

そこで情報を分散させて多数のDNSサーバに登録し、DNSサーバ同士が連携をすることで該当の情報を探し出すという仕組みでDNSを実現することになりました。

![network-DNS実現.png](https://qiita-image-store.s3.amazonaws.com/0/186009/e6577a5d-1c72-ab8c-712c-110b6b4036f9.png)

## ドメインの階層構造
DNSによってIPアドレスが特定される流れを説明する前に、ドメインの階層構造について理解すると良さそうです。

ドメイン名はドット区切りの階層構造になっていて、右に位置するものが上位階層を表すことになっています。例えば、`www.example.com` というのは `com` というドメインの下にある `example` というドメインのさらに下にある `www` というサーバのことを指します。

## DNSによって対象サーバのIPアドレスが特定される流れ
インターネットには数万台のDNSサーバが存在するので、対象WebサーバのIPアドレスを持っていないか片っ端から聞いていくのは現実的ではありません。

そこで、まず下位のドメインを担当するDNSサーバのIPアドレスを、その上位のDNSサーバに登録し、そのDNSサーバをさらに上位のDNSサーバに登録するようにしました。

`www.example.com`を例にすると、`www.example.com`というドメインを担当するDNSサーバを`example.com`のDNSサーバに登録し、`example.com`のDNSサーバを`com`ドメインのDNSサーバに登録するといった具合です。

さらに`com`や`jp`といった**トップレベル・ドメイン**の上位に**ルート・ドメイン**と呼ばれるドメインも存在しており、ルート・ドメインのDNSサーバにトップレベル・ドメインのIPアドレスが登録されています。

※ ルート・ドメインを担当するDNSサーバに割り当てられたIPアドレスは世界で13個しかありません。

ここから実際の流れを追いながら説明していきます。

![network-ルート・ドメイン.png](https://qiita-image-store.s3.amazonaws.com/0/186009/ef4234a6-5ca1-4a55-d858-d5c3522298bc.png)

1. クライアントが最寄りのDNSサーバに`www.example.com`のIPアドレスを聞く
2. 最寄りのDNSサーバに情報が登録されていない場合、ルート・ドメインに`www.example.com`のIPアドレスを聞く
3. ルート・ドメインのDNSサーバに情報が登録されていない場合、下位のドメイン（com）を担当するDNSサーバのIPアドレスを返す
4. `com`のDNSサーバに`www.example.com`のIPアドレスを聞く
5. `com`のDNSサーバに情報が登録されていない場合、下位ドメイン（example）を担当するDNSサーバのIPアドレスを返す
6. `com.example`のDNSサーバに`www.example.com`のIPアドレスを聞く
7. 情報がある場合、`www.example.com`のIPアドレスを返す
8. 最寄りのDNSサーバがクライアントに`www.example.com`のIPアドレスを返す
9. クライアントが`www.example.com`のIPアドレスに対してリクエスト・メッセージを送る

このようにして、WebサーバのIPアドレスを特定します。

## キャッシュ機能を利用して効率を上げる
さらにDNSサーバは情報探しの効率を上げるため、一度調べたドメイン名をキャッシュに記録しておく機能を持っています。これにより、他のDNSサーバと通信をしなくてもキャッシュした情報を返すようになるので効率が上がります。

## クライアント・DNSサーバ間の通信プロトコル「UDP」
クライアントのOSの内部にはプルトコル・スタックというネットワーク制御用ソフトウェアがあり、それが**TCP（Transmission Control Protocol）**や**UDP（User Datagram Protocol）**といったプロトコルを使ってデータ送受信を行います。

データを確実に送受信したい時はTCPに則って通信が行われ、確実性はともかく速くデータを送受信したい時はUDPに則って通信が行われます。そして、DSNサーバとのデータ送受信はUDPに則って行われています。

TCPとUDPについては次の記事でまとめさせていただきます。

## まとめ
DNSでは、WebサーバのIPアドレスが登録されているDNSサーバのIPアドレスが、上位ドメインのDNSサーバに登録され、そのDNSサーバがさらに上位ドメインのDNSサーバに登録されるという特徴をもつので、ルート・ドメインから階層を下にたどっていくことで目的のDNSサーバにたどり着けるので、WebサーバのIPアドレスを特定できる。

## 参考にした本
- [「プロになるためのWeb技術入門」 ― なぜ、あなたはWebシステムを開発できないのか](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352)
- [イラスト図解式 この一冊で全部わかるサーバーの基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%81%8D%E3%81%AF%E3%81%97-%E3%81%BE%E3%81%95%E3%81%B2%E3%82%8D-ebook/dp/B01DBQQ80A)
- [ネットワークはなぜつながるのか 第２版](https://www.amazon.co.jp/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC%EF%BC%92%E7%89%88-%E6%88%B8%E6%A0%B9-%E5%8B%A4-ebook/dp/B077XSB8BS)

## 所感
WebブラウザにURLを入力してWebページに遷移する裏側で、このような処理が行われているとは全く知らなかった。多くのDNSサーバにアクセスしているはずなのに、一瞬でWebページが表示されることに驚きました（キャッシュされている可能性が高いですが）

DNSについて学べたことで、DNSキャッシュポイズニング攻撃の理解もかなりスムーズでした。次回はTCPについてまとめようと思います。