Javaにおける IPv4 と IPv6 (IPv4 アドレスが枯渇しましたが、)

JDK1.4 以降では、ホストのプラットフォームが対応している場合に IPv6 をサポートします。IPv6 をサポートするプラットフォーム上では IPv4IPv6 の両方を自動的にサポートし、これはプログラマから見て透過的に行われます。
IPv6 は「IPv4 互換アドレス」を介してIPv4をサポートします。「IPv4 互換アドレス」は IPv6 の 128ビット中の上位 96ビットがゼロであるアドレスであり、192.168.1.2 という IPv4 のアドレスは、IPv6 では ::192.168.1.2 という IPv4 互換アドレスとして扱われます。


現在使用しているソケットが IPv4IPv6 を確認するには以下のようなコードを使用します。

if (socket.getLocalAddress() instanceof Inet6Address) {
    System.out.println("IPv6");
} else {
    System.out.println("IPv4");
}

IPv4IPv6 にて Socket.setTrafficClass() の扱いが異なります。

  • IPv4 では、RFC 791 で定義されている 8ビットのTOS(Type of Service)フィールド
  • IPv6 では、RFC 2460 で定義されている 8ビットのTC(traffic class)フィールド

通常は特に意識しない部分となります。