前回は、IPv4とIPv6が共存する場合に発生する可能性がある問題点についてまとめるところまで話を進めた。今回は、IPv4とIPv6が共存する場合に関わってくる互換性アドレスの話を取り上げる。

互換性アドレスとは、IPv4とIPv6を共存させつつ通信の途絶を防ぎ、IPv4からIPv6への円滑な移行を支援するために考慮された手法で、「IPv4互換アドレス」と「IPv4マップアドレス(IPv4射影アドレス)」の2種類がある。

IPv4互換アドレス

いわずと知れたお話になるが、IPv4アドレスは32ビット長のアドレスを8ビットずつ区切って、それぞれのパートごとに10進値に変換して「w.x.y.z」という形で表記している。それぞれのパートに入る値は8ビットずつだから、「0~255」の範囲となる。もっとも、これらの数値範囲をすべて使うと、ネットワークアドレスやネットマスクまで含んでしまうが。

そのIPv4アドレスを、「0:0:0:0:0:0:w.x.y.z」あるいは「::w.x.y.z」と表記するのがIPv4互換アドレスだ。後者はゼロの省略を行った際の表記なので、どちらも意味は同じになる。

その「w.x.y.z」の部分の表記は通常のIPv4アドレス表記と同じである。だから、IPv4アドレス「192.168.100.11」であれば、IPv4互換アドレスは「0:0:0:0:0:0:192.168.100.11」あるいは「::192.168.100.11」となる。つまり、先頭の96ビット分をゼロで埋めて、残り32ビットにIPv4アドレスが入るわけだ。

表記の方法が異なるので「これでIPv6アドレスとして認識されるのか?」と思いそうだが、10進法や16進法の値で書くからそう見えるので、「1」「0」のビット列を並べれば同じことである。

このIPv4互換アドレスを使用できるのは、Windows VistaやWindows 7のようにIPv4とIPv6のデュアルスタックになっているノードだ。そして、宛先としてIPv4互換アドレスを指定すると、IPv6の通信を自動的にカプセル化して、IPv4のトラフィックとしてやり取りする。

つまり、IPv4ヘッドを付けたパケットのペイロード部に、IPv6パケットがまるごと入った形になるわけだ。これをIPv6自動トンネリングという(RFC2893)。IPv6に対応したノード同士がIPv4にしか対応していないネットワークを介して通信する際に、この方法を利用できる。

IPv4パケットのペイロード部にIPv6パケットをカプセル化することで、IPv4のトラフィックと同じものとして扱うことができる。目的地に着いたところでカプセル化を解くと、中からIPv6パケットが出てくる仕組みだ。

ただし実際には、このIPv6自動トンネリングは廃止されることになったため、IPv4互換アドレスも道連れになって「過去の遺物」ということになる模様だ。

IPv4マップアドレス(IPv4射影アドレス)

では、もうひとつのIPv4マップアドレス(IPv4射影アドレス)とは何者だろうか。

IPv4マップアドレスは、IPv6対応ノードが、IPv4にしか対応していないノードと通信する際に使用する。このとき、後者のノードが持っているIPアドレスはIPv4アドレス「w.x.y.z」だけなので、それをIPv6のルールに合わせて「0:0:0:0:0:FFFF:w.x.y.z」あるいは「::FFFF:w.x.y.z」と表記する。先のIPv4互換アドレスと同様、後者はゼロの省略を行ったときのものだ。

IPv6マップアドレスがIPv4互換アドレスと異なるのは、ゼロが入る部分が16ビット×6から16ビット×5に短縮されて、代わりに81~96ビット目を「1」で埋めている点だ。残り32ビットにIPv4アドレスが入るのは、IPv4互換アドレスと同じである。

このIPv4マップアドレスを内部表現として使用することで、IPv4にしか対応していないノードをIPv6対応ノードとして表現することができる。ただし、IPv4マップアドレスをIPv6パケットの送信元アドレス、あるいは宛先アドレスとして使用することはない。

実際にはデュアルスタック化して解決

ただし、実際の運用環境では、IPv4互換アドレスにしろIPv4マップアドレスにしろ、あまり広く使われてはいないようだ。というのも、たとえば手元のWindows VistaやWindows 7、あるいはMac OS Xを見ていただければお分かりの通り、オペレーティングシステムが当初からデュアルスタック状態になっていて、同じホストがIPv4とIPv6の両方を "しゃべれる" ようになっているからだ。

Windows Vista/7の場合、既定値ではIPv6の方が優先度が高いので、IPv6を利用できるノードと通信する際にはIPv6を優先的に使用する。そして、IPv4しか利用できないノードと通信する際にはIPv4を使用する。相手に応じてIPv4とIPv6を使い分ける、いわばバイリンガル状態なので、いちいちIPv4互換アドレスやIPv4マップアドレスを使用する必然性はないわけだ。

ただし問題は、複数のネットワークをまたいで通信する場面で、途中でIPv4しか使えない場合である。そこで登場するTeredoの話は次回に取り上げる。