10 Javaネットワーク
JavaネットワークAPIでは、ネットワーク機能のためのクラスを提供します。たとえば、アドレス指定、URLやURIを使用するためのクラス、サーバーに接続するためのソケット・クラス、ネットワーク・セキュリティ機能などがあります。これは、次のパッケージおよびモジュールで構成されています:
- java.net: ネットワーク・アプリケーションを実装するためのクラス。
- java.net.http: HTTPクライアントのAPIを含みます。これは、HTTP (バージョン1.1および2)への高レベルのクライアント・インタフェースおよびWebSocketインスタンスへの低レベルのクライアント・インタフェースを提供します。ビデオおよびサンプル・コードを含むこのAPIの詳細は、Java HTTPクライアントに関する項を参照してください。
                     ノート: クライアント・アプリケーションのテストおよびデバッグには、jwebserverツールを使用できます。
- javax.net: ソケット作成用のクラス。
- javax.net.ssl: セキュア・ソケット・クラス。
- jdk.httpserver: 教育やテストを目的としたHTTPサーバーを構築するためのプラットフォーム固有のAPIと、最小限のHTTPサーバーを実行するためのjwebserverツール。
- jdk.net: java.netおよびjava.nio.channelsソケット・クラスのプラットフォーム固有のソケット・オプション。
ネットワーク・システム・プロパティ
次の3つの方法のいずれかで、次のネットワーク・システム・プロパティを設定できます:
- javaコマンドの-Dオプションの使用
- System.setProperty(String, String)メソッドの使用
- $JAVA_HOME/conf/net.propertiesファイルでの指定。このファイルで指定できるのは、プロキシ関連のプロパティのみです。
特に指定がないかぎり、プロパティ値は使用されるたびにチェックされます。
詳細は、Java SE API仕様のネットワーク・プロパティに関する項を参照してください。
HTTPクライアント・プロパティ
次のプロパティの一部は、ユーザー指定の値をオーバーライドする事前定義された最小値と最大値の対象となります。プロパティが存在しても、値がない場合、ブール値のデフォルト値はtrueです。
表10-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クライアント・ストリーム・ウィンドウのサイズ(バイト単位)。 | 
IPv4およびIPv6プロトコル
これらの2つのプロパティは、起動時に1回のみチェックされます。
表10-2 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プロトコル・ハンドラおよびデフォルトのプロキシ・セレクタによって使用されます。
表10-3 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プロパティを使用します。
                     表10-4 HTTPSプロキシ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| https.proxyHost | デフォルト値なし | HTTPSプロトコル・ハンドラが使用するプロキシ・サーバーです。 | 
| https.proxyPort | 443 | HTTPSプロトコル・ハンドラが使用するポートです。 | 
FTPプロキシ・プロパティ
次のプロキシ設定がFTPプロトコル・ハンドラによって使用されます。
表10-5 FTPプロキシ・プロパティ
| システム・プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| ftp.proxyHost | デフォルト値なし | FTPプロトコル・ハンドラが使用するプロキシ・サーバーです。 | 
| ftp.proxyPort | 80 | FTPプロトコル・ハンドラが使用するポートです。 | 
| ftp.nonProxyHosts | localhost|127.*|[::1] | 
 デフォルト値には、ループバック・アドレスのあらゆる一般的なバリエーションが含まれません。 | 
SOCKSプロキシ・プロパティ
SOCKSプロキシはTCPレベルで動作するため、低レベルのトンネリングが可能です。SOCKSプロキシ・サーバーを指定すると、他のプロキシが指定されていないかぎり、すべてのTCP接続がそのプロキシ・サーバーを通過します。次のプロキシ設定がSOCKSプロトコル・ハンドラによって使用されます。
表10-6 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でユーザー名がチェックされます。この場合、パスワードは指定されません。
その他のプロキシ関連プロパティ
表10-7 その他のプロキシ関連プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| java.net.useSystemProxies | false | 
 
 このプロパティは起動時に1回のみチェックされます。 | 
| jdk.http.auth.tunneling.disabledSchemes | Basic | HTTP CONNECTメソッドを使用してプロキシ経由でHTTPSをトンネリングするときに無効になる認証スキームをリストします。 このプロパティの値は、関連するRFCで定義されている、大/小文字を区別しない認証スキーム名のカンマ区切りリストです。スキームには、 | 
| jdk.http.auth.proxying.disabledSchemes | デフォルト値なし | HTTPのプロキシ時に無効になる認証スキームをリストします。 このプロパティの値は、関連するRFCで定義されている、大/小文字を区別しない認証スキーム名のカンマ区切りリストです。スキームには、 一部の環境では、HTTPまたはHTTPSのプロキシ時に特定の認証スキームが望ましくない場合があります。たとえば、 | 
UNIXドメイン・ソケットのプロパティ
nullアドレス・パラメータを指定してServerSocketChannel.bindを呼び出すと、チャネルのソケットが自動的に割り当てられたソケット・アドレスにバインドされます。UNIXドメイン・ソケットの場合、これは事前定義されたシステムの一時ディレクトリ内の一意のパスを意味します。
                     
次のプロパティを使用して、このディレクトリの選択を制御します:
表10-8 UNIXドメイン・ソケットのプロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| java.io.tmpdir | オペレーティング・システムによって異なる | jdk.net.unixdomain.tmpdirシステム・プロパティで一時ディレクトリを特定できない場合は、java.io.tmpdirシステム・プロパティで指定されたディレクトリが使用されます。 | 
| jdk.net.unixdomain.tmpdir | 一部のプラットフォーム(一部のUNIXシステムなど)では、事前にデフォルト値が定義されています。それ以外(Windowsなど)の場合、デフォルト値はありません。 | 自動バインドされたサーバー・ソケット・アドレスに使用するディレクトリを指定します。 | 
LinuxおよびmacOSでは、このディレクトリを決定する検索順序は次のとおりです:
- システム・プロパティjdk.net.unixdomain.tmpdir(コマンドラインまたはSystem.setProperty(String, String)によって設定)
- $JAVA_HOME/conf/net.propertiesファイルに設定されている同じプロパティ
- システム・プロパティjava.io.tmpdir
Windowsでは、このディレクトリを決定する検索順序は次のとおりです:
- システム・プロパティjdk.net.unixdomain.tmpdir(コマンドラインまたはSystem.setProperty(String, String)によって設定)
- %JAVA_HOME%\conf\net.propertiesファイルに設定されている同じプロパティ
- TEMP環境変数
- システム・プロパティjava.io.tmpdir
UNIXドメイン・ソケット・アドレスの長さは(プラットフォームによっては)約100バイトに制限されているため、一時ディレクトリの名前とソケットに使用されるファイル名がこの制限を超えないようにすることが重要です。
ノート:
クライアント・ソケットがbindを呼び出さずにリモート宛先に接続されている場合、ソケットは暗黙的にバインドされます。この場合、UNIXドメイン・ソケットの名前はありません(つまり、そのパスは空です)。この動作は、システムまたはネットワークのプロパティの影響を受けません。その他のHTTP URLストリーム・プロトコル・ハンドラのプロパティ
これらのプロパティは、起動時に1回のみチェックされます。
表10-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.https.negotiate.cbt | never | TLSチャネル・バインディング・トークン(CBT)の生成および送信を制御します(HttpsURLConnectionによって、KerberosまたはKerberosを使用したNegotiate認証スキームがHTTPS上で使用される場合)。3通りの設定があります: 
 生成されるチャネル・バインディング・トークンは、RFC 5929で定義されているタイプ | 
| 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要求のためにハッシュしなければならない情報の量が減るので、クライアントとサーバーの両方で計算のオーバーヘッドが減少します。
                        
ホスト名からIPアドレスへのマッピングの指定
システム全体のリゾルバをデプロイすることで、ホスト名からIPアドレスへのマッピングをカスタマイズできます。詳細は、Java SE API仕様のInetAddressResolverProviderクラスを参照してください。本番ではない、テストなどの場合には、システム全体のリゾルバではなく、特定のhostsファイルを使用するようInetAddressを構成し、ホスト名をIPアドレスにマップできます。このhostsファイルは、システム・プロパティjdk.net.hosts.fileで指定します。
                     
ノート:
テストには、特定のhostsファイルを使用します。ホスト名の完全なリストが必ず事前にわかるわけではないため、これは汎用的な解決策にはなりません。
                     デフォルトでは、システム・プロパティjdk.net.hosts.fileは設定されていません。設定されている場合、ネーム・サービス検索は、このシステム・プロパティに指定されたファイルから取得されます。このシステム・プロパティに存在しないファイルが指定されている場合、そのファイルは空のファイルとみなされ、名前/アドレス検索でUnknownHostExceptionがスローされます。
                     
hostsファイルの構造は、LinuxまたはmacOSの/etc/hostsファイルに似ています。このテキスト・ファイルの各行は、次のような構文になっています:
                     
IPAddress hostname [host aliases...]- IPAddress: IPアドレス
- hostname: IPアドレスがマップされるホスト名- ホスト名には、英数字、ハイフン(-)およびピリオド(.)で構成される完全修飾ドメイン名(FQDN)の構文と構造が必要です。先頭および末尾は英数字であることが必要です。
- 構文チェックまたはホスト名検証は実行されないことに注意してください。
 
- ホスト名には、英数字、ハイフン(
- [host aliases...]: ホスト別名のオプションのリスト
エントリのフィールドは、任意の数の空白(スペースおよびタブ)で区切られます。
数字記号(#)で始まり、行の最後までテキストが続くコメントは無視されます。
                     
次に、hostsファイルの例を示します:
                     
# sample jdk.net.hosts.file entries
127.0.0.1 localhost
127.0.0.1 host.rabbit.hole
127.0.0.1 c1.this.domain
192.0.2.0 testhost.testdomain
192.0.2.255 testhost2.testdomainアドレス・キャッシュ・プロパティ
名前解決の実行時、java.netパッケージはセキュリティ上とパフォーマンス上の両方の理由で、アドレス・キャッシュを使用します。アドレス解決の試行は、前方解決(名前からIPアドレスへ)でも逆方向の解決(IPアドレスから名前へ)でもすべて、成功であったかどうかを問わず結果がキャッシュされます。そのため、以後の同一の要求はネーム・サービスにアクセスする必要がなくなります。これらのプロパティを使用すると、アドレス・キャッシュの動作を調整できます。
                     
表10-10 アドレス・キャッシュ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| networkaddress.cache.ttl | -1 | 
 
  セキュリティ・マネージャがインストールされている場合のデフォルト値は | 
| networkaddress.cache.negative.ttl | 10 | $JAVA_HOME/conf/security/java.securityファイルで指定され、ネーム・サービスからの失敗した名前検索のキャッシュ・ポリシーを示します。値は、失敗した名前検索がキャッシュに保持される秒数に対応する整数です。 | 
拡張例外メッセージ
デフォルトでは、セキュリティ上の理由から、例外メッセージには、ホスト名やUNIXドメイン・ソケットのアドレス・パスなどの機密性の高いセキュリティ情報は含まれません。デバッグやその他の目的でこの制限を緩和する場合は、jdk.includeInExceptionsを使用します。
                     
表10-11 拡張例外メッセージ・プロパティ
| プロパティ | デフォルト値 | 説明 | 
|---|---|---|
| jdk.includeInExceptions | デフォルト値なし | 値はキーワードのカンマ区切りリストで、メッセージが詳細情報で拡張される可能性がある例外タイプを参照します。 特に、値に文字列 |