弱者は決して許すことができない。許しは強者の態度である── ガンディー
ネットワーク

IPv6 には全員あてが無く、1 つのインターフェースが複数の住所を持つ

図 1〜5 の土台を 128 ビットの住所で描き直す。ブロードキャストが消え、ARP が NDP に替わり、PC が自分でアドレスを作る一方で、探し方と付け替え方は図 5 のまま変わらない

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークipv6ndpconcept
目次

図 1 から図 5 までで、もの、結びつき、通信フローの 3 層を IPv4 で組みました。図 20 では、同じ構成を 128 ビットの住所で描き直します。

10/24 の勉強会の予習なので、実機はまだ触っていません。素材は RFC と教科書サイトだけです。

変わるのは住所の長さだけではありません。全員あて(ブロードキャスト)が無くなり、ARP が NDP に替わり、1 つのインターフェースが複数のアドレスを持ちます。一方で、テーブルの探し方と MAC アドレスの付け替え方は図 5 のままです。

この連載は、ネットワークの言葉をもの(物理と論理)、結びつき(手動、自動、固定)、通信フロー(1 本の通信がこれらを順に通る流れ)の 3 層に置いています。

登場するもの

IPv6 アドレス

論理のもので、128 ビットです。16 ビットずつ 8 つに区切って 16 進で書きます。各ブロックの先頭の 0 は省略でき、連続する 0 のブロックは :: に縮められます。:: は 1 つのアドレスに 1 回だけ使えます。

種類は 4 つです。グローバルユニキャスト(2000::/3)、ユニークローカル(fc00::/7。組織の中だけで使う)、リンクローカル(fe80::/10。同じ線の中だけ)、マルチキャスト(ff00::/8)です。ブロードキャストは無く、その役目はマルチキャストが持ちます。

近隣キャッシュ

論理のもので、自動で育ちます。図 2 の ARP テーブルに当たる表です。これとは別に「外あての出口の一覧」を持ちます。IPv4 のデフォルトゲートウェイに当たるものです。

結びつき

インターフェースとリンクローカルの結びつきは自動です。インターフェースが使えるようになった時点で、fe80::/10 に後半(インターフェース ID)をつないで自分で作ります。使う前に重複していないかを確かめます(DAD)。

インターフェースとグローバルの結びつきは、ルータ広告(RA)の prefix に同じ後半をつないで自作するか(SLAAC)、手動で付けます。1 つのインターフェースが両方を同時に持ちます。

外あての出口とルータのリンクローカルの結びつきは自動で、RA の送信元アドレスを出口として覚えます。ルーティングテーブルの行と出口の結びつきは、自分のインターフェースの網が自動、その先が手動です。図 5 と同じです。

通信フロー

① PC-A はインターフェースが使えるようになった時点で、リンクローカル fe80::21a:2bff:fe00:a を自分で作ります。使う前に重複を確かめます。

② ルータ 1 が全ノードあて(ff02::1)にルータ広告を送ります。PC-A は prefix を受け取り、送信元 fe80::1 を外あての出口として覚えます。

③ PC-A は prefix 2001:db8:10::/64 に自分で作った後半をつないで、グローバルアドレスを作ります。これも重複を確かめてから使います。

④ 宛先 2001:db8:3::10 は自分の網の外なので、出口 fe80::1 へ送ります。その MAC アドレスは、近隣要請(要請ノードマルチキャストあて)と近隣広告(1 対 1)で引きます。

⑤ ルータ 1 はテーブルの手動の行でルータ 2 へ送ります。MAC アドレスを付け替え、ホップリミットを 1 減らします。

⑥ ルータ 2 はテーブルの自動の行で PC-C へ送ります。MAC アドレスを付け替え、ホップリミットをさらに 1 減らします。

要請ノードマルチキャストは、アドレスの下 24 ビットから作る宛先です。送る側は相手のアドレスから同じ計算で作ります。呼びかける範囲が「全員」から「下 24 ビットが一致する相手」に狭まりました。

近隣要請と近隣広告、ルータ要請とルータ広告は、いずれも ICMPv6 のメッセージです。つまり IPv6 パケットそのものです。図 2 で「ARP は IP パケットではない」と書いた点は、IPv6 では逆になります。

図 20

上が構成図とフローの矢印、その下にアドレスの種類、書き方、1 つのインターフェースが持つものと、2 台のルータのルーティングテーブルが並びます。いちばん下は各表の推移と、通信の中身の推移です。

IPv6:図 1〜5 の土台を、128 ビットの住所で描き直す 住所が長くなるだけではない。ブロードキャストが無くなり、ARP は NDP(マルチキャスト)に替わり、1 つの口が複数のアドレスを持つ PC-A MAC A アドレスは自分で作る スイッチ MAC で転送 ルータ 1 Gi0(支店側) Gi1(ルータ間) 口ごとにアドレス 2 つ Gi0 Gi1 ルータ 2 Gi0(ルータ間) Gi1(DC 側) 口ごとにアドレス 2 つ Gi0 Gi1 PC-C MAC C アドレスは手動 ルータ間 2001:db8:12::/64 支店 2001:db8:10::/64 DC 2001:db8:3::/64 行き A → C 4 5 6 1 PC-A が、まずリンクローカル fe80::21a:2bff:fe00:a を自分で作る(重複していないか確かめてから使う) 2 ルータ広告(RA):この線の prefix と「自分が出口」を、全ノードあて(ff02::1)に配る 3 PC-A が、受け取った prefix に自分で作った後半をつないでグローバルアドレスを作る(SLAAC) アドレスの種類 グローバルユニキャスト 2000::/3 ユニークローカル fc00::/7(組織の中だけ) リンクローカル fe80::/10(同じ線の中だけ) マルチキャスト ff00::/8(決めた相手だけ) ff02::1 全ノード/ff02::2 全ルータ ブロードキャストは無い(役目はマルチキャスト) 書き方(128 ビット・16 進) 16 ビットずつ 8 つに区切り、: でつなぐ 各ブロックの先頭の 0 は省略できる 連続する 0 のブロックは :: にできる :: は 1 つのアドレスに 1 回だけ 2001:0db8:0010:0000:… → 2001:db8:10::1 /64 は「前半 64 ビットが網の番地」の意味 1 つの口に複数のアドレス ルータ 1 の Gi0 が持つもの リンクローカル fe80::1 グローバル 2001:db8:10::1 聞いている先(マルチキャスト) ff02::1 全ノード・ff02::2 全ルータ ff02::1:ff00:1 要請ノード 要請ノードマルチキャストは、自分のアドレスの下 24 ビットから作って自分が聞いている先。送る側は相手のアドレスから同じ計算で作る(RFC 4291 2.7.1) ルータ 1 のルーティングテーブル(IPv6) 2001:db8:10::/64 → Gi0(自動) 2001:db8:12::/64 → Gi1(自動) 2001:db8:3::/64 → 2001:db8:12::2(手動) ⑤ がこの行を使う。探し方は図 5 とまったく同じ ルータ 2 のルーティングテーブル(IPv6) 2001:db8:12::/64 → Gi0(自動) 2001:db8:3::/64 → Gi1(自動) 2001:db8:10::/64 → 2001:db8:12::1(手動) 帰り道はこの行。行きと帰りが別々なのも図 5 と同じ フロー ① PC-A は口が使えるようになった時点で、リンクローカル fe80::21a:2bff:fe00:a を自分で作る。使う前に重複を確かめる(DAD) ② ルータ 1 が全ノードあて(ff02::1)にルータ広告を送る。PC-A は prefix を受け取り、送信元 fe80::1 を「外あての出口」として覚える ③ PC-A は prefix 2001:db8:10::/64 に自分で作った後半をつなぎ、グローバルアドレスを作る。これも重複を確かめてから使う ④ 宛先 2001:db8:3::10 は自分の網の外。出口 fe80::1 へ送る。その MAC は近隣要請(要請ノードあて)と近隣広告(1 対 1)で引く ⑤ ルータ 1 はテーブルの手動の行でルータ 2 へ。MAC を付け替え、ホップリミットを 1 減らす ⑥ ルータ 2 はテーブルの自動の行で PC-C へ。MAC を付け替え、ホップリミットをさらに 1 減らす。帰り道は図 5 の ④⑤⑥ と同じ形 図 1〜5 と、変わる点・変わらない点 変わる:全員あて(ブロードキャスト)が無い。ARP の代わりに NDP(近隣要請・近隣広告)を使い、宛先はマルチキャスト 変わる:1 つの口がリンクローカルとグローバルを両方持つ。外あての出口として使うのはルータのリンクローカル 変わる:PC は自分でアドレスを作れる(SLAAC)。IPv4 で DHCP に頼っていた部分を、ルータ広告と自作でまかなう *変わらない:スイッチは MAC で転送し、ルータは宛先アドレスをテーブルで探す。宛先・送信元は端から端まで変わらず、MAC だけ付け替わる 3 層で見ると もの:IPv6 アドレス(論理・128 ビット)/リンクローカル(論理・線の中だけ)/マルチキャストの宛先(論理)/近隣キャッシュ(論理・自動で育つ) 結びつき:口 ⇄ リンクローカル(自動で作る)/口 ⇄ グローバル(RA の prefix から自作=自動、または手動)/出口 ⇄ ルータのリンクローカル(RA から自動) フロー:図 5 の ①〜③ の前に「アドレスを用意する ①②③」が付き、ARP だった部分が NDP に替わる。②以降の探し方・付け替え方は図 5 と同じ 各テーブルの推移(○番のフローで追加された行。青字) 前提: PC-C は手動で 2001:db8:3::10 を設定。ルータのリンクローカル fe80::1/fe80::2 は手動で付けた(既定では自動で作られる) PC-A が持つアドレス ① 追加 fe80::21a:2bff:fe00:a(リンクローカル) ③ 追加 2001:db8:10:0:21a:2bff:fe00:a(グローバル)  後半(21a:2bff:fe00:a)は両方で同じもの PC-A: 外あての出口の一覧 ② 追加 fe80::1(RA の送信元) IPv4 の「デフォルトゲートウェイ」に当たる PC-A: 近隣キャッシュ ④ 追加 fe80::1 → MAC R1-Gi0(近隣広告から) 図 2 の ARP テーブルに当たる ルータ 1: 近隣キャッシュ ④ 追加 fe80::21a:2bff:fe00:a → MAC A  (近隣要請を受けて覚える) ⑤ 追加 2001:db8:12::2 → MAC R2-Gi0 ルータ 2: 近隣キャッシュ ⑤ 追加 2001:db8:12::1 → MAC R1-Gi1 ⑥ 追加 2001:db8:3::10 → MAC C ルーティングテーブル ルータ 1・ルータ 2 とも上の図の箱のとおり IPv6 の表は IPv4 の表とは別に持つ 通信の中身の推移(フローごとのフレーム/パケット) ② ルータ 1 → 全ノード:ルータ広告(RA) 宛先 MAC(マルチキャスト) 33:33:00:00:00:01 送信元 MAC MAC R1-Gi0 宛先 IPv6 ff02::1 送信元 IPv6 fe80::1 ホップリミット 255 データ ルータ広告 NS/NA・RS/RA は ICMPv6 のメッセージ=IPv6 パケットそのもの(ARP が IP パケットではなかったのとは違う) ③ PC-A の中 受け取った prefix 2001:db8:10::/64 に、自分の MAC から作った後半をつないで 2001:db8:10:0:21a:2bff:fe00:a にする。使う前に、同じものを使っている相手がいないか近隣要請で確かめる(DAD) ④ PC-A → ルータ 1:近隣要請(NS。相手の MAC を聞く) 宛先 MAC(マルチキャスト) 33:33:ff:00:00:01 送信元 MAC MAC A 宛先 IPv6 ff02::1:ff00:1 送信元 IPv6 fe80::21a:2bff:fe00:a ホップリミット 255 データ 近隣要請 宛先は「fe80::1 の下 24 ビットから作った要請ノードマルチキャスト」。全員あてではなく、当てはまる相手だけが受け取る ④ ルータ 1 → PC-A:近隣広告(NA。1 対 1 で返す) 宛先 MAC MAC A 送信元 MAC MAC R1-Gi0 宛先 IPv6 fe80::21a:2bff:fe00:a 送信元 IPv6 fe80::1 ホップリミット 255 データ 近隣広告 ④ PC-A → ルータ 1(本番) 宛先 MAC MAC R1-Gi0 送信元 MAC MAC A 宛先 IPv6 2001:db8:3::10 送信元 IPv6 2001:db8:10:0:21a:2bff:fe00:a ホップリミット 64 データ ping フレーム=全部。ただしスイッチが見るのは MAC とタグの部分だけ パケット=この部分。ルータはここ(IP)を見る ⑤ ルータ 1 → ルータ 2(MAC を付け替え・ホップリミットが 1 減る) 宛先 MAC MAC R2-Gi0 送信元 MAC MAC R1-Gi1 宛先 IPv6 2001:db8:3::10 送信元 IPv6 2001:db8:10:0:21a:2bff:fe00:a ホップリミット 63 データ ping ⑥ ルータ 2 → PC-C(MAC を付け替え・さらに 1 減る) 宛先 MAC MAC C 送信元 MAC MAC R2-Gi1 宛先 IPv6 2001:db8:3::10 送信元 IPv6 2001:db8:10:0:21a:2bff:fe00:a ホップリミット 62 データ ping IPv6 ヘッダは 40 バイト固定。IPv4 と違ってチェックサムの欄が無く、途中のルータはパケットを分割しない(分割するのは送信元だけ)(RFC 8200 3・4.5) 宛先 IPv6・送信元 IPv6 は端から端まで変わらない。MAC はルータを越えるたびに付け替わり、ホップリミットだけが 1 ずつ減る(図 5 と同じ考え方) IPv6 マルチキャストあてのフレームの宛先 MAC は 33:33 で始まり、後ろにアドレスの下 32 ビットが入る(RFC 2464 7)。要請ノードのアドレスを作るときの下 24 ビットとは別の話 NDP のメッセージはホップリミット 255 で送り、受け取った側も 255 かを確かめる。ルータを越えて来たものは受け付けない(RFC 4861 4.1〜4.3・7.1.1) ホップリミットの初期値は、ルータ広告の欄(Cur Hop Limit)で配られた値をホストが使う。0 なら「指定なし」で自身の既定値。この図は 64 の例(RFC 4861 4.2・6.3.4) PC-A の後半は EUI-64(MAC の真ん中に FFFE を挟む)で作った例。リンクローカルもグローバルも同じ後半になる ただし今の既定は EUI-64 ではない。MAC を埋め込まない方式(RFC 7217)を既定にすべきとされ、MAC を埋め込む方式は既定として非推奨(RFC 8064 3) 本図のアドレスはすべて説明用の 2001:db8::/32(RFC 3849)。種類と表記は RFC 4291、NDP は RFC 4861、自作は RFC 4862、86DD は RFC 2464 3 による グローバルユニキャストの 2000::/3 は RFC 4291 2.4 には無い(そこは「それ以外すべて」)。IANA が現在割り当てている範囲で、RFC 3587 2・3 と IANA の登録簿による ## 図 1・図 2・図 5・図 7 との接続

図 1 の「ルータは自分のインターフェースの網の行を自動で持つ」は、そのまま成り立ちます。図 5 の「テーブルで一致する行を探す」「MAC アドレスを付け替える」「宛先と送信元は端から端まで変わらない」も同じです。IPv6 の表は IPv4 の表とは別に持ちます。

図 2 の ARP が NDP に替わり、要求のブロードキャストが近隣要請のマルチキャストになります。図 5 の「PC は宛先が網の外ならデフォルトゲートウェイへ」も変わりませんが、その出口の書き方がルータのリンクローカルになります。

図 7 の 3 つの問題は、IPv6 にしても解けません。アドレスが足りるので NAT(図 8)の出番は減りますが、途中のルータの経路を書けないことと、中身が読めることは別の話です。

未検証・注意

  • PC-A の後半(インターフェース ID)は EUI-64 で作った形にしています。MAC アドレス 00:1a:2b:00:00:0a の真ん中に FFFE を挟んだ 21a:2bff:fe00:a で、リンクローカルもグローバルも同じ後半です。ただし EUI-64 は現在の既定ではありません。RFC 8064 §3 は RFC 7217 の方式を既定にすべきとし、リンク層アドレスを埋め込む方式は既定として使うべきでない(SHOULD NOT)としています(RFC 4291 を含む 14 本を更新)。
  • グローバルユニキャストの 2000::/3 は、RFC 4291 §2.4 の表には出てきません。そこは「(everything else)」とだけ書かれています。この記事では出典を RFC 3587 §2・§3(現在 IANA が委譲しているのは 2000::/3)と IANA の登録簿にしています。
  • ホップリミットの初期値はルータ広告が配ります。Cur Hop Limit に入った値をホストが既定として使い、0 なら「このルータは指定しない」の意味です(RFC 4861 4.2・6.3.4)。図の 64 は一例です。
  • ルータのリンクローカルを fe80::1 と fe80::2 と手動で付けた形にしています。既定では自動で作られます。
  • 2001:db8:10::/64 のような「2001:db8: の後に 10」は説明用の割り当て方で、実運用でのサブネット ID の切り方とは別の話です。本図のアドレスはすべて 2001:db8::/32(RFC 3849)の中です。
  • DHCPv6(ステートフル)には触れていません。ルータ広告の M と O のフラグで DHCPv6 を併用する形は、DHCP を扱った図 17 の側で見るのが自然です。
  • IPv6 の表と IPv4 の表を別に持つことに 1 行触れただけで、切り替えの方式(トンネル、変換)は扱っていません。

出典

関連

この記事の校閲記録

誰が・いつ・どの版の・どの段落を・何の観点で見て、何と言ったかを全件そのまま出す(追記のみ・削除しない)。

段落 35 のうち出典つき 11・出典なし 24

v1 2 件
  • AIAI (claude-fable-5) が AI 確認未解決

    出典 13 件を WebFetch で取得して確認した。IPv6 にブロードキャストが無いこと、:: が 1 つのアドレスに 1 回だけであること、リンクローカル FE80::/10、要請ノードマルチキャストと FF02::1・FF02::2 は RFC 4291 で確認した。NDP が ARP とルータ探索とリダイレクトをまとめたものであること、ルータを指すのにリンクローカルを使うこと、Cur Hop Limit の 0 が指定なしであること、RS 133・RA 134・NS 135・NA 136 がホップリミット 255 で送られ受信側も 255 を確かめること、近隣キャッシュは RFC 4861 で確認した。リンクローカルを先に作りその後 RA の prefix でグローバルを作ること、重複検出、RS で RA を催促することは RFC 4862 で確認した。ヘッダ 40 オクテット固定とホップリミットが転送のたびに 1 減ること、分割するのは送信元だけであることは RFC 8200 で確認した。Ethernet の種類の欄 86DD とマルチキャストが 33-33 で始まる MAC に写ることは RFC 2464 で確認した。FC00::/7 が組織の中だけで外へ広告しないことは RFC 4193、2001:DB8::/32 が説明用であることは RFC 3849 で確認した。グローバルユニキャストの 2000::/3 について、RFC 4291 §2.4 の表は『(everything else)』とだけ書いており 2000::/3 の記載が無いことを原文で確認したため、出典を RFC 3587 §2・§3 と IANA の登録簿にした。EUI-64 が現在の既定ではないこと(RFC 8064 §3 の SHOULD NOT と、RFC 4291 を含む 14 本を更新すること)と、代わりに既定とされる RFC 7217 も確認した。この記事は 10/24 の勉強会の予習で、実機の観察は含まない。ホップリミットの 64 が一例であること、ルータのリンクローカルを手動で付けた形にしたこと、DHCPv6 とデュアルスタックの切り替え方式を扱っていないことは未検証・注意に明記した。校正チェックリストを全項目回し、図の『口』を本文ではインターフェースに直した。守秘検査(人名、社名、会場名、地名、連絡先の機械検査)で該当なし

  • AIAI (claude-fable-5) が 編集未解決

    公開前の校閲。「この 20 本目」を「図 20」に直した。連載の 3 層の型を再掲する 1 文が無く、この記事だけを開いた人に型が渡らないので、図 17〜19 と同じ文を導入の末尾に足した。関連を、図 8〜16 と同じ形に揃え、前の記事(図 19)と次の記事(図 21)への行と /notes/ のパスを足した。2000::/3 が RFC 4291 §2.4 の表に無いことを注で断り、出典を RFC 3587 と IANA にしている点、リンクローカルが EUI-64 と揃っている点は図と一致しているので、修正していない。

参考文献

更新履歴

  • 連載のトピックを「ネットワーク基礎」から「ネットワーク」へ改名(32 本+目次。slug と URL は不変)
  • 公開: 連載「ネットワーク基礎」図 8〜24 の記事 17 本と目次の更新

機械可読の記録