第3回は、IPアドレスと、異なるネットワークへデータを届ける仕組みについて学んだ。第2回のMACアドレスが同じL2ネットワーク内の転送に使われるのに対し、IPアドレスはネットワークを越えた通信の宛先を表す。
IPとIPアドレス
IP(Internet Protocol)は、IPアドレスを使ってパケットを宛先へ運ぶためのプロトコルだ。TCP/IPではインターネット層、OSI参照モデルではネットワーク層にあたる。
IPv4アドレスは32ビットで、8ビットずつ4つに分け、192.168.1.1 のように10進数で表す。各部分の値は0から255までだ。32ビットで表せる組み合わせは約43億個あるが、すべてを一般の端末に割り当てられるわけではない。
IPv4パケットのヘッダには、送信元と宛先のIPアドレスのほか、パケットの長さや上位プロトコルの種類などが入る。TTLはパケットが転送されるたびに減らされ、通常はルータを通過するごとに1減る。TTLが0になるとパケットは破棄されるため、経路を回り続けるパケットを抑えられる。
宛先の種類
IP通信の宛先は、送る相手の範囲によって分けられる。
- ユニキャスト:特定の1つの宛先に送る。
- ブロードキャスト:同じネットワーク内の全ホストに向けて送る。IPv4で使われる。
- マルチキャスト:特定のグループに参加している複数の宛先に送る。
IPv4のマルチキャストには 224.0.0.0/4 の範囲が使われる。IPv6ではブロードキャストを使わず、マルチキャストなどを利用する。
CIDRとサブネットマスク
IPアドレスだけを見ても、どこまでが同じネットワークに属するのかは分からない。そこで、IPv4アドレスの32ビットを「ネットワークを表す部分」と「その中のホストを表す部分」に分ける。
/24 は何を表すのか
192.168.123.10/24 という表記を例にする。スラッシュの後ろの 24 はプレフィックス長と呼ばれ、先頭から24ビットがネットワーク部分であることを表す。残りの8ビットがホスト部分だ。
IPv4アドレスは、ドットで区切られたそれぞれが8ビットなので、/24 では次のように分かれる。
192.168.123 | 10
ネットワーク部分 | ホスト部分
24ビット | 8ビット
この例では、192.168.123 がネットワーク部分、最後の 10 がホスト部分にあたる。192.168.123.20/24 もネットワーク部分が同じなので、同じサブネットのアドレスだ。一方、192.168.124.20/24 はネットワーク部分が異なる。
CIDR(Classless Inter-Domain Routing)は、クラスに依存せずプレフィックスを使ってアドレスを割り当て、経路を集約する仕組みだ。ここで扱っている「アドレス/プレフィックス長」という書き方をCIDR表記という。以前のクラスフルな方式ではクラスA、B、Cなどで区切りが決まっていたが、CIDRでは /24 以外の長さも指定できる。
サブネットマスクとの対応
サブネットマスクも、ネットワーク部分とホスト部分の境界を示す。ネットワーク部分のビットを 1、ホスト部分のビットを 0 にした32ビットの値だ。
/24 の場合は、先頭24ビットを 1、残り8ビットを 0 にする。これを8ビットずつ10進数に直すと 255.255.255.0 になる。
2進数: 11111111.11111111.11111111.00000000
10進数: 255. 255. 255. 0
つまり、192.168.123.10/24 と「IPアドレス 192.168.123.10、サブネットマスク 255.255.255.0」は、同じ境界を表している。
/24 に含まれるアドレス
192.168.123.10/24 のホスト部分は8ビットなので、取り得る組み合わせは 2^8 = 256 個だ。ネットワーク全体の範囲は 192.168.123.0/24 と表せる。
| 用途 | アドレス |
|---|---|
| ネットワークアドレス | 192.168.123.0 |
| 通常ホストに割り当てる範囲 |
192.168.123.1 〜 192.168.123.254
|
| ブロードキャストアドレス | 192.168.123.255 |
ネットワークアドレスはホスト部分がすべて 0 のアドレスで、そのサブネットを表す。ブロードキャストアドレスはホスト部分がすべて 1 のアドレスで、そのサブネット全体に向けた通信に使う。通常のIPv4サブネットではこの2つを除くため、上の例でホストに割り当てられる数は 256 - 2 = 254 個になる。
/26 でネットワークを小さく分ける
プレフィックス長を /24 から /26 にすると、ネットワーク部分が2ビット増え、ホスト部分は6ビットになる。その結果、1つのサブネットに含まれるアドレスは 2^6 = 64 個だ。/26 のサブネットマスクは 255.255.255.192 になる。
2進数: 11111111.11111111.11111111.11000000
10進数: 255. 255. 255. 192
たとえば 192.168.123.70/26 の場合、最後の部分の 70 は 64 〜 127 の範囲に入る。このサブネットは次のとおりだ。
- ネットワークアドレス:
192.168.123.64 - 通常ホストに割り当てる範囲:
192.168.123.65〜192.168.123.126(62個) - ブロードキャストアドレス:
192.168.123.127
/24 の 192.168.123.0 〜 192.168.123.255 を /26 に分けると、最後の部分が 0、64、128、192 から始まる4つのサブネットになる。プレフィックス長が長くなるほど、1つのサブネットに含まれるアドレスは少なくなる。
アドレス数から2を引く数え方には例外もある。たとえば /31 は、対応する機器間のポイントツーポイント接続で2つのアドレスを両端に割り当てられる。/32 は1つのアドレスを表す。
同じネットワークかどうかの判断
端末は自分のIPアドレスとサブネットマスクを使って、宛先が同じサブネットにあるか判断する。たとえば自分が 192.168.123.10/24 のとき、192.168.123.20 は同じサブネットなので直接届けようとする。192.168.124.20 は別のサブネットなので、通常はデフォルトゲートウェイに渡す。
ネットワーク部分を計算するには、IPアドレスとサブネットマスクの各ビットについて、両方が 1 の場合だけ結果を 1 にするAND演算を使ってネットワーク部分を取り出す。次の例では、最後の部分が 10 と 20 のどちらでも、マスクとのANDの結果は 0 になる。
192.168.123.10 AND 255.255.255.0 = 192.168.123.0
192.168.123.20 AND 255.255.255.0 = 192.168.123.0
192.168.124.20 AND 255.255.255.0 = 192.168.124.0
取り出したネットワーク部分を比べると、最初の2つは同じサブネット、3つ目は別のサブネットだと分かる。実際の転送先は端末のルーティングテーブルに従って決まるため、VPNや個別の経路設定がある場合は上の例と異なることもある。別ネットワークへ渡す際に使うMACアドレスについては、次のARPの話につながる。
ARPでMACアドレスを調べる
IPv4のEthernetネットワークでは、同じリンク上の相手へフレームを送るために、相手のIPアドレスに対応するMACアドレスが必要になる。これを調べる仕組みがARP(Address Resolution Protocol)だ。
たとえば、192.168.1.1 の端末が同じネットワークの 192.168.1.2 に送りたい場合、次のようにやり取りする。
- 送信元が
192.168.1.2のMACアドレスを尋ねるARPリクエストをブロードキャストする。 - 対象の端末が、自分のMACアドレスをARPリプライで返す。
- 送信元は得られた対応をARPキャッシュに保存し、フレームの宛先に使う。
宛先が別のネットワークにある場合、送信元がARPで調べるのは通常、最終的な宛先ではなくデフォルトゲートウェイのMACアドレスだ。IPパケットをゲートウェイへ渡し、そこから先はルータが転送する。IPv6ではARPの代わりに近隣探索の仕組みを使う。
macOSでは、次のコマンドでデフォルトゲートウェイとARPテーブルを確認できる。
route -n get default
arp -an
最初のコマンドで表示される gateway のIPv4アドレスと、ARPテーブルにあるアドレスを照らし合わせると、対応するMACアドレスを確認できる。ARPテーブルは通信の状況によって変化するため、確認時に該当する項目がない場合もある。
グローバルアドレスとプライベートアドレス
グローバルIPアドレスは、インターネット上での通信に使われるアドレスだ。アドレス資源は階層的に管理されており、地域ごとの管理組織やISPなどを通じて割り当てられる。
IPv4のプライベートアドレスには、次の3つの範囲がある。
| CIDR表記 | アドレスの範囲 |
|---|---|
10.0.0.0/8 |
10.0.0.0 〜 10.255.255.255
|
172.16.0.0/12 |
172.16.0.0 〜 172.31.255.255
|
192.168.0.0/16 |
192.168.0.0 〜 192.168.255.255
|
プライベートアドレスは家庭や組織の内部で使え、別々のネットワークで同じ値を利用できる。一方、インターネット上ではそのまま経路制御されない。なお、プライベートアドレス以外にも、ループバックなど特別な用途のアドレスがある。
たとえば端末のアドレスが 172.20.10.5/16 なら、172.16.0.0/12 の範囲に含まれるのでプライベートアドレスだ。ここでの /12 はプライベートアドレスとして予約された範囲を示し、端末の /16 は接続先で設定されたサブネットの大きさを示す。/16 のネットワークアドレスは 172.20.0.0 になる。
NATとNAPT
NAT(Network Address Translation)はIPアドレスを変換する仕組みだ。たとえば、ルータが内部のプライベートIPv4アドレスを外部向けのグローバルIPv4アドレスに変換する。変換の対応関係を保持し、戻ってきたパケットも元の宛先に合わせて変換する。
NAPT(Network Address Port Translation)は、IPアドレスに加えてポート番号も使って通信を区別する。たとえば複数の端末が同じグローバルIPv4アドレスを共有していても、ルータが変換後のポート番号を区別し、応答をそれぞれの端末に戻せる。
NATやNAPTを使っていても、公開設定やファイアウォールのルールは別に考える必要がある。どの通信を外部に許可するかを確認することが大切だ。
IPv6の表記とアドレス
IPv6アドレスは128ビットで、16ビットずつ8つに分けて16進数で表す。たとえば次のように書く。
2001:0db8:0ab0:0000:0000:1234:5678:0000
各ブロックの先頭の0は省略でき、連続する0だけのブロックは :: にまとめられる。ただし :: は、どこに何個の0が省略されたか判別できるよう、1つのアドレスで1回だけ使う。
2001:db8:ab0::1234:5678:0
IPv6のユニキャストアドレスには、インターネット上で使うグローバルユニキャスト、内部での利用を想定したユニークローカル、同じリンク内で使うリンクローカルなどがある。リンクローカルアドレスは fe80::/10 の範囲だ。
たとえば fe80::1%en0 のような表記では、%en0 は使用するインターフェイスを示すゾーン識別子で、IPv6アドレスそのものの128ビットには含まれない。同じリンクローカルアドレスの範囲を複数のインターフェイスで使えるため、どのリンクを使うかを区別する。
IPv6の基本ヘッダは40バイトで、送信元・宛先アドレス、次のヘッダの種類、Hop Limitなどを持つ。Hop LimitはIPv4のTTLと同様に、転送を続けられる範囲を制限する。
今回のまとめ
IPアドレスはネットワークを越えた通信の宛先を表し、CIDRとサブネットマスクはネットワークの範囲を示す。IPv4のEthernetでは、同じリンク上で次に渡す相手のMACアドレスをARPで調べる。プライベートIPv4アドレスから外部へ接続する際には、NATやNAPTが使われることもある。