ひところは「NAT/IPマスカレードによるアドレス変換を利用すれば、グローバルIPアドレスの消費は抑えられるので、当分は問題にならない」とされていたIPv4アドレスの割り当てだが、その後になって「枯渇が目前」といわれるようになり、そしてそれは現実のものになった。

JPNIC、IPv4アドレス枯渇を正式発表 - IPv4アドレス移転制度への意見も募集

したがって今後は、望むと望まざるとに関わらず、IPv6への移行を図っていかなければならない。そこで問題になるのが、OSやネットワーク機器の対応ということになる。こうした事情を受けて、Windows 7などのIPv6対応OS、あるいはヤマハルータのようなIPv6対応ネットワーク機器を使って、実際にIPv6ネットワークを動かす話について取り上げてみよう。

IPv6のアドレス

IPv4もIPv6も、同じネットワーク層プロトコル、つまりレイヤー3に属している。最大の違いは、アドレス表記に使用するビット数だ。

IPv4アドレスは長さ32ビットなので、理論値は2の32乗で約43億となる。しかし、クラス分けやプライベートIPアドレスなどの存在により、そのすべてをグローバルIPアドレスとして用いることはできず、実際にインターネットで利用可能な数はずっと少なくなっている。

32ビットで足りなければ桁数を増やせばよい。と言い切ってしまうと乱暴だが、IPv6では長さ128ビットのアドレスを使用するので、利用可能なIPv6アドレスの数はIPv4と比べると桁違いに多い。しかし桁数が増えた分だけ、表記が難しくなる問題が出てくる。IPv4アドレスと同じように8ビットずつ区切っていたら、ピリオドで区切られた数字が16個も並んでしまって大変だ。

そこでIPv6では、長さ128ビットのアドレスを16ビットずつ8個のブロックに分けて、各々を16進値で表記して「:」で区切る形で表記するようにしている。具体的にいうと、

「fe80:1234:5678:9abc:def0:1234」

といった形になるわけだ。

そのIPv6アドレスには、以下の種類がある。IPv4と違い、IPv6にはブロードキャストアドレスはない。

・ユニキャストアドレス : 個々のホストに割り当てるアドレスのこと
・エニーキャストアドレス : 同一ネットワークに属するすべてのホストを対象として、一対多の通信を行う際に使用する
・マルチキャストアドレス : サーバからクライアントに対して一対多の通信を行う際に使用する

ユニキャストアドレスの中には、未指定アドレスとループバックアドレスが含まれる。前者はインタフェースに割り当てるものではなく、パケットの送信元IPアドレスとして、仮設のアドレスが固有であることを確認するための通信に利用する。IPv4では「0.0.0.0」だが、IPv6では「0:0:0:0:0:0:0:0」または「::」となる。

後者はIPv4の「127.0.0.1」に相当する、自分自身を指し示すためのアドレスで、IPv6では「0:0:0:0:0:0:0:1」または「::1」となる。

このように2種類の表記が出てくるのは、IPv6には表記省略のためのルールがあるからだ。それについても解説しよう。

IPv6アドレスの省略表記

IPv6では、「:」で区切った個々のブロックのうち、「0」で始まるアドレスを持つブロックについては「0」を省略してもよいことになっている。そのため、以下に示した2つのIPv6アドレスは同じ意味になる。

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

また、すべて「0」になるブロックが連続した場合、ひとつのIPv6アドレスのうち1カ所に限り、連続する部分の記述を一気に省略して「::」と表記できる。これがいわゆる「ゼロの圧縮」だ。これを適用した例を以下に示すが、2つの表記は同じIPv6アドレスを意味している。

・1234:5678:0000:0000:1234:0000:0000:9abc
・1234:5678::1234:0:0:9abc

この例では、3番目のブロックと4番目のブロックで「0000」が連続しているため、そこで圧縮を行っている。6番目のブロックと7番目のブロックでも「0000」が連続しているが、すでにゼロの圧縮を使ってしまっているため、こちらでは代わりに「0」を記述している。どうしてゼロの圧縮を1カ所でしか使用できないかというと、圧縮した結果の「::」は可変長であり、上記の例のように2ブロックとは限らないためだ。

ゼロの圧縮を使用した状態から元のIPv6アドレスを逆算するには、以下の計算式を使用する。

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

たとえば、ゼロの圧縮を行って「ff02::2」と表記しているIPv6アドレスについて上の計算式を適用すると、結果は「(8-2)×16 = 96」となる。ひとつのブロックが16ビットだから、96ビットは6ブロックに相当、つまり「0000」が6ブロックに渡って連続しているという意味になる。さらに、前述した「0で始まるときの省略」も加味すると、実際のIPv6アドレスは「ff02:0000:0000:0000:0000:0000:0000:0002」となる。

ネットワークプレフィックスとインタフェースID

IPv6もIPv4と同様に、所属するネットワークを意味するアドレスと、そのネットワークの中で個々のホストを識別するためのアドレスという2種類の概念がある。前者はIPv4でいうところのネットワークアドレスのことだが、IPv6ではネットワークプレフィックスと呼ぶ。後者はインタフェースIDと呼ぶ。

同じネットワークに属するホストは、同一のネットワークプレフィックスとサブネットマスクを使い、インタフェースIDだけを重複しないように割り当てる。この考え方はIPv4でもIPv6でも同じだ。そして、ネットワークプレフィックスとインタフェースIDを組み合わせることでIPv6アドレスが決まる理屈だ。分量の関係もあり、インタフェースIDの決め方については次回に解説することとしたい。

IPv6を利用するクライアントPCなどでは通常、128ビットのアドレスのうち上位64ビットをネットワークプレフィックスとして使用するため、「<ネットワークプレフィックス>/64」といった表記になる。そして、残った下位の64ビットがインタフェースIDということになる。

なお、同じコンピュータの同じインタフェースに対して、複数のIPv6アドレスを割り当てることもできる。第3回で実際に例を示すが、Windows 7やWindows VistaでIPv6アドレスの設定状況を確認すると、このことを理解しやすい。