IPv6 in Java
アプレッソ
開発部
吉田 哲也
2013/06/10
Q:
IPv6対応にする場合、何かソー
スコードの修正は必要ですか?
A:
必要ありません。再ビルドも必
要ありません。
以上
http://docs.oracle.com/javase/jp/6/technotes/guides/net/ipv6_guide/index.html (日本語)
ネットワーク IPv6 ユーザーガイド
Java での IPv6 の使用
IPv6 を Java で使用するのは簡単かつ透過的で自動的に行われます。
その他の多くの言語とは異なり、移植は必要ありません。
実際、ソースファイルの再コンパイルさえ必要 ありません。
http://docs.oracle.com/javase/7/docs/technotes/guides/net/ipv6_guide/index.html (英語)
基本
• Solaris、LinuxはJ2SE 1.4でIPv6対応、
Windows版はJ2SE 5.0でIPv6対応
• 「InetAddressクラス」のサブクラスの
「Inet4Address」、「Inet6Address」が
加わった。
InetAddressに追加されたメ
ソッドメソッド 説明
boolean isAnyLocalAddress() 1.4 InetAddress がワイルドカードアドレスかどうかを調べるユーティリティールーチ
ンです。
boolean isLoopbackAddress() 1.4 InetAddress がループバックアドレスかどうかを調べるユーティリティールーチン
です。
boolean isLinkLocalAddress() 1.4 InetAddress がリンクローカルアドレスかどうかを調べるユーティリティールーチ
ンです。
boolean isSiteLocalAddress() 1.4 InetAddress がサイトローカルアドレスかどうかを調べるユーティリティールーチ
ンです。
boolean isMCGlobal() 1.4 マルチキャストアドレスにグローバルスコープがあるかどうかを調べるユーティリ
ティールーチンです。
boolean isMCNodeLocal() 1.4 マルチキャストアドレスにノードスコープがあるかどうかを調べるユーティリ
ティールーチンです。
boolean isMCLinkLocal() 1.4 マルチキャストアドレスにリンクスコープがあるかどうかを調べるユーティリ
ティールーチンです。
boolean isMCSiteLocal() 1.4 マルチキャストアドレスにサイトスコープがあるかどうかを調べるユーティリ
ティールーチンです。
boolean isMCOrgLocal() 1.4 マルチキャストアドレスに組織スコープがあるかどうかを調べるユーティリティー
ルーチンです。
String getCanonicalHostName() 1.4 この IP アドレスに対応する完全指定ドメイン名を取得します。
static InetAddress getByAddress(byte[] addr) 1.4 指定された生の IP アドレスを表す InetAddress オブジェクトを返します。
static InetAddress getByAddress(String host,
byte[] addr)
1.4 指定されたホスト名および IP アドレスに基づいて InetAddress を作成します。
boolean isReachable(int timeout) 1.5 そのアドレスに到達可能かどうかをテストします。
boolean isReachable(NetworkInterface netif, int
ttl, int timeout)
1.5 そのアドレスに到達可能かどうかをテストします。
Inet6Addressのメソッド
メソッド 説明
boolean isIPv4CompatibleAddress() 1.4 InetAddress が IPv4 互換の IPv6 アドレスかどうかを調べるユーティリティー
ルーチンです。
static Inet6Address getByAddress(String host,
byte[] addr, int scope_id)
1.5 InetAddress.getByAddress(String,byte[]) とまったく同様にして Inet6Address
を作成します。
static Inet6Address getByAddress(String host,
byte[] addr, NetworkInterface nif)
1.5 InetAddress.getByAddress(String,byte[]) とまったく同様にして Inet6Address
を作成します。
ちょっと脱線・・・
• isReachable()
– 通常の実装では、特権を取得できる場合は
ICMP ECHO REQUEST を使用し、それ以外の場
合は接続先ホストのポート 7 (Echo) 上で
TCP 接続を確立しようとします。
JavaプラットホームでのIPv6の
動作
1. IPv6を基本となるOSでサポートしているかどうかを確認し
ます。
2. (デュアルスタックシステムの場合)
IPv6がサポートされている場合は、IPv6スタックを使用
(=IPv6ソケットを作成)しようとします。
2. (個別スタックシステムの場合)
IPv4通信とIPv6通信用に1つずつ、合計2つのソケットを作
成します。クライアント側のTCPアプリケーションでは、ソ
ケットが接続されると、インターネットプロトコルファミ
リータイプが固定され、もう1つのソケットが閉じられま
す。サーバー側のTCPアプリケーションでは、次のクライア
ント要求がどのIPファミリータイプから送信されるかを知
る方法がないため、2つのソケットを維持しておく必要があ
ります。UDP アプリケーションでは、通信の継続期間中、
両方のソケットが必要です。
Socketの実装クラス
• Windows Vista以降
– java.net. DualStackPlainSocketImpl
– This class defines the plain SocketImpl that is used on Windows platforms
greater or equal to Windows Vista. These platforms have a dual layer TCP/IP
stack and can handle both IPv4 and IPV6 through a single file descriptor.
• Windows Vistaより前
– java.net.TwoStacksPlainSocketImpl
– This class defines the plain SocketImpl that is used for all Windows version
lower than Vista. It adds support for IPv6 on these platforms where
available. For backward compatibility Windows platforms that do not have
IPv6 support also use this implementation, and fd1 gets set to null during
socket creation.
– second fd, used for ipv6 on windows only. fd1 is used for listeners and for
client sockets at initialization until the socket is connected. Up to this
point fd always refers to the ipv4 socket and fd1 to the ipv6 socket. After
the socket becomes connected, fd always refers to the connected socket
(either v4 or v6) and fd1 is closed. For ServerSockets, fd always refers to
the v4 listener and fd1 the v6 listener.
Q:
IPv4ソケットでのみ接続したい
んですが、どのようにすればい
いですか?
A:
システムプロパティ
java.net.preferIPv4Stack=trueを
設定してください。
IPv6 を利用可能なオペレーティングシステムでは、基本と
なるネイティブソケットは IPv6 ソケットです。このため、
Java(TM) アプリケーションは、IPv4 ホストと IPv6 ホス
トの両方に接続したり、その両方のホストからの接続を受
け入れたりできます。
IPv4 ソケットだけを使用するよう設定されているアプリ
ケーションでは、このプロパティーを true に設定できま
す。つまり、そのアプリケーションは IPv6 ホストと通信
できないということです。
実行例
java.net.preferIPv4Stack=false (デフォルト)
java.net.preferIPv4Stack=true
Q:
IPv6アドレスを優先したいんで
すが、どのようにすればいいで
すか?
A:
システムプロパティ
java.net.preferIPv6Addresses=tr
ueを設定してください。
IPv6 を利用可能なオペレーティングシステムでは、デフォルトの設定
として、IPv4 マップのアドレスを IPv6 アドレスよりも優先するよう
になっています。これは、下位互換性の理由によります。 たとえば、
IPv4 だけのサービスへのアクセスに依存するアプリケーション
や、%d.%d.%d.%d の形式で表現された IP アドレスに依存するアプリ
ケーションとの互換性のためです。
IPv6 アドレスを IPv4 アドレスよりも優先する設定を試してみるには、
このプロパティーを true に設定します。そうすれば、アプリケー
ションが IPv6 サービスに接続されると予想される環境でアプリケー
ションをテストし、そのような環境にアプリケーションを配置するこ
実行例
java.net.preferIPv6Addresses=false (デフォルト)
java.net.preferIPv6Addresses=true

IPv6 in Java