IPv6アドレスの基礎

仕事でIPv6をさわらなければいけなくなった。いつか必要になったら勉強しようと思ってずっと後回しにしてきたのだが、その日が来てしまったようだ。まずはIPv6アドレスについて整理しよう。書籍などを見ながら勉強をしていくので、もしかしたら不正確な記述があるかもしれないし、たぶん不十分な記述はたくさんあると思う。

IPv6アドレスは、ご存知のとおりIPv4のアドレスの4倍の128ビットのサイズがある。これを16進数32桁で表し、16ビット(4桁)ごとにコロン(:)で区切る。つまり以下のようになる。

fe80:0000:0000:0000:0216:d3ff:fe3e:2a85

これではあまりにも長いということで、:0000:が連続する場合は1個の::で略記できる。ただし::を使えるのは1回だけである。:0000:は:0:とも略記できる。また:0216:のように16ビット区切りの上位桁が0の場合は:216:などと略記できる。よって上記のアドレスは下記のように略記できる。

fe80::216:d3ff:fe3e:2a85

IPv4の時と同様に、IPv6でも/64などというようにプレフィックス表記によるサブネット表現ができる。ユーザ組織は通常/48のプレフィックスを割り当てられ、続く16ビットをサブネットIDとして設計する。つまり128ビットのアドレスのうち上位64ビットをネットワークアドレスとして使用する。/48を/64に分けるので、ユーザ組織は16ビット分(65536)のサブネットを使うことが出来る。下位64ビットはインターフェースIDと呼ばれ、サブネット内でホストを一意に識別するIDとして使用する。

グローバルアドレスの割り当てに関しては、一定の条件を満たしたプロバイダは/32のプレフィックスを割り当てられる(グローバルルーティングプレフィックス)。そのプロバイダに接続するユーザは、先述のようにその中から/48のプレフィックスを割り当てられる。よってこのプロバイダは16ビット分(65536)のユーザを接続することができる。こうすることによってインターネット全体のルーティング情報が増えることを防いでいるが、ユーザはプロバイダを乗り換える際にはグローバルアドレスが変わってしまう。

ややこしいので、実際のアドレスと見比べてみる。

2000:0001:0001:0001:0216:d3ff:fe3e:2a85

赤字はプロバイダに割り当てられたグローバルルーティングプレフィックス青字はユーザ組織に割り当てられたプレフィックス緑字はユーザ組織が設計するネットワークアドレス、黒字がホストアドレスである。

IPv6アドレスは全部で128ビットあるが、IPv4のクラス分割と同様に使用目的によって以下のように分割して割り当てられている。これをなんとなく頭に入れておかないと、IPv6アドレスを見たときに何が何だかわからなくなる。

名称プレフィックスアドレス範囲
グローバルユニキャストアドレス2000::/32000:...~3fff:...
リンクローカルユニキャストアドレスFE80::/10FE80:...~FEBF:...
ローカルIPv6アドレスFC00::/7FC00:...~FDFF:..
マルチキャストアドレスFF00::/8FF00:...~FFFF:...

このうちローカルIPv6アドレスは、現在は8ビット目が1であるFD00::/8(つまりFD00:...~FDFF:...)のみが定義されている。ローカルIPv6アドレスは、グローバルなインターネットに向けて送信してはいけないアドレスであるが、グローバルで一意であるように定義されるアドレスであり、FDに続く40ビットをランダムに生成して使用する。合計48ビットとなるので、更に16ビットでサブネットを作ることが出来る。

ここまでが128ビットのアドレスの上位64ビットの話。下位64ビットのインターフェースIDは自由に設定することができるが、通常は48ビットのMACアドレスから生成されるEUI-64(Extended Unique Identifier-64)フォーマットを使用する。この生成方法は(人間には)面倒である。6バイト長のMACアドレスの第3バイトと第4バイトの間に0xFF-FEという値を挿入し、次にMACアドレスの最初のバイト0x00を0x02に変える。よってEUI-64フォーマットのアドレスは以下のような形になる。

xxxx:xxxx:xxxx:xxxx:02xx:xxFF:FExx:xxxx