IPv6アドレス

IPv6アドレスとは、IPv6コンピュータネットワークにおいてコンピュータ等のノードのネットワークインターフェースを判別するための番号（IPアドレス）である。
IPアドレスは、ホストの個々のネットワークインターフェースを特定し、ホスト間でIPパケットのルーティングを行うために使用される。IPアドレスはパケットのヘッダに記載され、そのパケットの送信元と送信先を示している。
IPv6は、インターネットにおいて最初に使用されたIPv4を継承している。IPv4が32ビットのIPアドレスを使用するのに対し、IPv6は128ビットのIPアドレスを使用する。このため、IPv6はIPv4と比べて非常に大きなIPアドレス空間を持っている。

アドレス形式

IPv6アドレスは128ビットのアドレス幅を持っている。アドレスは、アドレス指定とルーティングの方法により、ユニキャストアドレス、マルチキャストアドレス、エニーキャストアドレスに分類される。これらのそれぞれに、論理的に128のアドレス・ビットをビット・グループに分け、これらのビット・グループの値を特別なアドレス指定機能と結びつけることによって、様々なアドレス・フォーマットが存在する

ネットワーク

IPv6ネットワークは、2の累乗個のサイズの一定のIPv6アドレスのグループである「アドレスブロック」を使用する。アドレスの先頭のビットは、与えられたネットワーク内の全てのホストで同一であり、ネットワークアドレスまたはルーティングプリフィックスと呼ばれる。
ネットワークアドレスの範囲はCIDR表記で表される。ネットワーク表現は、ブロックの最初のアドレス（最後のビットが全て0になる）の後にスラッシュ（/）および、プリフィックスのビット長を十進数で書く。例えば、2001:db8:1234::/48 と表現されるネットワークは、2001:db8:1234:0000:0000:0000:0000:0000 に始まり 2001:db8:1234:ffff:ffff:ffff:ffff:ffff で終わる。
インターフェースアドレスのルーティングプリフィックスは、直接にアドレスとCIDR記法で表すことができる。例えば、2001:db8:a::/64 のサブネットに接続されているアドレス 2001:db8:a::123 のインターフェースの設定は、 2001:db8:a::123/64 のように書くことができる。

アドレスブロックのサイズ

スラッシュに続く十進数の数値が表すのは、そのアドレスブロックに含まれるアドレスの数ではなく、ネットワークプリフィックスのビット数である。例えば、48ビットのプリフィックスのアドレスブロックは"/48"と表される。そのようなアドレスブロックは、 2¹²⁸ ⁻ ⁴⁸ = 2⁸⁰ 個のアドレスを含んでいる。ネットワークプレフィックスの値がより少ないほど、ブロックは大きくなる。/21のブロックは/24のブロックの8倍の大きさがある。

一般的な割り当て

IPv6アドレスの割り当てプロセスの管理は、インターネットアーキテクチャ委員会とInternet Engineering Steering GroupからInternet Assigned Numbers Authority (IANA)に委任されている。主な機能は、大きなアドレスブロックを地域インターネットレジストリ(RIR)に割り当てることである。RIRは、世界の地域ごとに、ネットワーク・サービス・プロバイダや他のローカルインターネットレジストリへのアドレスの割り当てを委任されている。IANAは、IPv6アドレス空間の公式の割り当てリストの管理を1995年12月から行っている。
効果的な経路集約(route aggregation)を提供し、それによってインターネット・ルーティング・テーブルのサイズを減らすために、全体のアドレス空間の8分の1(2000::/3)だけがインターネットで使用するために割り当てられている。IPv6アドレス空間の残りは、将来の利用と特別な目的のために予約されている。アドレス空間は/23から/12という大きなブロック単位でRIRに割り当てられている。
RIRはローカルインターネットレジストリ(LIR)に小さなブロックを割り当てる。そのサイズは一般的に/19から/32の範囲である。アドレスは一般的に/48から/56の単位でエンドユーザに分配される。
グローバルユニキャストの割り当ての記録は、それぞれのRIRのサイトなどで閲覧できる。
IPv6アドレスは、IPv4アドレスと比較して大きなブロックで各組織に割り当てられる。推奨された割り当ての大きさである/48は2⁸⁰個のアドレスを含んでおり、これはIPv4アドレスの全アドレス空間（32ビット）の2⁴⁸倍（約2.8×10¹⁴倍）である。IPv6アドレスの全アドレス空間は2¹²⁸個（340,282,366,920,938,463,463,374,607,431,768,211,456個、約3.4×10³⁸個、340澗個、340兆の1兆倍の1兆倍）もあるため、予見できる将来に対して十分である。
それぞれのRIRは1つの/23ブロックを512個の/32のブロックに分割することができ、一般的には1つのISPに対して1つの/32ブロックを割り当てる。ISPは割り当てられた/32ブロックを65536個の/48ブロックに分割することができ、一般的には1人の顧客に対して1つの/48ブロックを割り当てる。顧客は割り当てられた/48ブロックから65536個の/64のネットワークを作ることができる。/64のネットワークには2⁶⁴個（18,446,744,073,709,551,616個）のアドレスが収容できる。これでもIPv4の全アドレス空間（2³²個、4,294,967,296個、約4.3×10⁹個）の2³²倍の個数である。
計画的に、アドレス空間の非常に少ない部分だけが、実際には使われる。大きなアドレス空間はアドレスがたいてい利用できることを確実にする。そして、それはアドレス維持のためにネットワークアドレス変換(NAT)を使用することを完全に不必要にする。NATはIPv4ネットワークにおいてIPアドレス枯渇問題を軽減するために今後も使われる。

特別な割り当て

アドレスの再割り当てすることなくプロバイダーを変えられるようにするために、RIRがエンドユーザに直接アドレスを割り当てるためのプロバイダ非依存アドレス空間が 2001:678::/29 として定められている。
インターネットエクスチェンジ(IX)には 2001:7f8::/29 の範囲から特別なアドレスが割り当てられており、IXに接続されているISPとの通信に使用される。ルートDNSサーバにも同じ範囲からアドレスが割り当てられている。

予約されたエニーキャストアドレス

それぞれのサブネットプリフィックスの最も低いアドレス（インターフェース識別子を全て0に設定したもの）は、「サブネット・ルータ・エニーキャストアドレス」として予約されている。アプリケーションはこのアドレスを利用可能な1つのルータとの通信に利用できる。このアドレス宛にのパケットはただ1つだけのルータに届く。
/64のサブネットプリフィックスの最上位の128個のアドレスは、エニーキャストアドレスとして予約されている。これらのアドレスは、インターフェース識別子の最初の57ビットが1で、残りの7ビットがエニーキャストIDである。この場合、そのアドレスが世界的に唯一ではないことを示すために、universal/localビットは0にしなければならない。エニキャスト識別子0x7eはmobile IPv6ホームエージェント・エニーキャストアドレスとして定義されている。エニキャスト識別子0x00から0x7dまでと0x7fは予約されており、何にも使用されていない。

特別なアドレス

IPv6において特別な意味を持つアドレスがある。それを以下に挙げる。

要請ノードマルチキャストアドレス

要請ノードマルチキャストアドレスのグループIDの下位24ビットは、インターフェースのユニキャストアドレスまたはエニーキャストアドレスの下位24ビットである。このアドレスは、ローカル・ネットワーク上の全てのノードを妨げずに、近隣探索プロトコル(NDP)によるリンク層アドレス解決をすることができる。ホストは、設定されたユニキャストアドレスまたはエニーキャストアドレスの要請ノードマルチキャストグループに参加しなければならない。

ステートレスアドレス自動設定

システムの起動時、ノードは、それぞれのIPv6が利用可能なインターフェースについてリンクローカルアドレスを自動的に生成する。グローバルにルーティングできるアドレスが、手動で設定されるか、後述する「設定プロトコル」から得られる場合でも同様である。
それは、近隣探索プロトコルの機能を使用したステートレスアドレス自動設定(SLAAC)によって、独立して、そして、事前設定なしで動作する。このアドレスはプリフィックス fe80::/64 の中から選択される。
IPv4に「設定プロトコル」はDHCPやPPPを含む。DHCPv6もあるが、IPv6のホストはグローバルにルーティング可能なユニキャストアドレスを作るのに近隣探索プロトコルを用いる。ホストはルータ要請(RS: router solicitation)を送信し、IPv6ルーターは割り当てられたプリフィックスとともに応答を返す。
アドレスの下位64ビットは、64ビットのmodified EUI-64フォーマットによるインターフェース識別子である。この識別子は、通常そのインターフェースの全ての自動的に構成されたアドレスによって共有される。その利点は、1つのマルチキャスト・グループだけが近隣探索のために参加する必要があることである。このためには、ネットワークプリフィックス ff02::1:ff00:0/104 とアドレスの下位24ビットからなるマルチキャストアドレスが用いられる。

Modified EUI-64

64ビットのインターフェース識別子は、48ビットのMACアドレスから生成するのが最も一般的である。MACアドレス 00:0C:29:0C:47:D5 は、真ん中に FF:FE を入れることで64ビットのEUI-64 00:0C:29:FF:FE:0C:47:D5 に変換される。このEUI-64をIPv6アドレスの中で使うとき、次のように変形される。 Universal/Localビット（EUI-64の最上位ビットを第1ビットとしたときの第7ビット）を反転する。ネットワークプリフィックス 2001:db8:1:2::/64 と上記のMACアドレスを用いてIPv6アドレスを生成すると、 2001:db8:1:2:020c:29ff:fe0c:47d5 となる。ここで、下線部はUniversal/Localビットが1に反転された箇所である。1はUniversal、0はLocalを意味する。
グローバルユニキャストアドレスのインタフェースIDには、MACアドレス等から生成されるModified EUI-64フォーマットが使用されることが多いが、プライバシー上の懸念があるため、一意性およびプライバシーの双方を満たす仕様（一時アドレス）への変更が推奨されている（RFC 7217、RFC 7721）。

重複アドレス検出

インターフェースにユニキャストIPv6アドレスを割り当てた後、Neighbor Solicitation（近隣要請）とNeighbor Advertisement（近隣広告）（ICMPv6のtype 135と136）メッセージを使ってそのアドレスが唯一のものであるかの確認を行う。確認を行っている間、そのアドレスは「仮」(tentative)の状態にある。
ノードは仮のアドレスの要請ノードマルチキャストグループに参加し（まだ参加していない場合）、仮アドレスを宛先、未指定アドレス(::/128)を送信元としてNeighbor Solicitationメッセージを送信する。ノードは、Neighbor Advertisementが受信できるようにするために全ホストマルチキャストアドレス ff02::1 にも参加する。
ノードが自身の仮アドレスを宛先とするNeighbor Solicitationを受信した場合、そのアドレスはユニークではない。ノードが、仮アドレスを送信元とするNeighbor Advertisementを受信した場合も同様である。アドレスがユニークであると確認できた時だけ、そのアドレスが割り当てられ、インターフェースによって使用される。
この仕組みを重複アドレス検出(DAD: Duplicate address detection)という。

アドレスの有効期限

インターフェースに割り当てられたIPv6アドレスは固定された有効期限(lifetime)を持つ。より短い期間に設定されない限り、有効期限は無制限である。アドレスには、preferred lifetimeとvalid lifetimeの2つの有効期限がある。有効期限は、ルーターで設定されて自動設定によって値が提供されるか、インターフェースに手動で設定する。
アドレスがインターフェースに割り当てられたとき、そのアドレスは"preferred"の状態にあり、preferred-lifetimeの間それが継続する。preferred-lifetimeが経過すると"deprecated"の状態になり、そのアドレスを使って新しい接続はできなくなる。valid-lifetimeが経過すると"invalid"の状態になり、そのアドレスはインターフェースから除かれ、インターネットから新しいアドレスの割り当てを受ける。
注意: ほとんどの場合、新しいRouter Advertisement(RA)を受信することで有効期限のタイマーが元に戻るので、有効期限は期限切れになることはない。しかし、RAが受信できない場合、preferred-lifetimeが経過してアドレスは"deprecated"状態になる。

一時アドレス

ステートレスアドレス自動設定でインターフェース識別子を生成するのに、グローバルにユニークな固定のMACアドレスを使用している。そのため、時間がたってIPv6ネットワークプリフィックスが変わったとしても、MACアドレスによってネットワーク機器を、そしてユーザを追跡することができる。IPv6アドレスの一部とユーザが永久に結びつく危険性を減らすため、ノードは「一時アドレス」(temporary address)を作ることができる。一時アドレスは、時間によりランダムに変化するビット列に基づいたインターフェース識別子を使用し、有効期限を比較的短く（数時間から数日）することで短い時間で新しいアドレスに置き替えられる。
外部ホストがDNS問い合わせのできるパブリックアドレスを使っている場合、接続を始めるための送信元アドレスとして、一時的なアドレスを使用することができる。
Mac OS X Lion以降のmacOS、Windows Vista・Windows 2008 Server以降のマイクロソフトのOSでは、IPv6のネットワークインターフェースの設定で、デフォルトで一時アドレスを使用する設定になっている。
実際には、ISPから配布されるプレフィックスが契約ごとに固定されている運用が多く、プレフィックスと他の情報を組み合わせて使用してユーザを追跡することができるため、プライバシー保護の観点からは、限定的な効果しかない。

移行への挑戦

2009年現在、多くの家庭内ネットワークのNAT装置やルータのDNSリゾルバは、未だにAAAAレコードを不適切に取り扱う。これらのいくつかは、適切な否定のDNS応答をきちんと返さずに、単にそのようなレコードのDNS要求を破棄する。要求が破棄されるので、要求を送信しているホストはタイムアウトを待たなければならない。クライアント・ソフトウェアがIPv6接続が失敗するのを待ってからIPv4接続を行うため、デュアルスタックIPv6/IPv4ホストに接続しようとするときに、しばしば減速を引き起こす。
クライアント・ソフトウェアがHappy Eyeballsアルゴリズム（Fast Fallbackアルゴリズムとも言う）を使用することで、この問題は軽減される。このアルゴリズムは、IPv6とIPv4の接続を同時に開始し、先に接続が完了した方を使用するという物である。