通信相手がルータの向こうにいるとどうやって知ったのか?
前回の話でルータを介した通信の場合、端末はEthernetフレームの宛先をルータのMACアドレスにする、ということがわかった。
ではいったい端末はどうやって通信相手がルータの向こうにいるとわかったのだろう?
この謎を解くためにはIPアドレスの構造を理解する必要がある。
今回はIPアドレスの構造について理解していくぞ
IPアドレスの構造
まずIPアドレスの構造を理解しよう。IPアドレスは32ビットの数値。バイト数でいうと4バイト。MACアドレスよりもサイズ的には小さい。とはいえこの32ビットを十進数で表現すると気が狂いそうになるので普通はバイト(8ビット)毎にドットで区切って表現するよ。たとえば以下のような感じ。この数字のパターンみたことあるよね。
このようにIPアドレスをドットで区切って十進数で表現することを、"dotted decimal notation"というよ。これは人間が見やすいようにしただけで、コンピュータ的にはドットの区切りには何の意味もない。端末は単に32ビットの数値としか見ていない。
パケットキャプチャーでIPアドレスを確認した場合は16進数で表されているぞ
ネットワークアドレス部とホストアドレス部
実はここだけの話、32ビットのIPアドレスはネットワークアドレス部とホストアドレス部に分けて考える必要がある。例えば、ネットワークアドレス部を24ビットとすると、のこりの8ビットをホストアドレス部にできる。以下の図はネットワークアドレス部を24ビットとした場合のIPアドレスの一例。
ブルーの部分がネットワークアドレス部でオレンジの部分がホストアドレス部。ネットワークアドレス部の長さはサブネットマスクで指定された長さになる。この例ではサブネットマスクが24bitなので、上から24bit分がネットワークアドレス部になる。残りがホストアドレス部。サブネットマスクの値は端末のインタフェースのそれぞれに設定された値を参照する。つまりIPアドレスだけをみてもネットワークアドレス部の長さはわからない。
ネットワークアドレス部の長さを表現する方法として、以下の2パターンが存在する。以下の二つの例はどちらもネットワークアドレス部が192.168.70.0、ホストアドレス部が1を表している。
アドレスの最後にスラッシュを付加し、その後ろにマスク長を付加
192.168.70.1/24
IPアドレスの後にネットマスクをdotted decimalで付加
192.168.70.1 255.255.255.0
上記の記述方法はルータや端末の設定にもよく出てくるので両方覚えておこう。
端末へのIPアドレス設定例
以下はWindows11でのEthernetインタフェースの設定画面だけど、ほら、あるでしょ。サブネットマスクの欄。ゲートウェイとはルータのこと。
このトピックでは解説しないけど、2進数を10進数にする知識は絶対覚えておこう
ホストアドレス部の大きさはどうやってきめるの?
ホストアドレス部のサイズによってそのネットワークに接続できる端末の数も決まる。たとえば、/24 (255.255.255.0)の場合、ホストアドレス部は8bitあるので、0〜255までの256通りの数字が用意できる。
このうち、全部が0であるパターンと全部が1であるパターンは特定の役割が与えられており、端末に設定することができない。
例えば、192.168.70.0/24の場合、
192.168.70.1-254までの値を端末に設定することができる。
なのでそのセグメントに254台までの端末を接続するという条件であれば、ホスト部は8bitで十分だ。
ではもし255台以上のホストアドレスがほしい場合はどうするか? これはホスト部を増やす。例えばサブネットマスクを/23として、ホスト部を9bitにする。この場合、
192.168.70.1 - 192.168.71.254までのアドレスが使える。つまり510台。
ここで注意してほしいのは、ネットワークアドレス部が23bitということは3バイト目の最後のbitがホストアドレスにかかっている。この場合、dotted decimalで表記すると面倒なことになる。たとえば192.168.70.0/23の設定では192.168.70.1も192.168.71.1も同じネットワークアドレス部を持っていることになるし、192.168.71.0はホストアドレスとして使える。どうだめんどくさいだろう?
/24の場合はちょうど4バイトからホストアドレス部になるため、最後のドットの前までがネットワークアドレス部、と直感的にわかる。また同じセグメントに多量の端末を接続するのはパフォーマンスの低下を招く。そのためdotted decimalと相性の良い/24は254台という手頃な端末数であることも相まって人々に愛され続けており自由にアドレスを付与できる場合はサブネットマスクといえば255.255.255.0なことが多い。
ただし実際のネットワークデザインにおいては、使用できるIPアドレスのレンジが自由ではないことが多い。なので/25とか/26とかのネットマスクを使うことも普通にある。IPアドレッシングについてはネットワーク全体の大きさと割り当て可能なネットワークアドレスの分量によってキチンと設計しないと破綻する非常に繊細な問題なのだが、とりあえず最初は上記の知識でOK。
ネットワークアドレスの付け方
さてIPアドレスにおけるネットワークアドレス部とホストアドレス部の関係がわかったと思う。じゃあつぎに簡単なネットワークのアドレスをデザインしてみよう。
ネットワークアドレスは同じL2セグメントの端末すべてが共有する。もっと簡単に言うと、同じルータのインターフェースを使用する端末たちはすべて同じネットワークアドレスを使う必要がある。もちろんホストアドレス部はすべての端末で異なる必要がある。
以下の図を見てほしい。
まず設計方針として、左側のセグメント(L2セグメント1)のネットワークアドレスは"192.168.70.0/24"、右側(L2セグメント2)のネットワークアドレスは"192.168.71.0/24"という前提。
ルータ
ルータのインターフェースに設定するIPアドレスはネットワークアドレスがそれぞれ異なる必要がある。なので左側のセグメント(L2セグメント1)のネットワークアドレスは"192.168.70.0/24"、右側(L2セグメント2)のネットワークアドレスは"192.168.71.0/24"という設計にする。
ルータのアドレスとして254をホストアドレスとすることにしよう。なのでL2セグメント1に接続するインターフェースのIPアドレスを192.168.70.254、L2セグメント2に接続するインターフェースのIPアドレスを192.168.71.254としている。
スイッチ
スイッチには(そのスイッチ自体にログインするための管理用アドレスを除いて)IPアドレスを振らない。スイッチはレイヤ2で動作しているため、EthernetフレームつまりMACアドレスしか見ない。言い換えるとスイッチはIP端末からその存在が見えない。スイッチの動作についてはまた今度ゆっくり話そう。ちなみにレイヤ3スイッチというのは動作的にはルータ。
端末
L2セグメント1に接続されている端末はそれぞれネットワークアドレス部を192.168.70.0/24としてホストアドレス部を設定する。当然同じアドレスは使えないのでそれぞれ異なるアドレスにする。L2セグメント2は192.168.71.0/24をネットワークアドレスとして設定。
以下の点に気がついたら上出来。
- ルータのインタフェースの数だけネットワークアドレスが必要になる
- ルータはインタフェース毎にIPアドレスを付与する必要がある
- ネットワークアドレスの境界はルータになる
- ルータはブロードキャストドメインを分割する
- 同じネットワークアドレスを付与された範囲はブロードキャストドメインも同じになる
- つまりL2セグメント毎にIPネットワークアドレスを割り当てる必要がある
- すなわち宛先が異なるネットワークアドレスであればブロードキャストドメインが違うのでARPを送ることができない
上記を踏まえると以下の事実が浮き上がってくる。
- 端末は自分と同じネットワークアドレスを持つ端末にはARPが通るのでEthernetで直接通信できる
- 異なるネットワークアドレスを持つ端末への通信はルータを経由して通信せざるを得ない
上記はかなり冗長な説明だけど、3 × 2 = 6がわかるということは6 ÷ 3 = 2、6 ÷ 2 = 3であることも同時に理解できるのと同じことなのでどれに対しても「そりゃそうだよね」といえるようになってれば満点。
ホスト部の割り当て可能な最後の数値をルータに割り当てるのはよくあるケース
まとめ:通信相手がルータの向こうにいるとどうやって知ったのか?
はい今回の結論。もうわかるよね。それは通信相手のIPアドレスから判断できる。相手のIPネットワークアドレスが自分と異なればそれは相手がルータの向こうに存在することになる。なので端末は宛先のMACアドレスをルータに指定してパケットを送信するというわけだ。
厳密に言うと端末はルートテーブルを見て次に送信すべき宛先がルータなのか端末を特定する。例えばWindows11の場合、"route print"でその割り当てを確認できる。
Windows11
C:\Users\seaslug>route print
===========================================================================
インターフェイス一覧
13...00 0c 29 00 00 01 ......Intel(R) 82574L Gigabit Network Connection
1...........................Software Loopback Interface 1
===========================================================================
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.70.254 192.168.70.1 281
127.0.0.0 255.0.0.0 リンク上 127.0.0.1 331
127.0.0.1 255.255.255.255 リンク上 127.0.0.1 331
127.255.255.255 255.255.255.255 リンク上 127.0.0.1 331
192.168.70.0 255.255.255.0 リンク上 192.168.70.1 281
192.168.70.1 255.255.255.255 リンク上 192.168.70.1 281
192.168.70.255 255.255.255.255 リンク上 192.168.70.1 281
224.0.0.0 240.0.0.0 リンク上 127.0.0.1 331
224.0.0.0 240.0.0.0 リンク上 192.168.70.1 281
255.255.255.255 255.255.255.255 リンク上 127.0.0.1 331
255.255.255.255 255.255.255.255 リンク上 192.168.70.1 281
===========================================================================
固定ルート:
ネットワーク アドレス ネットマスク ゲートウェイ アドレス メトリック
0.0.0.0 0.0.0.0 192.168.70.254 既定
ルートは最も長いマスクでマッチしたネットワーク宛先が採用される。例えば仮に宛先が123.123.123.123だったとして、ルートテーブルに以下の二つのエントリーがある場合、論理的にはどちらもマッチしている。ただし、より長くマッチしているのは2行目の方なのでこちらが採用される。これをロンゲストマッチングという。
123.123.0.0 255.255.0.0 (マスクの長さが16bit)
123.123.123.0 255.255.255.0 (マスクの長さが24bit)
12行目の様にネットワーク宛先が0.0.0.0でネットマスクが0.0.0.0ということは、もっとも短いマスク(というより0だ)なのでどの宛先でもマッチする。ただし長さは最短なので論理上、「ルートテーブル内のどのエントリーにもマッチしない」宛先の場合に採用される。ほら。それがデフォルトゲートウエイじゃないですか。その場合、ゲートウェイである192.168.70.254にパケットは送られる。
上記の例の場合、宛先0.0.0.0/0.0.0.0以外のエントリーのゲートウェイは「リンク上」となっている。この場合、端末がARPを発行して相手のMACアドレスを入手し、ダイレクトにEthernetでフレームをなげつける。上記の場合、宛先0.0.0.0/0.0.0.0以外のエントリーのゲートウェイは「リンク上」となっている。この場合、端末がARPを発行して相手のMACアドレスを入手し、ダイレクトにEthernetでフレームをなげつける。
実際にはIPアドレスの種類やルーティングなど考慮すべき点は多いがまずはこのへんにしておこう