🌐
ネットワーク層(IP)詳解
IPアドレス・サブネット・ルーティング・ICMP・NATを徹底解説。「どこへ届けるか」を担う層の全機能。
ネットワーク層の責務
データリンク層が「隣のホップへの配送」を担うのに対し、ネットワーク層はエンドツーエンド(送信元から最終宛先まで)の経路制御を担う。
┌──────────────────────────────────────────────────────┐
│ ネットワーク層(Layer 3) │
│ 責務:エンドツーエンドのパケット転送 │
│ 主なプロトコル:IP, ICMP, ARP(実装上の位置はここ) │
│ 識別子:IPアドレス │
│ 単位:パケット │
└──────────────────────────────────────────────────────┘
ベストエフォート型:IPは「できる限り届ける」が、届ける保証はしない。順序保証・再送もしない。それらはトランスポート層(TCP)の役割。
IPアドレスの構造
IPv4アドレス(32ビット)
IPアドレス:192.168.1.100
↓ 2進数で表すと
11000000.10101000.00000001.01100100
┌──────────────────────────────────┐
│ 32ビット全体 │
│ ネットワーク部 │ ホスト部 │
│ (どのネットワーク) │ (そのPC識別) │
└──────────────────────────────────┘
CIDR(Classless Inter-Domain Routing)
192.168.1.0/24 の /24 はサブネットマスクのビット数。
/24 の意味:先頭24ビットがネットワーク部
IPアドレス: 192.168.1.100
11000000.10101000.00000001.01100100
サブネットマスク:11111111.11111111.11111111.00000000 = 255.255.255.0
└────────────────────────┘└────────┘
ネットワーク部 ホスト部
(192.168.1) (100)
ネットワークアドレス(ホスト部=0): 192.168.1.0
ブロードキャストアドレス(ホスト部=全1): 192.168.1.255
使用可能ホスト数: 2^8 - 2 = 254台(0と255は特殊用途)
CIDR早見表
| CIDR | サブネットマスク | ホスト数 | 用途例 |
|---|---|---|---|
| /8 | 255.0.0.0 | 16,777,214 | 大規模ネットワーク(旧クラスA) |
| /16 | 255.255.0.0 | 65,534 | 中規模ネットワーク |
| /24 | 255.255.255.0 | 254 | 一般的なLAN |
| /25 | 255.255.255.128 | 126 | LANの分割 |
| /28 | 255.255.255.240 | 14 | 小規模セグメント |
| /30 | 255.255.255.252 | 2 | ルーター間のリンク |
| /32 | 255.255.255.255 | 1 | ホストルート・ループバック |
プライベートアドレス空間
インターネットに直接ルーティングされない、LAN内専用のアドレス(RFC 1918)。
| 範囲 | CIDR | 用途 |
|---|---|---|
| 10.0.0.0 〜 10.255.255.255 | 10.0.0.0/8 | 大規模LAN、クラウドVPC |
| 172.16.0.0 〜 172.31.255.255 | 172.16.0.0/12 | 中規模LAN、Dockerデフォルト |
| 192.168.0.0 〜 192.168.255.255 | 192.168.0.0/16 | 家庭・小規模オフィスLAN |
その他特殊なアドレス:
127.0.0.1/8(ループバック):自分自身169.254.0.0/16(リンクローカル):DHCPが失敗した時のOS自動割り当て0.0.0.0/0(デフォルトルート):「どこへでも」を意味するルーティング表現
IPv4ヘッダの全フィールド
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─────────────┼──────────────────────────────────────────┤
│Ver│IHL│ DSCP/ECN │ Total Length │
├──────────────────────┼───┼─┼────────────────────────────────────┤
│ Identification │Flg│DF│ Fragment Offset │
├──────────────────────┼─────────────────────────────────────────┤
│ TTL │ Protocol │ Header Checksum │
├─────────────────────────────────────────────────────────────────┤
│ Source IP Address │
├─────────────────────────────────────────────────────────────────┤
│ Destination IP Address │
└─────────────────────────────────────────────────────────────────┘
| フィールド | ビット | 説明 |
|---|---|---|
| Version | 4 | IPv4=4, IPv6=6 |
| IHL | 4 | ヘッダ長(32bit単位)。通常5=20バイト |
| DSCP/ECN | 8 | QoS優先度・輻輳通知 |
| Total Length | 16 | IPパケット全体の長さ(ヘッダ+ペイロード) |
| Identification | 16 | フラグメント時の識別子(同じIDのフラグメントを再結合) |
| Flags | 3 | bit1=DF(フラグメント禁止), bit2=MF(後続フラグメントあり) |
| Fragment Offset | 13 | フラグメントの開始位置(8バイト単位) |
| TTL | 8 | ホップ通過ごとに-1。0になるとルーターが廃棄しICMP送信 |
| Protocol | 8 | TCP=6, UDP=17, ICMP=1 |
| Header Checksum | 16 | ヘッダのチェックサム(ペイロードは対象外) |
| Source IP | 32 | 送信元IPアドレス |
| Destination IP | 32 | 宛先IPアドレス |
フラグメンテーション
MTU(通常1500バイト)を超えるパケットはIPレベルで分割される。
元パケット(4000バイトのデータ + 20バイトIPヘッダ = 4020バイト)
↓ MTU=1500 のネットワークを通過
Fragment 1: offset=0, len=1480バイト, MF=1(後続あり)
Fragment 2: offset=185, len=1480バイト, MF=1(8バイト×185=1480)
Fragment 3: offset=370, len=1040バイト, MF=0(最後)
DF(Don’t Fragment)ビット:このビットが立っているとルーターはフラグメントせず廃棄しICMP(Type3 Code4)を返す。TCP は通常DFビットを立ててPath MTU Discoveryを行う。
ルーティング:パケットの経路決定
ルーティングテーブルの読み方
# Linuxでのルーティングテーブル表示
ip route show
# 出力例
default via 192.168.1.1 dev eth0 proto static
10.0.0.0/8 via 10.0.0.1 dev eth1 proto static
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
ルーティングテーブルの構造:
┌──────────────────┬─────────────────┬───────────┬────────┐
│ 宛先ネットワーク │ ネクストホップ │ 出力 I/F │ メトリック│
├──────────────────┼─────────────────┼───────────┼────────┤
│ 0.0.0.0/0 │ 192.168.1.1 │ eth0 │ 100 │ ← デフォルトルート
│ 10.0.0.0/8 │ 10.0.0.1 │ eth1 │ 50 │
│ 192.168.1.0/24 │ 直結 │ eth0 │ 0 │ ← 直接接続
└──────────────────┴─────────────────┴───────────┴────────┘
最長一致(Longest Prefix Match)
宛先IPに対して、最もプレフィックスが長い(具体的な)エントリが優先される。
宛先IP: 10.10.20.5 の場合
エントリ候補:
0.0.0.0/0 → 一致(0ビット一致)
10.0.0.0/8 → 一致(8ビット一致)
10.10.0.0/16 → 一致(16ビット一致)
10.10.20.0/24 → 一致(24ビット一致)← 最長一致。これを使う
「より具体的なルートが優先される」という原則。
動的ルーティングプロトコル
| プロトコル | 種別 | 用途 |
|---|---|---|
| RIP | ディスタンスベクタ | 小規模(使われなくなっている) |
| OSPF | リンクステート | 企業内ネットワーク(IGP) |
| BGP | パスベクタ | インターネットバックボーン(EGP) |
エンジニアが実務で意識するのは主にBGP(クラウドプロバイダとの接続)とOSPF(オンプレ内ルーティング)。
ICMP:ネットワーク層の制御メッセージ
ICMPはIPの補助プロトコルで、エラー通知・診断に使われる。
ICMPパケット = IPヘッダ(Protocol=1)+ ICMPヘッダ + データ
主要なICMPメッセージ
| Type | Code | 意味 | 用途 |
|---|---|---|---|
| 0 | 0 | Echo Reply | pingの応答 |
| 3 | 0 | Dest Unreachable: Net | 宛先ネットワーク到達不可 |
| 3 | 1 | Dest Unreachable: Host | 宛先ホスト到達不可 |
| 3 | 3 | Dest Unreachable: Port | ポートが開いていない(UDP) |
| 3 | 4 | Dest Unreachable: Frag needed | Path MTU Discovery |
| 8 | 0 | Echo Request | pingの送信 |
| 11 | 0 | Time Exceeded | TTL切れ(tracerouteが利用) |
| 12 | 0 | Parameter Problem | ヘッダ不正 |
ping と traceroute の仕組み
# ping の動作
ping 8.8.8.8
# 1. ICMP Echo Request(Type8)を送信
# 2. 宛先から ICMP Echo Reply(Type0)が返る
# 3. RTT(往復時間)を計測
# traceroute の動作
traceroute 8.8.8.8
# TTL=1 でパケット送信 → 最初のルーターで TTL切れ → ICMP Time Exceeded(Type11)受信 → 1ホップ目のIPアドレス判明
# TTL=2 でパケット送信 → 2ホップ目で TTL切れ → 2ホップ目のIP判明
# ...最終宛先まで繰り返す
NAT/NAPT:プライベートアドレスでインターネット接続
IPv4アドレスの枯渇対策として、多くの環境でNAT(Network Address Translation)が使われる。
NAPT(IPマスカレード)の動作
【送信時(内→外)】
LAN内PC (192.168.1.10:54321) → Internet (203.0.113.5:443)
NATルーターの変換テーブル:
┌─────────────────────┬──────────────────────┬──────────────────────┐
│ 内部 (src IP:port) │ 外部 (変換後 IP:port) │ 宛先 (dst IP:port) │
├─────────────────────┼──────────────────────┼──────────────────────┤
│ 192.168.1.10:54321 │ 1.2.3.4:40001 │ 203.0.113.5:443 │
│ 192.168.1.20:54322 │ 1.2.3.4:40002 │ 203.0.113.5:443 │
└─────────────────────┴──────────────────────┴──────────────────────┘
↑ 複数の内部IPが1つのグローバルIPを共有(ポート番号で識別)
【受信時(外→内)】
Internet (203.0.113.5:443) → NATルーター (1.2.3.4:40001)
→ テーブルから 40001 = 192.168.1.10:54321 を逆引き
→ 192.168.1.10:54321 へ転送
NATの問題点とエンジニアへの影響
問題1:サーバーとしての動作が難しい
→ 外部からの着信接続はNATテーブルにエントリがないと転送先不明
→ 対策:ポートフォワーディング(特定ポートを内部ホストに固定転送)
問題2:アプリケーションがIPアドレスをペイロードに埋め込む
→ SIPなどのプロトコルはIPをアプリデータ内に書く → NATが書き換えられない
→ 対策:ALG(Application Layer Gateway)でペイロードも書き換え
問題3:接続追跡テーブルのメモリ
→ 高接続数サーバーでは「conntrack: table full」エラー
→ sysctl net.netfilter.nf_conntrack_max で調整
ルーティング実践:ip コマンドチートシート
# ルーティングテーブル確認
ip route show
ip route show table all # 全ルーティングテーブル
# 特定宛先の経路確認(どのインターフェースを使うか)
ip route get 8.8.8.8
# 出力例: 8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.10
# 静的ルートの追加
ip route add 10.0.0.0/8 via 192.168.2.1 dev eth1
# 静的ルートの削除
ip route del 10.0.0.0/8
# インターフェースのIPアドレス確認
ip addr show
# NATテーブルの確認(conntrack)
conntrack -L
conntrack -s 192.168.1.10 # 特定IPのセッション
ネットワーク診断フロー
接続できない!→
1. ip addr show → 自分のIPが正しく設定されているか
2. ip route show → デフォルトゲートウェイが設定されているか
3. ping <ゲートウェイIP> → L3レベルでGWに届くか
4. ping 8.8.8.8 → インターネットへのL3疎通
5. ping google.com → DNS解決は別問題(L7)
6. traceroute 8.8.8.8 → どのホップで詰まっているか - 1. 📡TCP/IPパケット通信の全過程
- 2. 🔌物理層・データリンク層詳解
- 3. 🌐ネットワーク層(IP)詳解
出典: TCP/IP入門・図解入門