Cisco / CCNA 200-301 v2.0

試験項目 1.4 · CCNA-019

IPv6 Address Representation

128 bit / Hextet / Hexadecimal / Leading Zero省略 / :: Zero Compression / RFC 5952 Canonical表記 / 展開 / 同一Address判定

このページのゴール

IPv6 Addressの128-bit hexadecimal表記を正しく読み、構文上有効な表記を識別するとともに、RFC 5952 Canonical形式への圧縮・展開を正確に行えるようにする。

このページで学ぶこと

  • IPv6 128-bit / Hextet Structure
  • Hexadecimal Hextet Validity
  • Leading Zero Suppression
  • Zero Compression
  • Double-Colon Validity
  • RFC 5952 Canonical Form
  • Address Expansion
  • Address Representation Equivalence

IPv6アドレスをトラブルシューティングするには、まずアドレスそのものを正確に読める必要があります。

IPv6では、同じ128ビットアドレスでも、

2001:0DB8:0000:0000:0000:0000:0000:0001
2001:db8:0:0:0:0:0:1
2001:db8::1

のように、見た目が異なる複数の表記が可能です。

この3つは、すべて同じIPv6アドレスを表します。

したがって、

文字列が違う
=
アドレスが違う

とは判断できません。

一方、

2001:db8::1::1

のように、構文上成立しない表記もあります。

ページ019では、

128ビット構造
↓
ヘクステット/ 16進数
↓
先頭ゼロ
↓
ゼロ圧縮
↓
展開
↓
有効性
↓
RFC 5952の正規表記
↓
アドレスの同値性

の順に確認します。

このページで扱う表記範囲

RFC 4291には、下位32ビットをIPv4ドット付き10進表記で表す、

x:x:x:x:x:x:d.d.d.d

形式も定義されています。

ただしページ019では、

8個の16ビット16進数フィールドで表す形式

および

その::圧縮形式

を対象にします。

IPv4ドット付き10進表記を含む混在表記は、このページの有効性 / 展開手順の対象外です。

1. IPv6アドレスは128ビット

IPv6アドレスの長さは、

128ビット

です。

ページ019で扱う通常の16進数表記では、これを、

16ビット × 8

へ分割して表します。

例えば、

2001:0db8:0000:0000:0001:0000:0000:0010

です。

8つの部分は、

1  2001
2  0db8
3  0000
4  0000
5  0001
6  0000
7  0000
8  0010

となります。

2. 各16ビット部分をヘクステットとして読む

ページ019では、コロン : で区切られた各16ビット部分を、

ヘクステット

と呼びます。

例えば、

2001:0db8:0000:0001:0000:0000:0000:0010

なら8ヘクステットです。

8ヘクステット × 16ビット
=
128ビット

となります。

3. 1ヘクステットは最大4桁の16進数

1ヘクステットは通常、

1~4桁

の16進数の桁で表します。

使用できる文字は、

0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F

です。

例えば、

0
a
7f
db8
ffff

はいずれもヘクステットとして成立します。

一方、

10000

は5桁なので1ヘクステットとして不正です。

12g4

も、gが16進数の桁ではないため不正です。

4. 16進数1桁は4ビット

16進数1桁は、

4ビット

を表します。

したがって、

16進数4桁
×
4ビット
=
16ビット

です。

IPv6アドレス全体では、

4桁 × 8ヘクステット
=
16進数32桁

32 × 4ビット
=
128ビット

となります。

5. 先頭ゼロは省略できる

各ヘクステットの左端にあるゼロは省略できます。

例えば、

0db8
→ db8
0001
→ 1
000a
→ a

です。

したがって、

2001:0db8:0000:0001:0000:0000:0000:000a

は、

2001:db8:0:1:0:0:0:a

と表せます。

6. 省略できるのは左端のゼロだけ

ゼロならどこでも削除できるわけではありません。

例えば、

db80

を、

db8

へ変更すると値そのものが変わります。

省略できるのは、

0db8
→ db8

のような、

先頭ゼロ

だけです。

7. ゼロのヘクステットは0と表せる

1ヘクステットが、

0000

なら、先頭ゼロを省略して、

0

と表せます。

例えば、

2001:db8:0:1:0:0:0:a

では、それぞれの0が1つのゼロのヘクステットを表しています。

通常のヘクステット表記では、ゼロのヘクステットを単なる空欄にはしません。

空欄化には次の:: ルールを使用します。

8. ::で連続ゼロのヘクステットを圧縮する

IPv6では、1個以上の連続したゼロのヘクステットを、

::

で表せます。

例えば、

2001:db8:0:0:0:0:0:1

は、

2001:db8::1

と書けます。

ここでは::が、

0:0:0:0:0

を置き換えています。

これを、

ゼロ圧縮

として扱います。

9. ::は先頭・途中・末尾に使用できる

連続ゼロ部分がアドレスの先頭にある場合、

0:0:0:0:0:0:0:1

は、

::1

と書けます。

末尾の場合、

2001:db8:1:0:0:0:0:0

は、

2001:db8:1::

です。

ページ019ではこれらをアドレス種別として分類せず、表記ルールとして扱います。

10. ::は1つのアドレス内で1回だけ

次の表記は不正です。

2001:db8::1::10

::を2回使うと、それぞれが何個のゼロのヘクステットを表すのか一意に決定できません。

したがって、

::

は1つのIPv6アドレス内で最大1回です。

11. 圧縮表記アドレスは8ヘクステットへ展開する

ページ019で扱う通常の16進数形式では、展開後に、

8ヘクステット

になります。

例えば、

2001:db8::5

では、明示されているヘクステットは、

2001
db8
5

の3個です。

したがって、

8 - 3
=
5

個のゼロのヘクステットを::へ補います。

完全展開:

2001:0db8:0000:0000:0000:0000:0000:0005

です。

12. 展開では左右の明示ヘクステット数を数える

例えば、

2001:db8:1::a

なら明示ヘクステットは、

2001
db8
1
a

の4個です。

したがって、

8 - 4
=
4

個のゼロのヘクステットを補います。

完全展開すると、

2001:0db8:0001:0000:0000:0000:0000:000a

です。

13. ::は最低1ヘクステット分を表す

ページ019で扱うこの形式では、::は1個以上のゼロのヘクステットを表します。

そのため、

2001:db8:1:2:3:4:5:6

はすでに8ヘクステットです。

これを、

2001:db8:1:2:3:4:5:6::

とすると、::へゼロのヘクステットを補う余地がありません。

したがって不正です。

14. ::がない場合は8ヘクステット必要

ページ019の通常の16進数形式で::を使用していない場合、8ヘクステットが必要です。

例えば、

2001:db8:0:0:0:0:0:1

は8ヘクステットなので有効です。

一方、

2001:db8:0:0:0:0:1

は7ヘクステットしかないため不正です。

2001:db8:0:0:0:0:0:0:1

は9ヘクステットなので不正です。

15. 有効性を確認する

ページ019で扱う通常の16進数IPv6表記では、次を確認します。

1. 使用文字が16進数か

        ↓

2. 各ヘクステットが1~4桁か

        ↓

3. ::は最大1回か

        ↓

4. ::がなければ8ヘクステットか

        ↓

5. ::があれば
   8ヘクステットへ一意に展開できるか

        ↓

6. 展開後が8ヘクステットか

この有効性ルールは、

8個の16進数ヘクステット形式
+
その::圧縮形式

を対象にしています。

RFC 4291で定義されるIPv4ドット付き10進表記を含む混在表記は、この手順の対象外です。

16. 不正なアドレスを識別する

16進数外の文字

2001:db8:gggg::1

はgを含むため不正です。

ヘクステットが5桁

2001:db8:12345::1

の12345は5桁なので不正です。

::を2回使用

2001:db8::1::10

は不正です。

::なしで7ヘクステット

2001:db8:0:0:0:0:1

は不正です。

9ヘクステット

2001:db8:0:0:0:0:0:0:1

は不正です。

8ヘクステットの後に::

2001:db8:1:2:3:4:5:6::

も不正です。

17. 有効と正規表記は別

次のアドレス:

2001:0DB8:0000:0000:0001:0000:0000:0001

はIPv6アドレスとして有効です。

しかし、ページ019で扱うRFC 5952の通常の16進数形式における正規表記ではありません。

したがって、

有効

と、

正規表記

を区別します。

有効性は、

IPv6アドレスとして構文上解釈できるか

の確認です。

正規化は、

同じアドレスを
一貫した推奨形式で表す

ための処理です。

18. RFC 5952の正規表記ルールの範囲

RFC 5952には、IPv4アドレスを埋め込んだ特定のアドレスに関する表記規則もあります。

ただしページ019では、

通常の16進数IPv6アドレス表記

について正規表記ルールを扱います。

このページで使用するルールは、

先頭ゼロ除去

小文字

ゼロ圧縮

最長の連続ゼロ部分

同率なら先頭側

単独ゼロのヘクステットは::にしない

です。

IPv4ドット付き10進表記を含む正規表記の詳細は、このページの学習範囲外です。

19. 正規表記では先頭ゼロを除去する

例えば、

2001:0db8::0001

ではなく、

2001:db8::1

と表します。

ゼロのヘクステットを単独で書く場合も、

0

とします。

20. 正規表記では16進数の英字を小文字にする

IPv6構文上、

A B C D E F

は有効です。

しかしページ019で扱うRFC 5952の正規表記では、

a b c d e f

を使用します。

例えば、

2001:DB8::ABCD

は有効ですが、正規表記では、

2001:db8::abcd

です。

21. 正規表記では最長連続ゼロ部分を最大限圧縮する

次のアドレス:

2001:db8:0:0:0:0:2:1

にはゼロのヘクステットが4個連続しています。

正規表記:

2001:db8::2:1

です。

選択した連続ゼロ部分の一部分だけを圧縮するのではなく、連続ゼロ部分全体を最大限圧縮します。

22. 連続ゼロ部分が複数ある場合

次のアドレス:

2001:0:0:1:0:0:0:1

には、

0:0

と、

0:0:0

があります。

最長は後者なので、

2001:0:0:1::1

が正規表記です。

23. 同じ長さなら先に現れる連続ゼロ部分

次のアドレス:

2001:db8:0:0:1:0:0:1

には、

ヘクステット 3~4
0:0

と、

ヘクステット 6~7
0:0

があります。

同じ長さなので、先に現れる連続ゼロ部分を圧縮します。

正規表記:

2001:db8::1:0:0:1

です。

24. 単独ゼロのヘクステットは正規表記では::にしない

次のアドレス:

2001:db8:0:1:1:1:1:1

には、単独のゼロのヘクステットしかありません。

正規表記では、

2001:db8:0:1:1:1:1:1

のままです。

2001:db8::1:1:1:1:1

とはしません。

ここでは、

構文上どの表記が解釈可能か

と、

RFC 5952で何を正規表記として出力するか

を区別します。

25. 正規表記化の基本手順

ページ019で扱う通常の16進数形式では、次の順で整理できます。

1. 先頭ゼロを除去

        ↓

2. 16進数の英字を小文字

        ↓

3. 連続ゼロのヘクステットを確認

        ↓

4. 最長連続ゼロ部分を選択

        ↓

5. 同長なら先に現れる連続ゼロ部分を選択

        ↓

6. 2ヘクステット以上の選択連続ゼロ部分を::

        ↓

7. 単独ゼロのヘクステットは0のまま

例えば、

2001:0DB8:0000:0000:0001:0000:0000:0001

を処理すると、

2001:db8:0:0:1:0:0:1

となり、同長の連続ゼロ部分では先頭側を選択するため、

2001:db8::1:0:0:1

が正規表記です。

26. 完全展開と正規表記は目的が違う

次のアドレス:

2001:db8::1

を完全展開すると、

2001:0db8:0000:0000:0000:0000:0000:0001

です。

正規表記は、

2001:db8::1

です。

つまり、

完全展開

は内部のアドレス値を分かりやすく比較する方法です。

一方、

正規化

は、同じアドレスを一貫した短い形式で表す方法です。

27. 異なる文字列が同じアドレスか確認する

次の2つを比較します。

アドレス A
2001:db8:0:1::10
アドレス B
2001:0DB8:0000:0001:0000:0000:0000:0010

Aを完全展開すると、

2001:0db8:0000:0001:0000:0000:0000:0010

です。

Bも16進数の英字の大文字小文字を無視すれば、同じ値です。

したがって、

アドレス A
=
アドレス B

です。

28. 同値性判定では展開または正規表記化する

例えば、

2001:db8::a

と、

2001:0DB8:0:0:0:0:0:000A

を完全展開すると、どちらも、

2001:0db8:0000:0000:0000:0000:0000:000a

です。

したがって同一アドレスです。

両方を正規表記化して、

2001:db8::a

へ揃えて比較しても構いません。

29. 見た目の違いだけで誤設定と判断しない

例えば、

期待値
2001:db8::10
実際値
2001:0DB8:0000:0000:0000:0000:0000:0010

なら、文字列は異なります。

しかし完全展開すると同じ128ビットアドレスです。

したがって、

表記が違う
↓
アドレスの誤設定

とは判断しません。

確認するのは、

アドレス値が同一か

です。

30. プレフィックス長はページ020で扱う

IPv6アドレスは、

2001:db8::1/64

のようにプレフィックス長と一緒に表示される場合があります。

ページ019で扱うのは、

2001:db8::1

というアドレス表記です。

/64

が何を意味するか、

プレフィックス境界

同一プレフィックス判定

親/ 子プレフィックス

プレフィックスサイズ

はページ020で扱います。

31. アドレス種別/ 範囲はページ021で扱う

例えば、

2001:db8::1

fe80::1

::1

などには、用途や範囲に関する違いがあります。

しかしページ019の責任は、

表記が有効か

どう展開するか

どう正規表記化するか

同じアドレスか

です。

アドレス種別/ 範囲はページ021で扱います。

32. よくある誤判断

誤り1:右側のゼロも削除できる

db80
→ db8

は値が変わります。

削除できるのは先頭ゼロだけです。

誤り2:ゼロのヘクステットを勝手に空欄にする

0000
→ 0

が通常の省略です。

連続ゼロのヘクステットを空欄化する場合は:: ルールを使用します。

誤り3:::を2回使う

ページ019で扱うこの表記では、1つのアドレス内で最大1回です。

誤り4:::があればヘクステット数を数えなくてよい

展開後に8ヘクステットになる必要があります。

誤り5:大文字なら無効

大文字の16進数も構文上有効です。

正規表記では小文字を使用します。

誤り6:先頭ゼロがあると無効

先頭ゼロを含む表記も有効です。

正規表記では除去します。

誤り7:単独ゼロのヘクステットも正規表記で::にする

単独ゼロのヘクステットは0のままです。

誤り8:連続ゼロ部分を好きな場所で圧縮する

正規表記では最長連続ゼロ部分を選びます。

同長なら先頭側です。

誤り9:見た目が違えば別アドレス

展開すると同じ128ビット値の場合があります。

誤り10:この有効性ルールがRFC 4291の全表記を網羅する

ページ019の有効性手順は、

通常の16進数形式
+
::圧縮形式

を対象にしています。

RFC 4291にはIPv4ドット付き10進表記を含む別の有効表記もあります。

33. IPv6アドレス表記の基本手順

ページ019で扱うアドレスを確認するときは、

1. 16進数文字を確認

        ↓

2. ヘクステット長を確認

        ↓

3. 先頭ゼロを識別

        ↓

4. ::の有無と回数を確認

        ↓

5. 必要なら8ヘクステットへ展開

        ↓

6. 有効性を判断

        ↓

7. 必要ならRFC 5952のルールで正規表記化

        ↓

8. 他アドレスと比較する場合は
   展開または正規化

        ↓

9. 128ビットアドレス値が同一か判断

34. 最終的に判断できるようにすること

ページ019では最終的に、

IPv6アドレスは128ビット

8ヘクステット × 16ビット

1ヘクステットは最大4桁の16進数

先頭ゼロを省略できる

ゼロだけのヘクステットを0と表せる

`::`で連続するゼロのヘクステットを圧縮できる

`::`を1つのアドレス内で1回だけ使用する

圧縮アドレスを8ヘクステットへ展開できる

構文が不正な通常の16進数IPv6表記を識別できる

構文上有効な表記と正規表記を区別できる

RFC 5952の通常の16進数形式へ正規表記化できる

最長の連続ゼロ列を選択できる

同じ長さの連続ゼロ列なら先頭側を選択できる

単独のゼロヘクステットを`::`にしない

16進数の英字を小文字にできる

異なる表記が同じ128ビットのアドレスか判断できる

このページの構文判定ルールでは混在表記を対象外としていることを理解する

必要があります。

まとめ

IPv6アドレスは、

128ビット

です。

ページ019で扱う通常の表記では、

8ヘクステット × 16ビット

へ分け、各ヘクステットを16進数で表します。

例えば、

2001:0db8:0000:0000:0001:0000:0000:0010

です。

先頭ゼロは省略できるため、

2001:db8:0:0:1:0:0:10

と表せます。

さらに連続するゼロのヘクステットは、

::

で圧縮できます。

ただしページ019で扱う通常の16進数形式では、::は1つのアドレス内で1回だけです。

圧縮表記アドレスを展開するときは、

全体が8ヘクステット

になるようにゼロのヘクステットを補います。

また、

有効

と、

RFC 5952の正規表記

は別です。

ページ019で扱う通常の16進数形式の正規表記では、

先頭ゼロを除去

16進数の英字を小文字

最長連続ゼロ部分を最大限圧縮

同長連続ゼロ部分なら先頭側

単独ゼロのヘクステットは::にしない

というルールを使用します。

例えば、

2001:0DB8:0000:0000:0001:0000:0000:0001

は有効ですが、正規表記では、

2001:db8::1:0:0:1

です。

また、

2001:db8::10

と、

2001:0DB8:0000:0000:0000:0000:0000:0010

は見た目が異なりますが、完全展開すると同じ128ビットアドレスです。

トラブルシューティングでは、

文字列が違う
=
アドレスが違う

と判断せず、

展開
または
正規化

によってアドレス値を比較します。

なお、RFC 4291にはIPv4ドット付き10進表記を含む別の有効なアドレス表記もあります。

ページ019の有効性 / 展開/ 正規化手順は、

通常の16進数IPv6形式
+
その::圧縮形式

へ責任を限定しています。

ページ019での最終流れは、

IPv6アドレス文字列
↓
ヘクステット/ 16進数確認
↓
先頭ゼロ確認
↓
::確認
↓
8ヘクステットへ展開
↓
構文の有効性を判定
↓
RFC 5952の正規表記化
↓
アドレス同一性を判定

です。

次のページ020では、このアドレス表記を前提に、IPv6プレフィックス長 / プレフィックス境界/ 親・子プレフィックス/ プレフィックスサイズを扱います。

理解確認

このページの内容を14問で確認します。

理解確認14問へ →