IPv6アドレス
IPv6アドレスとは、IPv6コンピュータネットワークにおいてコンピュータ等のノードのネットワークインターフェースを判別するための番号（IPアドレス）である。
IPアドレスは、ホストの個々のネットワークインターフェースを特定し、ホスト間でIPパケットのルーティングを行うために使用される。IPアドレスはパケットのヘッダに記載され、そのパケットの送信元と送信先を示している。
IPv6は、インターネットにおいて最初に使用されたIPv4を継承している。IPv4が32ビットのIPアドレスを使用するのに対し、IPv6は128ビットのIPアドレスを使用する。このため、IPv6はIPv4と比べて非常に大きなIPアドレス空間を持っている。
IPv6アドレスは、以下の3種類に分類される。
IPv6にはブロードキャストアドレスは存在せず、その機能はマルチキャストアドレスが果たす。
IPv6アドレスは128ビットのアドレス幅を持っている。アドレスは、アドレス指定とルーティングの方法により、ユニキャストアドレス、マルチキャストアドレス、エニーキャストアドレスに分類される。これらのそれぞれに、論理的に128のアドレス・ビットをビット・グループに分け、これらのビット・グループの値を特別なアドレス指定機能と結びつけることによって、様々なアドレス・フォーマットが存在する
ユニキャストアドレスとエニーキャストアドレスは、通常2つの部分に分けられる。前半の64ビット（サブネットプリフィックス）はルーティングに使用され、後半の64ビット（インターフェース識別子）はサブネット内での個別のインターフェースを指し示す。
ネットワークプリフィックス（「ルーティングプリフィックス」と「サブネットID」）は、アドレスの中の上位64ビットである。ルーティングプリフィックスのサイズは可変である。プリフィックスのサイズが大きくなると、その分だけサブネットIDのサイズが小さくなる。サブネットIDのビットのフィールドは、ネットワーク管理者が与えられたネットワーク内でサブネットを定義するのに使用することができる。64ビットの「インターフェース識別子」は、インターフェースのMACアドレスからmodified EUI-64（注意）を使用して自動的に決定されるか、DHCPv6サーバから取得するか、ランダムに決定されるか、手動で設定するかのいずれかで決められる。
リンクローカルアドレスもまたインターフェース識別子に基づいているが、ネットワークプリフィックスとは異なるフォーマットになっている。
"prefix"（プリフィックス）フィールドは二進数の値 1111111010 であり、54個のゼロがその後に続く。全てのリンクローカルアドレスのネットワークプリフィックスは同じ（fe80::/64 : リンクローカルアドレスプリフィックス）になり、それがルーティング不可であることを示す。
マルチキャストアドレスは、いくつかの特別なルールに従ってフォーマットされている。
全てのマルチキャストアドレスで、"prefix"（プリフィックス）は二進数の値 11111111 である。
"flg"（フラグ）フィールドの4つのビットのうち3つは値の意味が定義されているが、最上位ビットは将来のために予約されている。
4ビットのスコープフィールド ("sc") は、アドレスが有効でユニークとなる有効範囲を示すのに使われる。
要請ノード(solicited-node)には特別なマルチキャストアドレスが与えられる。
"sc"（スコープ）フィールドは二進数値 0010 （リンクローカル）である。要請ノードマルチキャストアドレスは、ユニキャストアドレスやエニーキャストアドレスの最後の24ビットをマルチキャストアドレスの最後の24ビットに写して作られる。
リンク範囲(link-scoped)マルチキャストアドレスは、互換性のあるフォーマットを使用する。
IPv6アドレスは、128ビットを16ビットずつの8つのグループに区切ってそれぞれのグループを4桁の十六進数で表記し、グループとグループの間をコロンで仕切る。例えば以下のように表現される。
十六進数は大文字・小文字を区別しないが、IETFでは小文字を使用するよう推奨している。この表記は、以下に示す方法で短く表現することができる。
各区切りの先頭の連続する0は省略できる。このルールを適用すると、上記に例示したアドレスは以下のように表記できる。
1つ以上の0だけのグループは、"::"で表すことができる。このルールを適用すると、上記に例示したアドレスは以下のように表記できる。
localhost（ループバック）アドレス 0:0:0:0:0:0:0:1 は ::1 と、IPv6未指定アドレス 0:0:0:0:0:0:0:0 は :: と表現できる。1つのアドレス内では :: は1回しか使用できない。これは、:: を2回以上使用すると、それぞれの省略した箇所のビット長がわからなくなるためである。
IPv4とIPv6が混在している環境で、IPv4をIPv6に変換して使用する場合、下位32ビットにIPv4アドレスを含んだIPv4変換IPv6アドレスやIPv4射影IPv6アドレスを使用する。この場合、IPv4アドレスの部分を、通常IPv4アドレスを表記するときに使用する、十進数と"."による記法で表現することができる。例えば、IPv4射影IPv6アドレスの ::ffff:c000:0280 は ::ffff:192.0.2.128 と表現することができる。
IPv6アドレスを単純化しようとしたとき、標準の規定ではIPアドレスの表現に柔軟性がある。しかし、そのために同一のIPアドレスについて複数の表現が許されることになり、特定のIPアドレスをテキストファイルやトラフィックの中から探したり、2つのアドレスが同一であるかを調べたりするのが困難になる。
IETFは、この問題を軽減するために、IPv6アドレスをテキストで表現する際の規範的なフォーマットの規定を RFC 5952 として提案した。この規定は以下の通りである。
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アドレスのコロン(:)は、URIやURLのような資源識別子の確立した文法と競合する。コロンは伝統的にホストパスとポート番号の区切りに使用されてきた。この競合を軽減するため、資源識別子の中ではIPv6アドレス を角括弧（[]）で囲む。例えば、以下のようにする。
URLがポート番号を含む場合は以下のようにする。
Microsoft Windowsオペレーティングシステムでは、IPv4アドレスはUniform Naming Convention(UNC)のパス名に含めることができる。しかし、UNCパス名ではコロンは文法的に意味を持っているため、IPv6アドレスはそのままではUNCパス名に使用できない。このため、マイクロソフトはUNCパスに使用できるドメイン名にIPv6アドレスを含められるような変換アルゴリズムを実装している。このために、マイクロソフトはセカンドレベルドメイン"ipv6-literal.net"をインターネット上で登録し、保持している。IPv6アドレスは、以下のように、この名前空間のホスト名やサブドメイン名に変換される。
は以下のように変換される。
この表記は、マイクロソフトのソフトウェアによってDNSサーバを介さずに自動的に名前解決される。IPv6アドレスがゾーンインデックスを含む場合、それは文字"s"に続けてアドレス部に追加される。
未指定アドレス(::)以外の全てのIPv6アドレスは「スコープ」(scope)を持っている。スコープは、そのアドレスが有効である範囲を特定するのに使用する。
ユニキャストアドレスでは、リンクローカルアドレスとループバックアドレスは"link-local"のスコープを持っている。"link-local"スコープは、そのアドレスが直接接続(link)されているネットワークでのみ使用されることを意味する。
ユニークローカルアドレスを除くそれ以外のアドレスは、"global"（または"universal"）のスコープを持つ。"global"スコープは、そのアドレスが世界的にルーティング可能であり、全ての箇所において"global"スコープのアドレスと、直接接続のネットワークにおいて"link-local"スコープのアドレスと接続可能であることを意味する。
ユニークローカルアドレスは世界的にルーティング可能ではなく、そのアドレスはそれが使われているネットワークの範囲内でのみ有効である。ユニークローカルアドレスは、ルーティング・テーブルが特にそれを許可するように構成されたルータやトンネルによってのにルーティングされる。
エニーキャストアドレスのスコープは、ユニキャストアドレスのスコープと同様に定義される。
マルチキャストのために、マルチキャストアドレスの2つ目のオクテットの最下位から4番目のビット(ff0"s"::)がアドレスのスコープ(scope)、すなわち、マルチキャスト・アドレスが伝達される範囲を示す。現在定義されているスコープは以下の通りである。
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倍（約倍）である。IPv6アドレスの全アドレス空間は2個（340,282,366,920,938,463,463,374,607,431,768,211,456個、約個、340澗個、340兆の1兆倍の1兆倍）もあるため、予見できる将来に対して十分である。
それぞれのRIRは1つの/23ブロックを512個の/32のブロックに分割することができ、一般的には1つのISPに対して1つの/32ブロックを割り当てる。ISPは割り当てられた/32ブロックを個の/48ブロックに分割することができ、一般的には1人の顧客に対して1つの/48ブロックを割り当てる。顧客は割り当てられた/48ブロックから個の/64のネットワークを作ることができる。/64のネットワークには2個（18,446,744,073,709,551,616個）のアドレスが収容できる。これでもIPv4の全アドレス空間（2個、4,294,967,296個、約個）の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において特別な意味を持つアドレスがある。それを以下に挙げる。
マルチキャストアドレス ff0X::（Xは十六進数の値）は予約されており、いかなるマルチキャストグループにも割り当ててはならない。Internet Assigned Numbers Authority(IANA)がアドレスの予約を管理している。
ff0X::の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ビットからなるマルチキャストアドレスが用いられる。
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から配布されるプレフィックスが契約ごとに固定されている運用が多く、プレフィックスと他の情報を組み合わせて使用してユーザを追跡することができるため、プライバシー保護の観点からは、限定的な効果しかない。
IPv6利用可能なネットワークインタフェースは、通常2つ以上のIPv6アドレスを持っている。例えばリンクローカルとグローバルアドレス、恒久アドレスと一時アドレスなどである。
IPv6はアドレススコープと選択優先性(selection preference)の概念を導入している。選択優先性は、他のホストと接続するときに送信元と宛先のアドレスを選択するために複数の選択を与える。
優先選択アルゴリズムは、特定の宛先（デュアルスタック実装におけるIPv4射影IPv6アドレスを含む）の中で通信において最も適切なアドレスを選択するアルゴリズムであり、各々のルーティングプリフィックスを優先順位レベルと結びつけるカスタマイズ可能な選択テーブルに基づいている。デフォルトのテーブルは以下の通りである。
デフォルト設定は、IPv4よりもIPv6を優先し、できるだけ小さなスコープの宛先を優先する。そのため、他の条件が同じならば、グローバルにルーティングされた経路よりもリンクローカルの通信の方が優先される。プリフィックスポリシーテーブルはルーティングテーブルに似ている。すなわち、優先順位の値がルーティングテーブルにおける接続コストの役割として働き、より高い優先度はより大きい値として表される。
送信元アドレスは宛先アドレスと同じラベルの値により評価される。アドレスはビット列の最上位からの最長一致によってプリフィックスと比較される。候補の送信元アドレスはオペレーティングシステムから取得し、候補の宛先アドレスはDNS問合せによって取得する。
ホストの全てのリンクローカルアドレスは共通のプリフィックスを持つので、リンクローカルの宛先にパケットを送信するとき、出て行くインターフェースを選ぶのに通常のルーティング手順を用いることができない。そこで、ゾーンインデックス("zone index")と呼ばれる特別な識別子を用いて付加的なルーティングの情報を提供する。
アドレスが文字で書かれているとき、ゾーンインデックスはアドレスの後にパーセント記号(%)で区切って付加する。ゾーンインデックスの実際の構文は、OSに依存する。
ゾーンインデックスの表記は、Uniform Resource Identifier(URI)の中で使用する時に文法的に競合するため、パーセント記号"%"をパーセントエンコーディングによって回避しなければならない。例 http://[fe80::3%25eth0]
Domain Name System(DNS)では、"AAAA"リソースレコード（クアッドAレコード）によってホスト名をIPv6アドレスに対応づけしている。DNS逆引きのために、IETFはドメイン名ip6.arpaを維持しており、その名前空間は、後述するようにIPv6アドレスを4ビット（ニブル）単位で1桁ずつの十六進数に分けた物になっている。この仕組みは RFC 3596 で定義されている。
IPv4と同様、DNSではそれぞれのホストは2つのDNSレコード、アドレスレコードと逆引きポインターレコードによって表現される。例えば、"derrick"という名前のホストコンピュータが"example.com"ドメインにあり、ユニークローカルアドレス fdda:5cc1:23:4::1f を持っているとする。そのAAAAアドレスレコードは
となり、IPv6逆引きポインターレコードは
となる。
このポインターレコードは、d.f.ip6.arpaゾーンの権限の委任のチェーンに従って、いくつかのゾーンで定義される。
DNSプロトコルはトランスポート層プロトコルから独立している。要求されるデータのアドレスファミリに関係なく、DNSの問合せと応答はIPv6とIPv4のどちらによってでも送信される。
2009年現在、多くの家庭内ネットワークのNAT装置やルータのDNSリゾルバは、未だにAAAAレコードを不適切に取り扱う。これらのいくつかは、適切な否定のDNS応答をきちんと返さずに、単にそのようなレコードのDNS要求を破棄する。要求が破棄されるので、要求を送信しているホストはタイムアウトを待たなければならない。クライアント・ソフトウェアがIPv6接続が失敗するのを待ってからIPv4接続を行うため、デュアルスタックIPv6/IPv4ホストに接続しようとするときに、しばしば減速を引き起こす。
クライアント・ソフトウェアがアルゴリズム（Fast Fallbackアルゴリズムとも言う）を使用することで、この問題は軽減される。このアルゴリズムは、IPv6とIPv4の接続を同時に開始し、先に接続が完了した方を使用するという物である。