モジュール java.base
パッケージ java.net

クラスInet6Address

java.lang.Object
java.net.InetAddress
java.net.Inet6Address
すべての実装されたインタフェース:
Serializable

public final class Inet6Address extends InetAddress
このクラスは、インターネット・プロトコル・バージョン6 (IPv6)アドレスを表します。 RFC 2373: IP Version 6 Addressing Architectureによって規定されています。

IPv6アドレスのテキスト表現

メソッドの入力として使用されるIPv6アドレスのテキスト表現は、次のいずれかの形式になります。
  1. 推奨の形式はx:x:x:x:x:x:x:xです。ここで、「x」は、アドレスを8つの16ビット部分に分けて16進数で表した値です。 これは完全な形式です。 たとえば、

    • 1080:0:0:0:8:800:200C:417A

    各フィールド内の先頭部分のゼロは記述する必要がない点に注意してください。 ただし、次に説明する場合を除いて、各フィールドには少なくとも1つの数値が必要です。

  2. 特定スタイルのIPv6アドレスを割り当てるためのいくつかの方式が原因となり、アドレス内にゼロ・ビットの長い列が含まれることがよくあります。 ゼロ・ビットを含むアドレスを記述しやすくするため、ゼロを圧縮する特殊な構文が利用できます。 「::」の使用は、ゼロだけから成る16ビットのグループが複数存在することを示します。 「::」は、1つのアドレス内で1回しか使えません。 また、「::」を使えば、アドレス内の先頭のゼロまたは末尾のゼロ、あるいはその両方を圧縮することもできます。 たとえば、

    • 1080::8:800:200C:417A
  3. IPv4およびIPv6ノードが混在する環境に対応する場合にさらに便利な代替形式がx:x:x:x:x:x:d.d.d.dです。ここで、xは上位6つの16ビット・アドレスの16進数値で、dは下位4つの8ビット標準IPv4表現アドレスの10進数値です。たとえば、

    • ::FFFF:129.144.52.38
    • ::129.144.52.38

    ここで、「::FFFF:d.d.d.d」と「::d.d.d.d」はそれぞれ、一般的な形式のIPv4マップIPv6アドレスとIPv4互換IPv6アドレスです。 IPv4部分は「d.d.d.d」の形式でなければいけない点に注意してください。 次の形式は無効です。

    • ::FFFF:d.d.d
    • ::FFFF:d.d
    • ::d.d.d
    • ::d.d

    次の形式は有効です。

    • ::FFFF:d

    ただし、これは、次のIPv4互換IPv6アドレスの、慣例に従わない表現です。

    • ::255.255.0.d

    ここで、「::d」は一般的なIPv6アドレス「0:0:0:0:0:0:0:d」に対応します。

テキスト表現を出力値として返すメソッドでは、完全な形式が使用されます。 Inet6Addressが完全な形式を返すのは、ほかのテキスト・データと組み合わせて使用する場合にも、あいまいにならないからです。

特殊なIPv6アドレス

IPv4マップ・アドレス
::ffff:w.x.y.zの形式では、このIPv6アドレスはIPv4アドレスを表すために使用されます。 このアドレスを利用すると、ネイティブ・プログラムでは、IPv4ノードとIPv6ノードの両方と通信する際に、同じアドレス・データ構造と、さらには同じソケットを使用できます。

InetAddressとInet6Addressでは、これは内部の表現に使用され、機能上の役割はありません。 JavaからIPv4マップ・アドレスが返されることはありません。 これらのクラスは、バイト配列とテキスト表現の両方で、IPv4マップ・アドレスを入力として取ることができます。 ただし、そのアドレスはIPv4アドレスに変換されます。

IPv6スコープ・アドレスのテキスト表現

前述したIPv6アドレスのテキスト表現を拡張して、IPv6スコープ・アドレスを指定できます。 基本的なアドレス指定アーキテクチャに対するこの拡張については、RFC 4007: IPv6スコープ付きアドレスのアーキテクチャを参照してください。

リンク・ローカル・アドレスとサイト・ローカル・アドレスはグローバルではありません。このため、複数のホストが同一の送信先アドレスを持ち、同一の送信元システム上の異なるインタフェース経由でそれらのホストに到達できる可能性があります。 この場合、その送信元システムは、同一スコープの複数のゾーンに接続されています。 どれが目的の送信先ゾーンであるかを明確にするために、ゾーン識別子(scope_id)をIPv6アドレスの末尾に追加することができます。

scope_idの一般的な指定形式は、次のとおりです。

IPv6-address%scope_id

IPv6-addressは、前述のリテラルIPv6アドレスです。 scope_idはローカル・システム上のあるインタフェースを参照します。これを指定するには次の2つの方法があります。

  1. 数値識別子として指定。 これは、システムが認識できる特定のインタフェースとスコープを識別する正の整数である必要があります。 この数値は通常、システム上の管理ツールを使用することで決定できます。 各インタフェースは、スコープごとに1つずつ、複数の値を持つことができます。 スコープが未指定の場合、使用されるデフォルト値はゼロです。
  2. 文字列として指定する。 これは、対象となる特定のインタフェースに対してNetworkInterface.getName()から返された文字列と正確に一致しなければいけません。 Inet6Addressがこの方法で作成される場合は、そのオブジェクトを生成するときに関連するNetworkInterfaceに問い合わせることで、数値のスコープIDが決定されます。

また、NetworkInterfaceクラスから返されたInet6Addressインスタンスから数値scope_idを取得することもできます。 これを使えば、システム上で設定されている現在のスコープIDを確認できます。

メソッド入力としてのIPv6アドレスのテキスト表現

IPv6アドレスのテキスト表現を受け入れるInetAddressおよびInet6Addressのメソッドを使用すると、その表現を大カッコで囲むことができます。 たとえば、

 // The full IPv6 form
 InetAddress.getByName("1080:0:0:0:8:800:200C:417A");   // ==> /1080:0:0:0:8:800:200c:417a
 InetAddress.getByName("[1080:0:0:0:8:800:200C:417A]"); // ==> /1080:0:0:0:8:800:200c:417a

 // IPv6 scoped address with scope-id as string
 Inet6Address.ofLiteral("fe80::1%en0");   // ==> /fe80:0:0:0:0:0:0:1%en0
 Inet6Address.ofLiteral("[fe80::1%en0]"); // ==> /fe80:0:0:0:0:0:0:1%en0

導入されたバージョン:
1.4
外部仕様
関連項目: