🎈

(簡易版)オレオレARPを実装してみた話2 -インターネットって何?(座学)-

に公開

前回までの話

https://zenn.dev/tatwatan/articles/a1611bdc9a5fc2

ひとつ前の記事では、実際にARP(あーぷ)を実装していくうえでの基礎となる ”プロトコル” についての理解を深めていきました。
今回の記事では、 "Address" "Resolution" "Protocol"『”アドレス解決(Address Resolution)”』 の部分について知るために、インターネットとは何なのか、を理解していきましょう。

例えば、
『インターネットって何?』ってITに疎いおじいちゃんやおばあちゃんから聞かれたとして、簡単&正しく説明できる人ってどのくらいいるんでしょうか?

実のところ、ネットワークとインターネットがそれぞれ何を指しているのかを曖昧にしてきた人も少なくないんじゃないでしょうか。(自分もそうでした✋)

今回は、インターネットはなにか、その仕組みを理解するためにも必要なキーワードである、『LAN』,『WAN』,『ルーティング』 について掘り下げていきます。

LANについて

そもそも、極端に言えば、 2台のコンピュータがケーブルでつながっていれば、それだけでもネットワークになります。 (当たり前のように聞こえるかもしれませんが笑、)

ここでいうネットワークとは、「複数の機器が互いに通信できるようにつながっている状態」 のことです。

そして、そのような 比較的せまい範囲で構成されたネットワーク のことを、
Local Area Network、略して LAN と呼びます。

たとえば、

  • 家の中のWi-Fi
  • 学校や会社の同じフロアのネットワーク
  • 同じルーターにつながっているPCやスマホ同士

などは、典型的なLANです。


そして、手紙と同様、通信を行う際には、相手の識別子(宛先)もしくは返信用に自身の識別子(差出人)を記入する必要がありますよね。

その識別子のことを MACアドレス と呼びます。

参考:【図解】Ethernetの仕組み〜LANとの違い, MACアドレスの構成, フレーム構造やタイプについて〜

そして一般的に、コンピュータとコンピュータ間でのやりとりには、上記のような EthernetFrame(イーサネットフレーム) という書式が用いられます。(これもプロトコルの一種です。OSI参照モデルでいうところのデータリンク層(Layer2)です。)

ざっくりしたイメージとしては、「封筒=Ethernet Frame」「手紙=データ」 の関係にあると言えます。

さらに、(L2)スイッチという機器を用いれば、Ethernet Frameを中継させることができ、より大きな一つのネットワーク(LAN)をつくることができます。

参考:スイッチってどう選ぶの?各スイッチの役割を解説

L2スイッチは、フレームに書かれた MACアドレスを見て、「どの機器に届けるべきか」を判断しながら転送します。

ここまでの流れを一度整理すると、

  • (個々の比較的せまい)ネットワーク=LAN
  • LANの中で通信をするためには、MACアドレス(識別子)が必要。
  • データのやり取りにはEthernet Frameという書式で行われる。

一方で、ひとつのL2スイッチ配下にすべてのコンピュータを接続するにも限界がありますよね。
→ じゃあ、ひとつの大きなLANを作るのではなく、 複数の小さなネットワーク同士をつなげちゃえばいいじゃん!

WANについて

ということで今度は、分割された、一つ一つのLANを合体!させて、一つの巨大なネットワークの集合体を作り、より広い範囲で通信できる仕組みを考えていきます。

これを、インターネット(『インター(相互につながれた・間)』+『ネット(LAN)』)
と呼びます!このとき、各ネットワーク同士を接続する機器が ”ルーター” です

つまり、インターネットとは、世界中のコンピュータが1本の線で直接つながっているものではなく、たくさんのネットワーク同士が接続された「ネットワークのネットワーク」 なのです。

※LANと対比させて、これを WAN(Wide Area Network) と言います。

そして、普段よく目にする IPアドレス というのは、WAN(インターネット)上での識別子を指しています。


はい、ここで一旦落ち着いて考えましょう。__
皆さんの言いたいことは分かります。 『え。さっきやったMACアドレスとIPアドレスって何が違うの??🤔』 ってことですよね?(笑)

ここではあえて言い切りませんが、次のルーティングの仕組みを追っていく中で感覚をつかんでもらえればと思います。

また先ほど、MACアドレスはOSI参照モデルでいうところの データリンク層(Layer2) のプロトコルであると述べましたが、IPアドレスというのは ネットワーク層(Layer3) のプロトコルにあたります。

この ”2階層” のアドレスの意義についても併せて考えていきましょう。

小まとめ:

  • インターネット=LANの集合体 → WANと呼ぶ。
  • LANを相互接続する機器が『ルーター』。
  • インターネット(WAN)上の識別子をIPアドレスという。

ルーティングについて

まず、今回一番覚えてほしいことは、『相手のIPアドレスが分かれば、インターネットを介して通信できる』 ということです。

なぜなのでしょうか?
ここでは、上の図を参考に、コンピュータ間でメッセージが送られるまでの過程を見ていきます。


シチュエーション:
コンピュータA

IPアドレス:10.0.0.2
MACアドレス:xx:xx:xx:xx:xx:02

が、(宛先)のコンピュータ(不明)

IPアドレス:10.0.1.3
MACアドレス:不明

にメッセージを送ろうとしています。


  1. コンピュータAはまず、宛先 10.0.1.3 が自分と同じLANにいる(直接繋がれた)相手なのか、それとも別のネットワークにいる相手なのかを判断します。

ここで重要になるのが、 IPアドレスとサブネットマスク です。

まず、IPアドレスの割り当て方法には次のような特徴があります。


参考:IPv4アドレスの構成 – ④予約されているIPアドレス

例えば、コンピュータAの所属しているLANに割り振られているIPアドレス帯が 10.0.0.1 ~ 10.0.0.255 であるとき、コンピュータAは、10.0.0.0/24のネットワークに属していると言えます。(→ そのうちAに割り当てられたのは、10.0.0.2という訳です。)
※ この/24を サブネットマスク(CIDR表記) と呼びます。

では、宛先のコンピュータが存在するIPアドレス10.0.1.3というのは、どうでしょう。
→ 10.0.0.1 ~ 10.0.0.255 の範囲外ですね。
どうやら、コンピュータAの所属しているLAN(10.0.0.0/24)とは別のネットワークに存在しているようです。

つまりAは、

「この宛先には、直接届けられない ___

と判断します。


  1. 今回は10.0.1.3は別ネットワークにいるため、Aは直接宛先へ送るのではなく、まずは自分の属するLANの出口である デフォルトゲートウェイ にデータを渡す必要があります。

デフォルトゲートウェイとは、
「別のネットワークにある相手へデータを送りたいとき、とりあえず最初に渡す相手」
のことです。(なにかに困ったら、最初に相談する友達というイメージです。)

家庭のネットワークでいえば、普段使っているルーターがその役割を担っていることが多いです。

つまりAは、

  • 宛先IPアドレスとしては10.0.1.3を意識しつつ、
  • 実際に最初の一歩としてEthernet Frameを渡す相手は、同じネットワーク(LAN)内にいる、ルーター。

という動きをします。

__ちなみに、大抵、コンピュータがあるLANに接続されたとき、IPアドレスの何番にデフォルトゲートウェイがあるかを知らされています。

では、さっそくルーターに、『別のLANにいる10.0.1.3に贈り物をしたいんだけど...』って聞いてみましょう!
どうやら、ルーター1(デフォルトゲートウェイ)は、10.0.0.1にいるようです。

ルータ1
IPアドレス:10.0.0.1
MACアドレス:不明


  • ここでちょっと復習です。もし、宛先のコンピュータが 同じLAN のなかにあるとわかった時はどうなるのでしょうか。
    → 同じLAN内で接続されたコンピュータ同士はMACアドレスで識別され、相手のMACアドレスを指定することで、 通信が可能になるんでしたよね?

ですが....!
ルーターのIPアドレスは知っていても、まだ、MACアドレスを知りません!

__ここで、登場するのが ARP です。__

ARPは、
「このIPアドレスを持っている機器のMACアドレスを教えてください」
とLAN内で問い合わせるためのプロトコルです。

今回で言えば、AはLAN内にいるすべての機器に向けて

「`10.0.0.1` (デフォルトゲートウェイ)を持っている機器はいますか?  
いたら、あなたのMACアドレスを教えてください。」

という問い合わせ(ARP Request)を送ります。

すると、そのIPアドレスを持つルーターだけが

「はい、私です。MACアドレスは `xx:xx:xx:xx:xx:01` です。」

と返事(ARP Reply)をします。

ここで、前回の記事で出てきた問いを回収しておきましょう。

「アドレス解決」ってなんだよ!

という話でしたが、まさにこれがアドレス解決です。

つまりARPにおけるアドレス解決とは、

「IPアドレスから、同じLAN内で実際にEthernet Frameを渡すためのMACアドレスを調べる(解決する)こと」

でした。

10.0.0.1 というIPアドレスだけでは、Ethernet Frameの宛先は書けません。
そこでARPを使って、10.0.0.1 に対応するMACアドレス xx:xx:xx:xx:xx:01 を調べていたわけです。

こうしてAは、ルーターのMACアドレスを知ることができ、
ようやくEthernet Frame の宛先を書けるようになります。

※ ただし、毎回通信のたびに同じARP問い合わせをしていたら非効率ですよね。

そのため、コンピュータは一度調べた
「IPアドレス ↔ MACアドレス」
の対応関係を、 ARPテーブル(ARPキャッシュ) としてしばらく保存しておきます。

たとえば、Aの中には次のような情報が保存されます。

IPアドレス MACアドレス
10.0.0.1 xx:xx:xx:xx:xx:01

電話帳に、電話番号に対応して→名前を記録しておくようなものですね。

こうして、次回からは毎回ARP Requestを送らなくても、すぐにルーター宛てのEthernet Frameを組み立てられるようになりました。😊


(休憩)ここまでのあらすじ

(宛先)のコンピュータ(不明)

IPアドレス:10.0.1.3
MACアドレス:不明

にメッセージを送りたいコンピュータAは、宛先のコンピュータが同じLANにいないことを知り、インターネットの窓口であるデフォルトゲートウェイ(10.0.0.1)に送信を依頼することにしましたが、MACアドレスがわからなかったので、まずはMACアドレスを問い合わせてみました。

ARP Requestを送った結果、
ルーター1(デフォルトゲートウェイ)

IPアドレス:10.0.0.1
MACアドレス:xx:xx:xx:xx:xx:01

は、上記のようなMACアドレスを持っていることが分かりました。

ではさっそく、MACアドレスxx:xx:xx:xx:xx:01に向けて、送信依頼を書いていきましょう!


  1. コンピュータAは、ルーター1(デフォルトゲートウェイ)のMACアドレス宛てに Ethernet Frame を作成し、その中に最終的には 10.0.1.3 に届けてほしい」というIPパケットを入れて送信します。

「いつもお世話になっております。ルーター1(MAC:xx:xx:xx:xx:xx:01)さん、
 IP:10.0.0.2にいる、MAC:xx:xx:xx:xx:xx:02と申します。
 どなたかは存じ上げないのですが、10.0.1.3にいる方にこちらのIPパケットを送りたいのですが、
  お願いしてもいいでしょうか...」

すると、陽キャなルーター1はどうやら知り合いが多いようで、

「おk!友達のルーター2ってやつがその場所にいるやつ知ってたって言ってたかも!聞いてみるわ!」

と二つ返事で依頼を引き受けてくれました。

なぜルーター1は、ここで「ルーター2に聞いてみよう」と判断できたのでしょうか?

実はルーターは、普段から
「この方面に行きたいなら、次はこの相手に渡せばよい」
という対応表を持っています。

これを ルーティングテーブル と呼びます。

友達関係でたとえるなら、ルーティングテーブルは、

「〇〇方面に詳しい友達リスト」

のようなものです。

たとえば、ルーター1の中には、ざっくり次のような情報が入っていると考えられます。

行きたい方面(宛先ネットワーク) 次に相談する相手
10.0.1.0/24 ルーター2
それ以外 いつもの出口

つまり、ルーター1はIPパケットの宛先である 10.0.1.3 を見て、

あ、これは 10.0.1.x 方面の話だな。
その方面なら、ルーター2が詳しかったはず。

と判断したわけです。

このように、ルーターがIPアドレスを見て、
「次にどこへ渡すか」
を決めながらパケットを転送していくことを ルーティング と呼びます。


  1. ということでルーター1は、さっそく友達のルーター2にIPパケットを渡します。

普段からよく話している、ルーター2のMACアドレスは、すでにARPテーブルに記録してあったので、ルーター1はルーター2にすぐにこう言いました。

「ちょっとごめん、10.0.0.1のルーター1(xx:xx:xx:xx:xx:01)なんだけどさ。
 さっき、10.0.1.3 にこのIPパケットを届けたいって相談を受けたんだけど、
 たしか君、その方面に詳しかったよね?これ代わりに渡しておいてもらってもいい?」

すると、ルーター2は、

その場所に住んでるやつなら、自分と直接面識あったはず!ちょっと問い合わせてみるわ!

そういうと、ルーター2はLAN(10.0.1.0/24)にいるすべての機器に向けて、このIPアドレス持ってる人誰だっけ?とARPリクエストを送ります。

すると、

それ自分です!自分にそのパケットください!

というような返事がコンピュータB(MAC: zz:zz:zz:zz:zz:03)から返ってきました。
どうやら、コンピュータAが届けたかった10.0.1.3にいる人というのはコンピュータBのことだったようでした。

(宛先)のコンピュータB

IPアドレス:10.0.1.3
MACアドレス:zz:zz:zz:zz:zz:03

  1. ルーター2は、コンピュータBのMACアドレス宛てにEthernet Frameを作成し、その中にIPパケットを入れて送信します。
「コンピュータB(MAC:zz:zz:zz:zz:zz:03)さん、
 10.0.1.3宛てのお届け物です!」

こうして、最初はコンピュータAから送られたIPパケットが、
最終的にコンピュータBへ届きました。🎉

ここで重要なのは、

IPアドレスとMACアドレスは、それぞれ役割が違う

という点です。

お気づきだったでしょうか?
実は今回、コンピュータAが渡したかったIPパケットの最終目的地である 10.0.1.3 というIPアドレスは、 最初から最後まで変わりませんでした。

一方で、Ethernet Frame の宛先MACアドレスは、

  • コンピュータA → ルーター1
  • ルーター1 → ルーター2
  • ルーター2 → コンピュータB

というように、LANをまたぐたびに変わっています。

つまり、

  • IPアドレス = 最終的に届けたい相手
  • MACアドレス = 今このLAN内で、次に直接渡す相手

という役割分担になっているわけです。

まとめ:ARPの役割

あらためて、今回のストーリーの全体像を見てみましょう!

このように2階層のプロトコルになっていることで、たとえ自分が直接知らない場所(LAN)にいる相手であっても、IPパケットはWANの海を越えて届いていきます。

コンピュータAは、コンピュータBのMACアドレスを最初から知っていたわけではありません。

それでも、まずは同じLAN内のデフォルトゲートウェイに渡し、ルーターたちがIPアドレスを手がかりに次の相手へバトンをつないでいくことで、最終的に目的地までたどり着けるわけです。

__ 少し不思議ですよね。

「直接の知り合いではない相手にも、住所(IPアドレス)さえ分かっていれば、知り合いの知り合いをたどるようにして届けられる」

これが、インターネットが「ネットワークのネットワーク」として動いている面白さだと思います。

そして、そのバトンを同じLAN内で渡すたびに必要になるのが アドレス解決 であり、それを実現する技術(プロトコル)が ARP です。

つまりARPは、IPパケットがWANの海を越えていくための、LAN内の小さなバトン渡しを支える仕組みだったのです。
(少し、かっこつけすぎたでしょうか笑。けど、自分が最初にこの仕組みを知った時と同じぐらいの感動と熱量が皆様にも伝わればと思っています!)

前回の記事に引き続き、ご愛読してくださった方はありがとうございます。
今回の記事で、インターネット(LANとWANの違い)とそのうえでどんな技術が動いているのかその仕組みについて理解できたかと思います。

では次回はいよいよ、実際にARPパケットを自分の手で組み立てながら、ARPを実装していきます!🚀

参考図書


体験しながら学ぶ ネットワーク技術入門(みやた ひろし:著者)


図解入門TCP/IP 第2版(みやた ひろし:著者)

株式会社PoliPoli

Discussion