9 Javaネットワーク
JavaネットワークAPIでは、ネットワーク機能のためのクラスを提供します。たとえば、アドレス指定、URLやURIを使用するためのクラス、サーバーに接続するためのソケット・クラス、ネットワーク・セキュリティ機能などがあります。これは、次のパッケージおよびモジュールで構成されています:
- java.net: ネットワーク・アプリケーションを実装するためのクラス。
- java.net.http: HTTPクライアントのAPIを含みます。これは、HTTP (バージョン1.1および2)への高レベルのクライアント・インタフェースおよびWebSocketインスタンスへの低レベルのクライアント・インタフェースを提供します。ビデオおよびサンプル・コードを含むこのAPIの詳細は、Java HTTPクライアントに関する項を参照してください。
- javax.net: ソケット作成用のクラス。
- javax.net.ssl: セキュア・ソケット・クラス。
- jdk.httpserver: JDK固有のHTTPサーバーAPIを定義します。
- jdk.net: java.netおよびjava.nio.channelsソケット・クラスのプラットフォーム固有のソケット・オプション。
ネットワーク・システム・プロパティ
次の3つの方法のいずれかで、次のネットワーク・システム・プロパティを設定できます:
- javaコマンドの-Dオプションの使用
- System.setProperty(String, String)メソッドの使用
- $JAVA_HOME/conf/net.propertiesファイルでの指定。このファイルで指定できるのは、プロキシ関連のプロパティのみです。
特に指定がないかぎり、プロパティ値は使用されるたびにチェックされます。
詳細は、Java SE API仕様の「ネットワークのプロパティ」、java.net.httpおよびjdk.httpserverモジュールを参照してください。
HTTPクライアント・プロパティ
次のプロパティの一部は、ユーザー指定の値をオーバーライドする事前定義された最小値と最大値の対象となります。プロパティが存在しても、値がない場合、ブール値のデフォルト値はtrueです。
表9-1 HTTPクライアント・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| jdk.httpclient.allowRestrictedHeaders | デフォルト値なし | ユーザーがHTTPリクエストまたはHttpRequestインスタンスのユーザー・コードで設定できる、通常制限されたHTTPヘッダー名のカンマ区切りリストです。 デフォルトでは、リクエスト・ヘッダー 名前の大文字と小文字は区別されず、空白は無視されます。このプロパティはテスト用であり、実際のデプロイメント用ではないことに注意してください。このプロパティを使用すると、プロトコル・エラーやその他の未定義の動作が発生する可能性があります。コンテキストによっては、他のヘッダーの設定が制限される場合があります。これには、関連するHttpClientにオーセンティケータ・セットがある場合、認可ヘッダーが含まれます。これらの制限は、このプロパティではオーバーライドできません。 | 
| jdk.httpclient.bufsize | 16384 (16kB) | 内部割当てバッファに使用するサイズ(バイト単位)。 | 
| jdk.httpclient.connectionPoolSize | 0 | HTTP/1.1キープ・アライブ・キャッシュ内に保持する最大接続数。0を指定すると、キャッシュの制限がなくなります。 | 
| jdk.httpclient.connectionWindowSize | 2^26 | HTTP/2クライアント接続ウィンドウのサイズ(バイト単位)。 最大サイズは2^31-1です。この値をストリーム・ウィンドウ・サイズより小さくすることはできません。 | 
| jdk.httpclient.disableRetryConnect | false | 接続失敗の自動再試行が無効かどうか。falseの場合、再試行が試みられます(再試行制限に従います)。 | 
| jdk.httpclient.enableAllMethodRetry | false | 冪等でないHTTPリクエストを自動的に再試行できるかどうか。 | 
| jdk.httpclient.enablepush | 1 | HTTP/2プッシュ・プロミスが有効かどうか。値1を指定するとプッシュ・プロミスが有効になります。値0を指定すると無効になります。 | 
| jdk.httpclient.hpack.maxheadertablesize | 16384 (16kB) | HTTP/2クライアントのHPACKヘッダー表の最大サイズ(バイト単位)。 | 
| jdk.httpclient.HttpClient.log | デフォルト値なし | JavaロギングAPI (パッケージ 値には、次のいずれかの項目のカンマ区切りリストが含まれます: 
 
 
 項目を指定すると、HTTPクライアントのログに追加されます。たとえば、次の値を指定すると、JavaロギングAPIによって、使用可能なすべてのHTTPクライアント・イベントが記録されます: 
 
 ロガーの名前は | 
| jdk.httpclient.keepalive.timeout | 1200 | アイドル状態のHTTP/1.1接続をキープ・アライブ・キャッシュでアライブに維持する秒数。 | 
| jdk.httpclient.maxframesize | 16384 (16kB) | HTTP/2クライアントの最大フレーム・サイズ(バイト単位)。サーバーはこれより大きいフレームを送信できません。 | 
| jdk.httpclient.maxstreams  | 100 | 接続当たりの最大HTTP/2ストリーム数。 | 
| jdk.httpclient.receiveBufferSize | オペレーティング・システムのデフォルト値 | HTTPクライアント・ソケット受信バッファ・サイズ(バイト単位)。 | 
| jdk.httpclient.redirects.retrylimit | 5 | リダイレクト時またはなんらかの理由で障害が発生した場合にHTTPリクエストを送信しようとする最大試行回数。 | 
| jdk.httpclient.websocket.writeBufferSize | 16384 (16kB) | ソケット書込みのためにWebソケット実装によって使用されるバッファ・サイズ。 | 
| jdk.httpclient.windowsize | 16777216 (16MB) | HTTP/2クライアント・ストリーム・ウィンドウのサイズ(バイト単位)。 | 
HTTPサーバー・プロパティ
次はJDKのデフォルトのHTTPサーバー実装で使用されるJDK固有のシステム・プロパティです。数値として解析されない文字列を指定した場合、数値を持つこれらのプロパティのいずれかがデフォルト値になります。
表9-2 HTTPサーバー・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| jdk.http.maxHeaderSize | 393216(384 kB) | HTTP、java.net.HttpURLConnectionおよび新しいHTTPクライアントjava.net.http.HttpClientのレガシーURLプロトコル・ハンドラのJDK組込み実装がリモート・パーティから受け入れる最大レスポンス・ヘッダー・サイズ。この制限は、すべてのヘッダー名とヘッダー値の累積サイズに、ヘッダー名とヘッダー値のペアごとに32バイトのオーバーヘッドを加えたものとして計算されます。 この制限を超えると、リクエストはプロトコル例外で失敗します。 このプロパティにゼロまたは負の値がある場合、制限はありません。 | 
| jdk.httpserver.maxConnections | -1 | 一度にオープンしている接続の最大数。これには、アクティブ接続とアイドル接続が含まれます。このプロパティにゼロまたは負の値がある場合、制限はありません。 | 
| sun.net.httpserver.drainAmount | 65536 | HttpHandlerによって完全に消費されていないリクエスト本文から自動的に読取りおよび破棄される最大バイト数。残りの未読バイト数がこの制限より少ない場合、接続はアイドル接続キャッシュに入れられます。そうでない場合は、閉じられます。 | 
| sun.net.httpserver.idleInterval | 30 | アイドル接続を開いたままにしておく最大期間(秒)。このタイマーには実装固有の粒度があり、指定された間隔より後にアイドル接続がクローズされる可能性があります。このプロパティにゼロまたは負の値がある場合、デフォルト値が使用されます。 | 
| sun.net.httpserver.maxIdleConnections | 200 | 同時に存在できるアイドル接続の最大数。このプロパティにゼロまたは負の値がある場合、接続は使用後に閉じられます。 | 
| sun.net.httpserver.maxReqHeaders | 200 | リクエストで受け入れられるヘッダー・フィールドの最大数。ヘッダーの読取り中にこの制限を超えた場合、接続は終了し、リクエストは無視されます。このプロパティにゼロまたは負の値がある場合、デフォルト値が使用されます。 | 
| sun.net.httpserver.maxReqHeaderSize | 393216(384 kB) | com.sun.net.httpserver.HttpServerのJDK組込み実装で受け入れられる最大リクエスト・ヘッダー・サイズ。この制限は、 jdk.http.maxHeaderSizeと同じ方法で計算されます。制限を超えた場合、接続は閉じられます。このプロパティにゼロまたは負の値がある場合、制限はありません。 | 
| sun.net.httpserver.maxReqTime | -1 | リクエスト・ヘッダーおよび本文の受信に許可される最大時間(ミリ秒)。実際の時間は、リクエスト・サイズ、ネットワーク速度およびハンドラ処理の遅延の機能です。このプロパティにゼロまたは負の値がある場合、時間は制限されません。制限を超えた場合、接続は終了し、ハンドラはIOExceptionを受信します。このタイマーには実装固有の粒度があり、指定した間隔より後にリクエストが中断される可能性があります。 | 
| sun.net.httpserver.maxRspTime | -1 | レスポンス・ヘッダーおよび本文の受信に許可される最大時間(ミリ秒)。実際の時間は、レスポンス・サイズ、ネットワーク速度およびハンドラ処理の遅延の機能です。このプロパティにゼロまたは負の値がある場合、時間は制限されません。制限を超えた場合、接続は終了し、ハンドラはIOExceptionを受信します。このタイマーには実装固有の粒度があり、指定した間隔より後にレスポンスが中断される可能性があります。 | 
| sun.net.httpserver.nodelay | false | ブール値がtrueの場合、すべての着信接続で TCP_NODELAYソケット・オプションを設定します。 | 
IPv4およびIPv6プロトコル
これらの2つのプロパティは、起動時に1回のみチェックされます。
表9-3 IPv4およびIPv6プロトコルのプロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| java.net.preferIPv4Stack | false | IPv6を利用可能なオペレーティング・システムでは、ベースとなるネイティブ・ソケットは、デフォルトではIPv6ソケットです。これによりアプリケーションは、IPv4ホストとIPv6ホストの両方に接続したり、その両方のホストからの接続を受け入れたりできます。 アプリケーションでIPv4専用ソケットを使用する場合は、このプロパティを | 
| java.net.preferIPv6Addresses | false | IPv4アドレスとIPv6アドレスの両方を持つホストを扱う場合、IPv6を利用可能なオペレーティング・システムでは、IPv6アドレスよりもIPv4アドレスの使用を優先するのがデフォルトの動作です。これは、たとえば、IPv4アドレスの表現(192.168.1.1など)に依存するアプリケーションの下位互換性を確保するためです。 このプロパティを オペレーティング・システムによって返されるアドレスの順序を保持するには、このプロパティを | 
HTTPプロキシ・プロパティ
次のプロキシ設定がHTTPプロトコル・ハンドラおよびデフォルトのプロキシ・セレクタによって使用されます。
表9-4 HTTPプロキシ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| http.proxyHost | デフォルト値なし | HTTPプロトコル・ハンドラが使用するプロキシ・サーバーです。 | 
| http.proxyPort | 80 | HTTPプロトコル・ハンドラが使用するポートです。 | 
| http.nonProxyHosts | localhost|127.*|[::1] | プロキシを介さずにアクセスするホストを示します。通常これは内部ホストを定義します。このプロパティの値は、 
 デフォルト値には、ループバック・アドレスのあらゆる一般的なバリエーションが含まれません。 | 
HTTPSプロキシ・プロパティ
HTTPS (HTTP over SSL)は、主に機密性が必要な場合に使用されるHTTPのセキュアなバージョンです(支払い用のWebサイトなど)。次のプロキシ設定がHTTPSプロトコル・ハンドラおよびデフォルトのプロキシ・セレクタによって使用されます。
ノート:
HTTPSプロトコル・ハンドラは、HTTPプロトコルと同じhttp.nonProxyHostsプロパティを使用します。
                     表9-5 HTTPSプロキシ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| https.proxyHost | デフォルト値なし | HTTPSプロトコル・ハンドラが使用するプロキシ・サーバーです。 | 
| https.proxyPort | 443 | HTTPSプロトコル・ハンドラが使用するポートです。 | 
FTPプロキシ・プロパティ
次のプロキシ設定がFTPプロトコル・ハンドラによって使用されます。
表9-6 FTPプロキシ・プロパティ
| システム・プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| ftp.proxyHost | デフォルト値なし | FTPプロトコル・ハンドラが使用するプロキシ・サーバーです。 | 
| ftp.proxyPort | 80 | FTPプロトコル・ハンドラが使用するポートです。 | 
| ftp.nonProxyHosts | localhost|127.*|[::1] | 
 デフォルト値には、ループバック・アドレスのあらゆる一般的なバリエーションが含まれません。 | 
SOCKSプロキシ・プロパティ
SOCKSプロキシはTCPレベルで動作するため、低レベルのトンネリングが可能です。SOCKSプロキシ・サーバーを指定すると、他のプロキシが指定されていないかぎり、すべてのTCP接続がそのプロキシ・サーバーを通過します。次のプロキシ設定がSOCKSプロトコル・ハンドラによって使用されます。
表9-7 SOCKSプロキシ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| java.net.socks.username | デフォルト値なし | 「SOCKSユーザー名およびパスワードの取得」を参照してください | 
| java.net.socks.password | デフォルト値なし | 「SOCKSユーザー名およびパスワードの取得」を参照してください | 
| socksProxyHost | デフォルト値なし | SOCKSプロトコル・ハンドラが使用するSOCKSプロキシ・サーバーです。 | 
| socksProxyPort | 1080 | SOCKSプロトコル・ハンドラが使用するポートです。 | 
| socksProxyVersion | 5 | サーバーでサポートされているSOCKSプロトコルのバージョン。デフォルトはSOCKS V5を示す 5ですが、SOCKS V4を表す4も指定できます。これら以外の値にプロパティを設定すると、未指定の動作が発生します。 | 
SOCKSユーザー名およびパスワードの取得
SOCKSユーザー名およびパスワードは次の方法で取得します:
- まず、アプリケーションがjava.net.Authenticatorのデフォルト・インスタンスを登録している場合、文字列SOCKS5に設定されたプロトコルと、文字列SOCKS authenticationに設定されたプロンプトで、デフォルト・インスタンスを問い合せます。
- オーセンティケータがユーザー名/パスワードを返さない場合や、オーセンティケータが登録されていない場合は、システムによってプロパティjava.net.socks.usernameとjava.net.socks.passwordの値がチェックされます。
- これらの値が存在しない場合は、システム・プロパティuser.nameでユーザー名がチェックされます。この場合、パスワードは指定されません。
その他のプロキシ関連プロパティ
表9-8 その他のプロキシ関連プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| java.net.useSystemProxies | false | 
 
 このプロパティは起動時に1回のみチェックされます。 | 
| jdk.http.auth.tunneling.disabledSchemes | Basic | HTTP CONNECTメソッドを使用してプロキシ経由でHTTPSをトンネリングするときに無効になる認証スキームをリストします。 このプロパティの値は、関連するRFCで定義されている、大/小文字を区別しない認証スキーム名のカンマ区切りリストです。スキームには、 | 
| jdk.http.auth.proxying.disabledSchemes | デフォルト値なし | HTTPのプロキシ時に無効になる認証スキームをリストします。 このプロパティの値は、関連するRFCで定義されている、大/小文字を区別しない認証スキーム名のカンマ区切りリストです。スキームには、 一部の環境では、HTTPまたはHTTPSのプロキシ時に特定の認証スキームが望ましくない場合があります。たとえば、 | 
その他のHTTP URLストリーム・プロトコル・ハンドラのプロパティ
これらのプロパティは、起動時に1回のみチェックされます。
表9-9 その他のHTTP URLストリーム・プロトコル・ハンドラのプロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| http.agent | Java/<version> | HTTPリクエストのUser-Agentリクエスト・ヘッダーで送信される文字列を定義します。文字列 Java/<version>は、プロパティで指定された文字列に追加されます。たとえば、 | 
| http.auth.digest.cnonceRepeat | 5 | 「HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ」を参照してください。 | 
| http.auth.digest.validateProxy | false | 「HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ」を参照してください。 | 
| http.auth.digest.validateServer | false | 「HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ」を参照してください。 | 
| http.auth.ntlm.domain | デフォルト値なし | 他のHTTP認証スキームと同様に、New Technology LAN Manager (NTLM)は、必要に応じてjava.net.Authenticatorクラスを使用してユーザー名とパスワードを取得します。しかし、NTLMの場合はNTドメイン名も必要です。ドメインを指定するには、次の3つのオプションがあります。 
 | 
| http.keepAlive | true | 永続(キープ・アライブ)接続をサポートするかどうかを示します。これを使用すると、複数のHTTP要求に対して再利用されるベースとなるソケット接続を許可することによって、パフォーマンスが改善されます。これが 永続接続の使用を無効にするには、このプロパティを | 
| http.KeepAlive.queuedConnections | 10 | クリーンアップのためにキューに配置される最大キープ・アライブ接続数です。 | 
| http.KeepAlive.remainingData | 512 | 再利用できるように、基礎となるソケットから削除されるデータの最大量(KB)です。 | 
| http.maxConnections | 5 | HTTP永続接続( http.keepAliveプロパティを参照)が有効な場合、この値によって、宛先ごとに同時に保持されるアイドル接続の最大数が決まります。 | 
| jdk.http.ntlm.transparentAuth | デフォルト値なし | Windowsで透過的なNew Technology LAN Manager (NTLM) HTTP認証を有効にします。 NTLMスキームには透過的認証を使用できます。このスキームでは、現在ログインしているユーザーの名前とパスワードに基づくセキュリティ資格証明を、ユーザーにプロンプトを表示せずにオペレーティング・システムから直接取得できます。 この値が設定されていない場合、透過的認証は行われません。 このプロパティには、次の3つの値があります: 
 NTLMは厳密にセキュアな認証スキームではないため、有効にする前に注意してください。 | 
HTTPダイジェスト認証メカニズムの動作を変更するシステム・プロパティ
システム・プロパティhttp.auth.digest.validateServerおよびhttp.auth.digest.validateProxyは、HTTPダイジェスト認証メカニズムの動作を変更します。ダイジェスト認証は、サーバーがユーザーのパスワードを認識していることをクライアントに証明することによって、サーバー自体をクライアントに認証させるための限定された機能をサーバーに提供します。しかし、すべてのサーバーがこの機能をサポートするわけではありません。また、デフォルトではこのチェックはオフに設定されています。オリジンでの認証に対してこのチェックを強制するには、http.auth.digest.validateServerをtrueに設定し、プロキシ・サーバーでhttp.auth.digest.validateProxyをtrueに設定します。
                        
通常、システム・プロパティhttp.auth.digest.cnonceRepeatを設定する必要はありません。このプロパティは、cnonce値を再使用する回数を決定します。このプロパティは、MD5-sessアルゴリズムを使用する場合に役に立ちます。この値を増やすと、各HTTP要求のためにハッシュしなければならない情報の量が減るので、クライアントとサーバーの両方で計算のオーバーヘッドが減少します。
                        
アドレス・キャッシュ・プロパティ
名前解決の実行時、java.netパッケージはセキュリティ上とパフォーマンス上の両方の理由で、アドレス・キャッシュを使用します。アドレス解決の試行は、前方解決(名前からIPアドレスへ)でも逆方向の解決(IPアドレスから名前へ)でもすべて、成功であったかどうかを問わず結果がキャッシュされます。そのため、以後の同一の要求はネーム・サービスにアクセスする必要がなくなります。これらのプロパティを使用すると、アドレス・キャッシュの動作を調整できます。
                     
表9-10 アドレス・キャッシュ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| networkaddress.cache.ttl | -1 | 
 
  セキュリティ・マネージャがインストールされている場合のデフォルト値は | 
| networkaddress.cache.negative.ttl | 10 | $JAVA_HOME/conf/security/java.securityファイルで指定され、ネーム・サービスからの失敗した名前検索のキャッシュ・ポリシーを示します。値は、失敗した名前検索がキャッシュに保持される秒数に対応する整数です。 | 
拡張例外メッセージ
デフォルトでは、セキュリティ上の理由から、例外メッセージには、ホスト名やUNIXドメイン・ソケットのアドレス・パスなどの機密性の高いセキュリティ情報は含まれません。デバッグやその他の目的でこの制限を緩和する場合は、jdk.includeInExceptionsを使用します。
                     
表9-11 拡張例外メッセージ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| jdk.includeInExceptions | デフォルト値なし | 値はキーワードのカンマ区切りリストで、メッセージが詳細情報で拡張される可能性がある例外タイプを参照します。 特に、値に文字列 |