🎓 レベル:基礎 | 重要度:A(必須) 📎 前提:OSI参照モデルとTCP/IPモデル
要点(BLUF)
- IPv4アドレスは32ビットを8ビットずつ4つに区切り、10進で
192.168.1.10のように書きます(ドット10進)。 - アドレスはネットワーク部(どのネットワークか)とホスト部(その中のどの機器か)に分かれ、その境界を示すのがサブネットマスクです。
- 一部は用途が予約され、特にプライベートアドレス(社内用)と公開アドレス(インターネット用)の区別が重要です。
ビットとドット10進
32ビットを2進で書くと長いので、8ビット(=1オクテット、0〜255)ごとに10進へ変換して並べます。
import ipaddress
ip = ipaddress.IPv4Address("192.168.1.10")
print("decimal :", str(ip))
print("binary :", format(int(ip), "032b"))
実行結果:
decimal : 192.168.1.10
binary : 11000000101010000000000100001010
各オクテット 11000000=192 10101000=168 00000001=1 00001010=10 に対応します。
ネットワーク部とホスト部・マスク
アドレス単体では「どこまでがネットワークか」が分かりません。そこでサブネットマスク(連続する1の並び)で境界を示します。
- マスク
255.255.255.0(=/24):先頭24ビットがネットワーク、残り8ビットがホスト。 /24のように、先頭の1の個数で書くのがプレフィックス長(CIDR表記)。
graph LR N["ネットワーク部(192.168.1)"] H["ホスト部(.10)"] N --- H
同じネットワーク部を持つ機器同士は直接(ルータなしで)通信でき、異なればルータ経由になります。この判定こそIPの肝で、次トピックのサブネット計算につながります。
クラスフルアドレス(歴史的区分)
CIDR以前は、先頭ビットでネットワーク規模を固定していました。今は計算の前提知識として押さえます。
| クラス | 先頭 | 既定マスク | 範囲 | 用途 |
|---|---|---|---|---|
| A | 0 | /8 | 0.0.0.0〜127.255.255.255 | 大規模 |
| B | 10 | /16 | 128.0.0.0〜191.255.255.255 | 中規模 |
| C | 110 | /24 | 192.0.0.0〜223.255.255.255 | 小規模 |
| D | 1110 | — | 224.0.0.0〜239.255.255.255 | マルチキャスト |
| E | 1111 | — | 240.0.0.0〜255.255.255.255 | 実験用 |
現在は**クラスに縛られず任意長マスク(CIDR)**を使いますが、「192.x はもとはクラスC(/24)」という感覚は計算で役立ちます。
プライベートアドレスと特殊アドレス
インターネットで一意である必要があるのは公開アドレスだけ。社内はプライベートアドレスを自由に使い、外向きはNATで変換します(第7章)。
| 範囲 | プレフィックス | 用途 |
|---|---|---|
| 10.0.0.0 〜 10.255.255.255 | 10.0.0.0/8 | プライベート(大) |
| 172.16.0.0 〜 172.31.255.255 | 172.16.0.0/12 | プライベート(中) |
| 192.168.0.0 〜 192.168.255.255 | 192.168.0.0/16 | プライベート(小) |
| 127.0.0.0/8 | — | ループバック(自分自身) |
| 169.254.0.0/16 | — | リンクローカル(APIPA・DHCP失敗時) |
| 255.255.255.255 | — | 限定ブロードキャスト |
import ipaddress
for s in ["10.1.2.3", "192.168.0.5", "8.8.8.8", "169.254.10.1"]:
a = ipaddress.IPv4Address(s)
print(s, "private:", a.is_private, "global:", a.is_global)
実行結果:
10.1.2.3 private: True global: False
192.168.0.5 private: True global: False
8.8.8.8 private: False global: True
169.254.10.1 private: True global: False
なぜ階層アドレスなのか(設計の直観)
MAC(平坦)で世界中の経路を持つと、ルータは全機器のMACを覚える必要があり破綻します。IPは**ネットワーク部で束ねられる(集約できる)**ので、ルータは「このネットワークはあっち」とまとめて1行で扱えます。階層化=集約可能性が、地球規模のルーティングを成立させています。
⚠️ よくある誤解
- 「IPアドレスは機器に固有」ではない。MACは機器固有ですが、IPはつながる場所(ネットワーク)で変わる住所。引っ越せば変わります。
- 「169.254.x.x はDHCPで配られた」ではない。これはDHCP失敗時に自動付与されるAPIPA。出ていたらDHCP到達性を疑います。
- 「127.0.0.1 はネットワークに出る」ではない。ループバックは自分自身で折り返し、ケーブルに出ません。
対応 lab
[[networking-study/labs/03-01_ipv4_inspect.py]]— ドット10進/2進変換とprivate判定
関連
- 前:
[[01-02_OSI参照モデルとTCPIPモデル]]/次:[[03-02_サブネット化とCIDR]] - 公開と私設の橋渡し:
[[07-01_NAT_PAT]]/IPとMACの対応:[[03-04_ARPとICMP]]