---
title: IPv6 プロトコル
url: https://doc.liz6.com/ja/networking/02-l3-network-layer/02-ipv6-protocol
locale: ja
area: networking
tags:
- IPv6
- extension header
- SLAAC
- RA
- RS
- DAD
- privacy extensions
- Dual Stack
- NAT64
- DNS64
- networking
- l3-network-layer
date: 2026-06-30
modified: 2026-07-16
description: 128ビットアドレスがNATの支配を終焉させた――SLAACによる自動設定、簡素化された固定長ヘッダー、ネイティブIPsecサポート。IPv6を理解することは、単に「アドレスが長くなった」ことではなく、その近隣発見およびアドレス自動設定モデルがIPv4と全く異なることを意味する。
---

# IPv6 プロトコル

> 128ビットアドレスがNATの支配を終焉させた――SLAACによる自動設定、簡素化された固定長ヘッダー、ネイティブIPsecサポート。IPv6を理解することは、単に「アドレスが長くなった」ことではなく、その近隣発見およびアドレス自動設定モデルがIPv4と全く異なることを意味する。

## 概要

IPv6はIPv4の後継プロトコルであり、1998年にRFC 2460で定義され（2017年にRFC 8200へ更新）、128ビットアドレス（43億から3.4×10³⁸へ）、固定40バイトのヘッダー（オプションのオーバーヘッドなし、チェックサムなし）、ネイティブセキュリティ（IPsecサポート）、ステートレスアドレス自動設定（SLAAC）といった核心的な改善が行われた。現在のグローバルなIPv6展開率は約40〜50%だが、モバイルネットワーク（4G/5G）や大規模クラウドプロバイダーでは広く使用されている。移行期は長期化し、Dual-StackやNAT64/DNS64などの併用技術が存在し続ける。

## IPv6ヘッダー: 40バイト、固定

```
 0                   1                   2                   3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|Traffic Class|           Flow Label                    |
|  (4)  |   (8 bits)  |          (20 bits)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|        Payload Length         |  Next Header  |   Hop Limit   |
|        (16 bits, ≥0)          |   (8 bits)    |    (8 bits)   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Source Address                         |
|                         (128 bits)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Destination Address                      |
|                         (128 bits)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```

IPv4ヘッダーとの主な違い:

```
削除された項目:
  IHL:           なし → ヘッダーは固定40バイト
  ヘッダーチェックサム: なし → L2 CRCとL4チェックサムで十分、ホップごとのチェックサム再計算は非効率
  Identification/Flags/フラグメントオフセット: なし → エンドポイントでのフラグメンテーション（IPv6におけるPMTUD）
  オプション:      拡張ヘッダーへ移動

追加された項目:
  Flow Label: 20ビット → フローをマーキング（ECMPハッシュやQoSに主に使用）
  Next Header: Protocolに取って代わる → ただし拡張ヘッダーチェーンを指すことも可能

維持された項目:
  Traffic Class ≈ DSCP + ECN
  Hop Limit ≈ TTL
```

### Flow Label

20ビットの擬似ランダムなマーキングで、送信側によって選択され、同一フロー内のすべてのパケットで同一となる。設計目標は、ルーターやスイッチがL4ポート（IPsec ESPで暗号化されている可能性がある）を解析する必要なく、Flow Labelと送信元/宛先IPのみでフローを区別できるようにすることである。

実装例: Linuxでは `skb->hash` を使用してランダムなFlow Labelを生成する（`net.ipv6.auto_flowlabels=1`）— TCP接続ごとに1つ。

### Next Headerと拡張ヘッダーチェーン

```
基本構造:
  Next Header = 6 (TCP) → TCPヘッダーを直接指す

拡張ヘッダーチェーン:
  IPv6ヘッダー (Next Header=0, Hop-by-Hop)
    → Hop-by-Hop Optionsヘッダー (Next Header=43, Routing)
      → Routingヘッダー (Next Header=44, Fragment)
        → Fragmentヘッダー (Next Header=6, TCP)
          → TCPヘッダー + データ

各拡張ヘッダー(EH)の形式:
  [Next Header (1バイト)] [Hdr Ext Len (1バイト)] [オプション (可変長)]
  → 8バイト境界にアラインメントが必要

EHの順序 (RFC 8200):
  1. Hop-by-Hop Options (タイプ0)
  2. Destination Options (タイプ60) — 中間宛先での処理用
  3. Routing (タイプ43)
  4. Fragment (タイプ44)
  5. Authentication Header (AH, タイプ51)
  6. Encapsulating Security Payload (ESP, タイプ50)
  7. Destination Options (タイプ60) — 最終宛先での処理用
  8. 上位層プロトコル (TCP=6, UDP=17, ICMPv6=58)

セキュリティ: RH0 (タイプ0 Routingヘッダー) は廃止済み — ソースルーティングはDDoS増幅攻撃に利用可能
     (攻撃者: パケット → ホストA → ホストB → ホストA → ... 無限ループ)
```

### IPv6フラグメンテーション（エンドポイントのみ）

IPv6はIPv4とは異なり、ルーターはフラグメンテーションを行わない（IPv6ではDFビットは常に1）。リンクサイズを超えるパケットは、ルーターによって破棄され、ICMPv6 Packet Too Big（タイプ2、コード0）が送信される。

エンドポイントはフラグメント拡張ヘッダーを使用する:
```
[フラグメントEH: Next Header=6, Reserved, フラグメントオフセット, Mフラグ, 識別子]
[元のパケットのフラグメント: オフセットから開始]
```

## SLAACの詳細

### アドレス生成フロー

```
1. インターフェースアップ → リンクローカルアドレスを生成: fe80::/64 + IID

2. DAD: リンクローカルアドレスの一意性を検証 → 成功 → tentative → preferred

3. RS (ルーター索引用):
   ICMPv6 タイプ133, src=:: (未指定) または リンクローカル, dst=ff02::2 (全ルーター)
   オプション: ソースリンク層アドレス（任意）

4. RA (ルーター広告):
   ICMPv6 タイプ134, src=ルーターのリンクローカル, dst=ユニキャスト (RSへの応答)
   含むオプション: プレフィックス情報, MTU, ソースリンク層アドレス

   プレフィックス情報オプション:
     タイプ=3, 長さ=4 (32バイト)
     プレフィックス長: (1バイト、通常は64)
     L (on-link): このプレフィックスは同じリンク上にある → 直接通信可能
     A (autonomous): このプレフィックスを使用してSLAACを行う
     有効期間 (Valid Lifetime): アドレスの有効期限 (UINT32_MAX ≈ 無限 または 具体的な値)
     優先期間 (Preferred Lifetime): アドレスの優先度 (有効期間以内)
     プレフィックス:  (16バイト)

5. グローバルユニキャストアドレスの生成:
   プレフィックスはRAから + IID（プライバシー拡張またはEUI-64由来）

6. グローバルアドレスに対するDAD再実行

7. RAでMフラグ（管理）が設定されている場合 → DHCPv6でDNS/NTPなどを追加取得
   RAでOフラグ（その他設定）が設定されている場合 → DHCPv6でDNSのみ取得（アドレスはSLAACを使用）
```

### プライバシー拡張 (RFC 8981)

```
恒久アドレス (EUI-64ベース):
  自動生成、安定、サーバーに適している

一時アドレス (ランダムIID):
  有効期間 ≤ 24時間 (短期)
  優先期間 ≤ 24時間 (さらに短い)
  周期性: 新しいランダムIID + 新しいIPを生成 → 古いIPを廃棄 → 古いIPを削除
  → 外向き接続には一時アドレス（プライバシー用）、内向き接続には恒久アドレス（到達性用）を使用

Linux:
  sysctl net.ipv6.conf.default.use_tempaddr=2  # 外向き接続には一時アドレスを優先
```

## 移行技術

| 技術 | 原理 | 使用例 |
|------|------|------|
| Dual Stack | IPv4とIPv6を同時に実行 | 理想的だが、IPv4アドレスの枯渇が必要 |
| DS-Lite | AFTRへのIPv4-in-IPv6トンネリング | ISPが提供 |
| NAT64 + DNS64 | IPv6のみのクライアントがIPv4サービスにアクセス | モバイルネットワーク（T-Mobile USなど） |
| 464XLAT | CLAT（クライアント翻訳）+ PLAT（プロバイダー翻訳） | プロバイダーレベルのNAT64 |

## 参考

- **RFC**: 8200 (IPv6), 4862 (SLAAC), 8201 (PMTUD), 8981, 4291 (アドレスアーキテクチャ)
- **ソースコード**: `net/ipv6/` ディレクトリ, `include/net/ipv6.h`

*キーワード: IPv6, 拡張ヘッダー, SLAAC, RA, RS, DAD, プライバシー拡張, Dual Stack, NAT64, DNS64*
