DNSの基礎、仕組みについてまとめてみた

## 前置き

DNSの動作についてまとめてみました。
動作について、確認用の備忘録記事です。

## DNSとは？
DNS(Domain Name System)は、ドメイン名を対応するIPアドレスに変換する役割を担っている。

これにより、ユーザはIPアドレスを直接覚える必要はなく、ドメイン名を入力するだけで目的のWEBサイトへアクセスできます。

しかし、インターネット上には、膨大な数のドメイン名とIPアドレスが存在する。

つまり、DNSでは日々の膨大なトラフィックを処理していることになる。

## DNSにおける階層構造

DNSでは1つのDNSサーバですべてのドメイン名とIPアドレスの対応表を管理しているわけではない！

DNSはドメイン名をドット(.)で分割した文字列(ラベル)ごとに管理をする階層構造を取り、効率的な管理を実施している。

この「ラベル」とはDNSの公式仕様である、**RFC1034** で定義される。
例えば、**www.example.com** というドメイン名は以下のように分割される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/314149cc-1204-23c6-31a9-7d3e625430a2.png)

```
com:トップレベルドメイン
example:セカンドレベルドメイン
www:サードレベルドメイン
```

それぞれのラベルに対応する情報を管理するサーバが存在し、情報の管理をトップレベルドメインから下位のサーバへ順に委任していく仕組みがある。
DNSは以下のような**階層構造**でドメインを管理している。

## 1. ルートDNSサーバ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/8f00d63f-9983-bf77-225a-4dba83744a7c.png)

階層構造の最上位に位置するサーバ。
jpやcomなどのトップレベルドメインを管理するDNSサーバがインターネット上のどこにあるのかを管理する。

ルートDNSサーバではドメイン名とIPアドレスの対応表は管理していない。

## 2. トップレベルドメイン(TLD)DNSサーバ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/c674b9e8-ed2e-434e-fc5e-65ea375ac432.png)

jpやcomなどのトップレベルドメインを管理するDNSサーバ
example.comやsample.comなどのDNSサーバがインターネット上のどこにあるのかを管理する。
ルートDNSサーバ同様、このサーバではドメイン名とIPアドレスの対応表は管理しない。

## 3. セカンドレベルのドメインDNSサーバ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/f91d907e-757d-9ecd-0373-0f55ffeaef36.png)

exampleやsampleなどのセカンドレベルドメインを管理するDNSサーバ。

www.example.com の場合、このセカンドレベルドメインDNSサーバがIPアドレスの対応表を持っている。
またドメイン名がさらに続く場合は、その情報を持つDNSサーバがインターネット上のどこにあるのかを管理する。


## DNSの名前解決の流れ

DNSは階層構造を持ち、ドメイン名とIPアドレスの対応を分割して管理している。

どのようにして、管理を分割させた状態で名前解決を実施しているのか。
例では、ＰＣでブラウザに**www.example.com** と入力してWebサイトを開こうとするとき、以下のようなステップで名前解決が行われる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/43082848-8f09-aefa-691d-dcdbbcb48c64.png)

#### キャッシュDNSサーバに問い合わせ

キャッシュDNSサーバは、利用者からの名前解決の問い合わせ窓口の役割を担っている。

 キャッシュDNSサーバがドメイン名を管理するDNSサーバへ問い合わせをし、結果を利用者に返答する。

 問い合わせの結果は一定期間キャッシュDNSサーバ内に保存され、保存期間内に同じ問い合わせが来た際には再度問い合わせをせずに、自身のキャッシュの中に保存されている情報を利用者へ返す。
 ```
例えば、PCからキャッシュDNSサーバに対してwww.example.comのIPアドレスについて問い合わせをしたとする。
キャッシュDNSサーバは、自身のキャッシュ内のwww.example.comに対応するIPアドレスが保持されているかを確認する。
キャッシュDNSサーバ内にIPアドレスが見つかった場合、名前解決はここで終了する。
IPアドレスがなかった場合、次の工程へ進む。
```

 #### ルートDNSサーバに問い合わせ

キャッシュDNSサーバは、ルートDNSサーバに対してwww.example.comのIPアドレスについて問い合わせをする。
ルートDNSサーバが「.comの情報はこのトップレベルドメインDNSサーバに聞いて!」と返す。

#### トップレベルドメインDNSサーバに問い合わせ

キャッシュDNSサーバは、ルートDNSサーバが教えてくれたトップレベルドメインDNSサーバに対してwww.example.comのIPアドレスについて問い合わせをする。
トップレベルドメインDNSサーバが「example.comの情報なら、このDNSサーバに聞いて!」と返す。

#### セカンドレベルドメインDNSサーバに問い合わせ

キャッシュDNSサーバは、トップレベルドメインDNSサーバが教えてくれたセカンドレベルドメインDNSサーバにwww.example.comのIPアドレスについて問い合わせをする。

セカンドレベルドメインDNSサーバが「www.example.comのIPアドレスは93.184.215.14だよ」と、目的のwww.example.comに対応するIPアドレスを返す。

#### ブラウザがIPアドレスに接続

キャッシュDNSサーバは一連の問い合わせによって取得したIPアドレスをPCへ返す。

PCのブラウザでIPアドレス(93.184.215.14)を使って目的のサーバに接続し、www.example.comの内容を取得・表示する。


上記のステップを踏むことで、ブラウザへドメイン名を入力することで目的のWEBサイトまでたどり着くことが出来る

#### ルートDNSサーバの負荷分散

ルートDNSサーバにおける負荷分散について

#### 13のクラスタ構造
ルートDNSサーバは、A~Mまでの13のサーバクラスタとして構成されている。
クラスタ構成とは、複数のサーバを1台のシステムとして動作させる仕組みのこと。
クラスタ構成を組むことで、負荷分散と障害耐性を実現する。

DNSが名前解決に使用する通信プロトコルであるUDPの応答パケットにはサイズ制限があり、この制約に対応するため13という数に設計されている。

各クラスタは物理的に冗長化されており、世界中に約550台以上のサーバが分散配置されている。

この冗長化により、特定のサーバにアクセスが集中することを防いでいる。

ルートDNSサーバの具体的な配置場所は、**root-servers** で確認できる。
このサイトを見ると、日本にあるルートDNSサーバは東京に13台、大阪に5台、福岡に1台あることがわかります(2024年12月現在)。

https://root-servers.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596363/2c0fbcbd-4356-e407-0ec1-0b28f26ae832.png)

#### IP anycastによるルーティング

DNSではIP anycastというネットワーク技術を利用し、問い合わせを地理的に最も近いルートDNSサーバに振り分ける。
その結果、ルートDNSサーバへの問い合わせを複数のルートDNSサーバへ分散させ、負荷分散を行う。

これらの方法によって、ルートDNSサーバへの問い合わせに対し効率的な負荷分散を実現する。

## まとめ

DNSの仕組みと負荷分散手法についてまとめ記事でした。
ドメイン名の階層構造による分散管理や、サーバを物理的に分散配置することで膨大なトラフィックの処理を実現できていることがわかりました。

お疲れ様でした。
以上でDNSについての記事は終了です。