ぺーぺーSEのブログ

備忘録・メモ用サイト。

Java6ネットワークプロパティ(HotSpot)

Javaプロパティ

java.net.preferIPv4Stack (default: false)

IPv6を利用可能なオペレーティングシステムでは、基本となるネイティブソケットはIPv6ソケット。
このため、Javaアプリケーションは、IPv4ホストとIPv6ホストの両方に接続したり、その両方のホストからの接続を受け入れたりできる。
IPv4ソケットだけを使用するよう設定されているアプリケーションでは、このプロパティをtrueに設定できる。
つまり、そのアプリケーションはIPv6ホストと通信できないということになる。

java.net.preferIPv6Addresses (default: false)

IPv6を利用可能なオペレーティングシステムでは、デフォルトの設定として、IPv4マップのアドレスをIPv6アドレスよりも優先する(下位互換のため)。
例えば、IPv4だけのサービスへのアクセスに依存するアプリケーションや、%d.%d.%d.%dの形式で表現されたIPアドレスに依存するアプリケーションとの互換性のため。
IPv6アドレスをIPv4アドレスよりも優先するには、このプロパティをtrueに設定する。

networkaddress.cache.ttl

java.securityで指定して、ネームサービスからの名前の検索に【成功】した場合のキャッシングポリシーを示す。
指定する値の単位は、成功した検索結果をキャッシュする秒数であり、-1はキャッシュ時間無限を意味する。
デフォルトでは、セキュリティマネージャがインストールされている場合はずっとキャッシュし、セキュリティマネージャがインストールされていない場合は実装固有の期間キャッシュする。

  • セキュリティマネージャとは?

Javaのライブラリは、セキュリティーチェックを行うように作られている。
実行時にセキュリティーポリシーを設定しておけば、許可した動作しか出来なくなる(許可されない動作を行おうとすると、例外が発生する)。
ローカルで実行されるJavaアプリケーションは、デフォルトではセキュリティーチェックを行わない。
もともとは、ネット上で動くアプリ(Javaアプレット)の動作制限を行う為のものらしい。
この制限を行ってJavaVMの実行を限定した範囲のことをサンドボックス(砂場)と呼ぶ。
セキュリティーマネージャーを登録するには、プログラム内でセキュリティーマネージャーを登録する方法と、javaコマンドのオプションでセキュリティーマネージャーを有効にする方法がある。

プログラム内で登録する例:
  public static void main(String[] args) {
    System.setSecurityManager(new SecurityManager());
    〜
  }
javaコマンドで有効にする例:
> java -Djava.security.manager 実行対象クラス
  • セキュリティーポリシーファイル

セキュリティー機能を有効にすると、セキュリティーポリシーファイルの内容にしたがってセキュリティー制限が設定される。
デフォルトで読み込まれるセキュリティーポリシーファイルは「${java.home}/lib/security/java.policy」。
独自に作ったポリシーファイルを適用するには、javaコマンドの実行オプションでポリシーファイルを指定する。

> java -Djava.security.manager -Djava.security.policy=ポリシーファイル 実行対象クラス


networkaddress.cache.negative.ttl (default: 10)

java.securityで指定して、ネームサービスからの名前の検索に【失敗】した場合のキャッシングポリシーを示す。
指定する値は、失敗した検索結果をキャッシュする秒数を示す整数であり、0はキャッシュしない、-1はキャッシュ時間無限を意味する。

http.proxyHost (default: <なし>)
http.proxyPort (default: 80 (http.proxyHost が指定された場合))
http.nonProxyHosts (default: <なし>)

http.proxyHostとhttp.proxyPortは、HTTPプロトコルハンドラが使用するプロキシサーバとポートを示す。
http.nonProxyHostsは、プロキシサーバ経由ではなく、直接接続するホストを示す。
ホストのリストを指定することができ、それぞれのホストを「|」で区切る。
また、ワイルドカード文字(*)によるマッチング指定も可能。
例)「-Dhttp.nonProxyHosts="*.foo.com|localhost"」

ftp.proxyHost (default: <なし>)
ftp.proxyPort (default: (ftp.proxyHost が指定された場合))
ftp.nonProxyHosts (default: <なし>)

ftp.proxyHostとftp.proxyPortは、FTPプロトコルハンドラが使用するプロキシサーバとポートを示す。
ftp.nonProxyHostsは、http.nonProxyHostsと同様、プロキシサーバ経由ではなく、直接接続するホストを示す。

http.agent (default: Java1.4.0)

HTTP要求に入れて送信されるUser-Agent要求ヘッダーを示す。

http.auth.digest.validateServer (default: false)
http.auth.digest.validateProxy (default: false)
http.auth.digest.cnonceRepeat (default: 5)

HTTPダイジェスト認証機能の動作を変更を行う。
ダイジェスト認証は、サーバがユーザパスワードを認識していることをクライアントに証明することによって、サーバ自体をクライアントに認証させるための限定された機能をサーバに提供する。
しかし、すべてのサーバがこの機能をサポートするわけではない。
上記の最初の2つのプロパティをtrueに設定して、オリジンサーバまたはプロキシサーバを使用した認証で、このチェック機能を使用することができる。
通常はhttp.auth.digest.cnonceRepeatを設定する必要はない。
このプロパティは、cnonce値を再使用する回数を決定し、MD5-sessアルゴリズムを使用する場合に有効。
この値を増やすと、各HTTP要求のためにハッシュしなければならない情報の量が減るので、クライアントとサーバの両方で計算のオーバーヘッドを削減することができる。

http.auth.ntlm.domain:

他のHTTP認証方式と同様、NTLMではjava.net.Authenticatorクラスを使用して、ユーザ名とパスワードを必要時に入手する。
NTLMの場合はNTドメイン名が必要となる。
ドメインを指定する方法には、次の3つの方法がある。

  1. ドメインを指定しない。環境によっては、ドメインを実際に必要とせず、アプリケーションで指定する必要がない。
  2. ユーザー名の前にドメイン名+円記号「\」をつけることで、ドメイン名をユーザ名にエンコードする。この方法では、ユーザがこの表記方法を使用しなければならないということを意識すれば、Authenticatorクラスを使用する既存のアプリケーションを変更する必要がない。
  3. ドメイン名を方法2)で指定せず、システムプロパティhttp.auth.ntlm.domainが定義されている場合、このプロパティの値をドメイン名として使用できる。


http.keepAlive (default: true)

KeepAlive接続をサポートするかどうかを示す。
KeepAlive接続を使用すると、複数のHTTP要求に対して再利用される基本となるのソケット接続を許可することによって、パフォーマンスが改善される。
デフォルトはtrueで、HTTP1.1サーバでKeepAlive接続が使用される。
持続接続の使用を無効にするには、falseを設定する。

http.maxConnections (default: 5)

HTTPのKeepAlive接続が有効な場合、この値は、宛先ごとに同時にKeepAliveされるアイドル接続の数になる。


SOCKSプロトコルサポートの設定

SOCKSユーザ名およびパスワードは次の方法で取得する。
まず、アプリケーションがjava.net.Authenticatorのデフォルトインスタンスを登録している場合、文字列「SOCKS5」に設定されたプロトコルと、文字列[SOCKSauthentication]に設定されたプロンプトで、デフォルトインスタンスがクエリされる。
オーセンティケータがユーザー名/パスワードを返さない場合や、オーセンティケータが登録されていない場合は、システムによってユーザー設定"java.net.socks.username"と"java.net.socks.password"が確認される。
これらの設定が存在しない場合は、システムプロパティuser.nameでユーザー名が確認される。
この場合、パスワードは指定されない。

socksProxyHost
socksProxyPort (default: 1080)

SOCKSプロトコル層で使用されるSOCKSプロキシサーバの名前とポート番号を示す。
socksProxyHostを指定した場合、すべてのTCPソケットは、接続を確立したり受け入れたりする際にそのSOCKSプロキシサーバを使用する。
SOCKSプロキシサーバとしてはSOCKSv4またはv5サーバのどちらも使用可能で、認証されない接続も可能である必要がある。


Sun固有実装プロパティ

ここに列挙するプロパティは、将来のリリースでサポートされなくなる可能性がある。

sun.net.inetaddr.ttl

Sunに固有のシステムプロパティで、networkaddress.cache.ttlに対応する。
プロパティの値と意味は同じだが、コマンド行オプションとして設定できる点が異なる。
前述のセキュリティプロパティを使用する方が望ましい。

sun.net.inetaddr.negative.ttl

Sunに固有のシステムプロパティで、networkaddress.cache.negative.ttlに対応する。
プロパティの値と意味は同じだが、コマンド行オプションとして設定できる点が異なる。
前述のセキュリティプロパティを使用する方が望ましい。

sun.net.client.defaultConnectTimeout (default: -1)
sun.net.client.defaultReadTimeout (default: -1)

java.net.URLConnectionで使用されるプロトコルハンドラに対して、デフォルトの接続およびリードタイムアウトを指定する。
sun.net.client.defaultConnectTimeoutは、ホストへの接続を確立する際のタイムアウト(ミリ秒)を指定する。
HTTP接続、FTP接続共にサポートする。
sun.net.client.defaultReadTimeoutは、リソースへの接続が確立されている際の入力ストリームから読み取るタイムアウト(ミリ秒)を指定する。

sun.net.http.retryPost (default: true)

成功しなかったHTTP POST要求がサーバに自動的に再送信されるかどうかを指定する。
「成功しなかった」とは、サーバが有効なHTTP要求または発生したIOExceptionを送信しなかったことを意味する。


JNDI DNSサービスプロバイダの設定

ここに列挙するプロパティは、将来のリリースでサポートされなくなる可能性がある。

sun.net.spi.nameservice.provider.=

使用できるネームサービスプロバイダを指定する。
デフォルトでは、Javaはシステムに構成された名前検索機構を使用する(file、nis等)。
このオプションを設定すると、独自の名前サービスプロバイダを指定できる。
nには、正の数値を指定する。
この数値は優先順位を示しており、小さい値ほど優先順位が高くなる。
J2SETM1.4では、JNDIを使用して1つのDNSネームサービスプロバイダが提供されており、その名前は「dns,sun」。

sun.net.spi.nameservice.nameservers=

使用するDNSサーバを指すIPアドレスを、カンマで区切ったリストとして指定する。
sun.net.spi.nameservice.nameserversプロパティが定義されていない場合、プラットフォームのDNS設定で定義済みのネームサーバを使用する。

sun.net.spi.nameservice.domain=

デフォルトのDNSドメイン名を指定する。
sun.net.spi.nameservice.domainプロパティが定義されていない場合、プラットフォームのDNS設定で構成済みのドメインまたはドメイン検索リストを使用する。