前回は、IPv6のアドレス表記ルールについて解説した。今回はIPv6に特有のルールである、アドレスの短縮表記に関するルールについて解説しよう。

IPv6のアドレス短縮表記ルール(1) : ゼロの省略

IPv6アドレスを構成する個々のブロックは、先に述べたように0000~ffffの範囲をとる。そのため、先頭がゼロで始まるアドレスが発生する。このとき、IPv6の短縮表記ルールとしてゼロを省略できることになっている。

このルールを適用すると、以下に示した2つのIPv6アドレスは同じ意味になる。

f0f0:0100:0020:0003:1000:0100:0020:0003
f0f0:100:20:3:1000:100:20:3

最初のブロックは「f0~」なので、ゼロの省略は適用しない。しかし2番目以降のブロックはすべてゼロで始まっているので、それを省略している。ブロックごとにゼロの桁数が異なるので、「0100」→「100」、「0003」→「3」といった具合に、省略後の桁数もブロックごとに異なっている。

なお、ゼロを省略できるのはゼロで始まっている場合に限られるので、ゼロで終わっているアドレスは短縮の対象にならない。上の例でいうと、「1000」となっている5番目のブロックを「1」と短縮することはできない。「1001」といった具合に中間にゼロが入っている場合にも、短縮はできない。

IPv6のアドレス短縮表記ルール(2) : ゼロの圧縮

もうひとつの短縮表記ルールが、すべて0になるブロックそのものの省略だ。この場合、省略した部分については区切り文字のコロンを連続させて「::」と表記する。そのため、以下に示した2つのIPv6アドレスは同じ意味になる。

1234:5678:0000:9abc:def0:1234:5678:9abc
1234:5678::9abc:def0:1234:5678:9abc

この例では3番目のブロックが「0000」なので、それを省略して「::」でつないでいる。

さらに、隣接する複数のブロックですべてゼロになる状態が続いた場合、それらをまとめて省略できる。そのため、以下に示した2つのIPv6アドレスは同じ意味になる。

1234:0000:0000:0000:5678:9abc:def0:1234
1234::5678:9abc:def0:1234

この例では、2~4番目のブロックがすべて「0000」なので、まとめて省略して「::」でつないでいる。ただし、この短縮表記を使えるのはひとつのIPv6アドレスの中で1カ所だけなので、以下のような短縮はできない。

1234:0000:0000:5678:9abc:0000:0000:def0
1234::5678:9abc::def0

この例では、2-3番目のブロックと6-7番目のブロックでそれぞれ「0000」が連続しているが、その両方は省略できない。省略できない分については前述した「ゼロの省略」ルールを適用して、以下のように表記することになる。

1234::5678:9abc:0:0:def0

ゼロの圧縮を復元する

このようにゼロの圧縮を行った場合、「:」で区切ったブロックの数が減ることになるので、単に「::」の部分を「:0000:」とするだけでは元のアドレスを復元できない。いくつのブロックが圧縮対象になったかを計算する必要がある。

そこで使用するのが、以下の計算式だ。

(8 - 圧縮後のIPv6アドレスのブロック数)×16

たとえば、IPv6アドレス「ff02::2」は、圧縮後の状態で2ブロック(「ff02」と「2」)となっている。これを上の計算式に当てはめると、結果は以下のようになる。

(8-2)×16 = 96

これは96ビット、つまり6ブロックの「0000」が存在するという意味だ(16×6=96)。そこで「0000」のブロック×6個を省略部分にはめ込み、さらに「0で始まるときの省略」も元に戻すと、元のIPv6アドレスは「ff02:0000:0000:0000:0000:0000:0000:0002」となる。