Blog
本記事の目的
ドメインからIPアドレスを解析する仕組みについて学びます。
また、なぜIPアドレスに解析しないといけないのか(ドメイン名のままでリクエストを投げてはいけない理由)、
そしてなぜドメインが必要なのかについてもおさえていきます!
ドメインからIPアドレスを取得
ブラウザでURLを打ち込んだとき、以下のような仕組みでページを表示します。
1. ブラウザがリゾルバ(OS内のソケットライブラリ)を利用し、DNSサーバーにIPアドレスを問い合わせる
ブラウザは、入力されたURLに基づいて最初にDNS(Domain Name System)を使ってそのドメイン名に対応するIPアドレスを問い合わせます。
2. 取得したIPアドレスをもとに、ブラウザがサーバーと接続する
DNSサーバーからIPアドレスを取得した後、ブラウザはそのIPアドレスを使って目的のWebサーバーにTCP接続を確立します・
3. サーバーがHTTPリクエストを受け取り、レスポンスを返す
ブラウザはレスポンスを受け取り、画面を秒はします。
ざっくりとこんな感じの流れです。
この1の工程でIPアドレスを取得しないと、そもそもどこにリクエストを送ればいいかわかりません。
で、早速その仕組みなのですが、
まず、ブラウザはリゾルバを使ってDNSサーバーにドメイン名に対応するIPアドレスを問い合わせます。リゾルバは、ローカルDNSキャッシュをチェックして、すでに問い合わせたことがあるIPアドレスがキャッシュに存在すれば、再度問い合わせることなくそのIPを返します。もしキャッシュにない場合、リゾルバは最寄りのDNSサーバーに問い合わせを行います。
↓
DNSサーバーは、ドメイン名(例えば j-nagano.tech)を受け取ると、そのドメイン名に関連するIPアドレスを調べます。もしその情報を知らない場合、他の上位DNSサーバーに問い合わせを行い、最終的に正しいIPアドレスを得るまで問い合わせが行われます。成功すると、そのIPアドレスをブラウザに返します。
具体的には。。
① 最寄りのDNSサーバーに、「j-nagano.tech」って知ってる?と聞く
② 知っている場合はIPアドレスを返してもらい、知らない場合は③に進みます。
③ 全てのDNSサーバーには「ルートドメイン」のDNSサーバーの情報が登録されているので、最寄りのDNSサーバーはルートドメインのDNSサーバーに転送します。
④ ルートドメインには、j-nagano.tech は存在しないが、.tech ドメインに関する情報は持っています。※
⑤ そのため、「.tech ドメインの情報を持っているDNSサーバーに聞いてくれ」と最寄りのDNSサーバーは返します。
⑥ その後、最寄りのDNSサーバーは、.tech ドメインに関連するDNSサーバー(例えば、ns1.tech)に問い合わせを送ります。
⑦ .tech ドメインを管理するDNSサーバーが、「j-nagano.tech」のIPアドレスを返すと、最寄りのDNSサーバーがそのIPアドレスを受け取ります。
⑧ 最寄りのDNSサーバーは、最初のリゾルバ(ブラウザ)にそのIPアドレスを返し、ブラウザが目的のサーバーに接続できるようになります。
※ .com .jp .techなどは「トップレベルドメイン(TLD)」と呼ばれ、これらはルートDNSサーバーに登録されています。
この流れで、DNSリゾルバはドメイン名をIPアドレスに解決するために、複数のDNSサーバーを順番にたどり、最終的に正しいIPアドレスをブラウザに返します。
ちなみにDNSサーバーは一度調べたドメインはキャッシュする仕組みがあるので、次回以降最寄りのDNSサーバーはキャッシュからIPアドレスを返します。
URL指定をドメイン名じゃなくIPアドレスにすれば↑のような面倒くさい工程不要なのでは?
こういった疑問も確かに出てきます。実際に、ドメイン名ではなくIPアドレスでアクセスすることは可能です。しかし、これを電話帳に例えると分かりやすいかもしれません。
電話帳に載っている名前(ドメイン名)を使って、相手の電話番号(IPアドレス)を調べるのがDNSの役割です。もし、最初から相手の電話番号(IPアドレス)を知っていれば、電話帳を調べる必要はありません。確かに、IPアドレスだけでアクセスすることはできますが、以下の理由でドメイン名が使われることが一般的です。
1. IPアドレスは覚えにくい(見栄えもわるい)
IPアドレスは数字の羅列であり、例えば「192.168.1.1」のように書かれます。これを覚えるのは非常に難しく、実際に多くのサイトやサービスでは、ユーザーにとって覚えやすい名前(ドメイン名)を使うことで利便性を向上させています。
2. IPアドレスが変更されても影響を受けない
ドメイン名を使うことで、万が一IPアドレスが変更されても、ユーザーはその変更を意識することなくアクセスし続けることができます。
サーバーのIPアドレスが変更されても、ドメイン名を通じて再度IPアドレスを調べるため、ユーザーが新しいIPアドレスを覚える必要はありません。一方で、IPアドレスでアクセスしている場合、変更があればその都度新しいIPアドレスを知らないといけません。
こんな感じで、ドメイン名を使うことで利便性が向上するというのが大きな点かと思います。
※あと、SSL/TLS証明書もIPアドレスからだと一手間いるんでしょうか
IPアドレスはやめてドメイン名で通信できたら解決するのでは?!
確かに、ドメイン名を直接使って通信できたらDNSの仕組みも使わず便利に思えますが、実際にはそれは現実的ではありません。
まず、IPアドレスは32ビット(4バイト)のデータ量しかないです。ところがどっこい、ドメイン名は数十バイト、下手したら数百バイトいきます。
この32ビットで済んでいた通信が、数十バイト、数百バイトになるとどうなるか。
通信機器の負担が大きくなり、ネットワーク通信は非常に遅くなってしまいます。
仮にルーターが今以上に性能があがっても、すごい非効率的ですよね。。
そのため、DNSを使ってドメイン名をIPアドレスに変換し、効率的に通信を行う仕組みが必要というわけです!
終わり
普段の実装では全く意識しない部分だったので、改めて学ぶことができて良かったです:)
それでは、ここまでお付き合いいただきありがとうございました!
CONTACT
あくまでも本業がメインですが、休日や業務の隙間時間は個人でも動いております。
もしお手伝いできることがあれば、お気軽にお問い合わせください。