网络属性

有一些标准系统属性用于改变 java.net 包的各种类的机制和行为。有些只在 VM 启动时检查一次,因此最好使用 java 命令的 -D 选项进行设置,而另一些则具有更动态的特性,也可以使用 System.setProperty() API 进行更改。本文档的目的是列出并详细说明所有这些属性。

如果没有特别说明,每次使用时都会检查一个属性值。

IPv4 / IPv6

  • java.net.preferIPv4Stack (默认值:false)
    如果 IPv6 在操作系统上可用,则默认情况下,底层本机套接字将是一个 IPv6 套接字,它允许应用程序连接到 IPv4 和 IPv6 主机,并接受来自它们的连接。但是,如果应用程序宁愿使用仅 IPv4 套接字,则可以将此属性设置为true.这意味着应用程序将无法与仅使用 IPv6 的主机进行通信。

  • java.net.preferIPv6Addresses (默认值:false)
    当处理同时具有 IPv4 和 IPv6 地址的主机时,如果 IPv6 在操作系统上可用,则默认行为是优先使用 IPv4 地址而不是 IPv6 地址。这是为了确保向后兼容性:例如,对于依赖于 IPv4 地址表示的应用程序(例如 192.168.1.1)。该属性可以设置为true更改该首选项并在可能的情况下使用 IPv6 地址而不是 IPv4 地址,或者系统保留系统范围 解析器 返回的地址顺序。

这两个属性只在启动时检查一次。

代理

代理服务允许间接连接到网络服务,主要用于安全(通过防火墙)和性能原因(代理通常提供缓存机制)。以下属性允许配置各种类型的代理。

  • HTTP

    HTTP 协议处理程序使用以下代理设置。

    • http.proxyHost (默认值:<none>)
      代理服务的主机名或地址。

    • http.proxyPort (默认值:80
      代理服务的端口号。

    • http.nonProxyHosts (默认值:localhost|127.*|[::1]
      指示无需通过代理即可访问的主机。通常这定义了内部主机。此属性的值是主机列表,由“|”分隔特点。此外,通配符'*'可用于模式匹配。例如,-Dhttp.nonProxyHosts="*.foo.com|localhost" 表示即使指定了代理服务,也应直接访问 foo.com 域中的每个主机和本地主机。

      默认值不包括环回地址的所有常见变体。

  • HTTPS
    这是 HTTP over SSL,一种安全的 HTTP 版本,主要用于需要保密性(如支付网站)的情况。

    HTTPS 协议处理程序使用以下代理设置。

    • https.proxyHost (默认值:<none>)
      代理服务的主机名或地址。

    • https.proxyPort (默认值:443
      代理服务的端口号。

      HTTPS 协议处理程序将使用与 HTTP 协议相同的 nonProxyHosts 属性。

  • FTP

    FTP 协议处理程序使用以下代理设置。

    • ftp.proxyHost (默认值:<none>)
      代理服务的主机名或地址。

    • ftp.proxyPort (默认值:80
      代理服务的端口号。

    • ftp.nonProxyHosts (默认值:localhost|127.*|[::1]
      指示无需通过代理即可访问的主机。通常这定义了内部主机。此属性的值是主机列表,由“|”分隔特点。此外,通配符'*'可用于模式匹配。例如,-Dhttp.nonProxyHosts="*.foo.com|localhost" 表示即使指定了代理服务,也应直接访问 foo.com 域中的每个主机和本地主机。

      默认值不包括环回地址的所有常见变体。

  • SOCKS
    这是另一种代理。它允许较低级别的隧道类型,因为它在 TCP 级别工作。实际上,在 Java(tm) 平台设置中,SOCKS 代理服务将导致所有 TCP 连接都通过该代理,除非指定了其他代理。如果 Java SE 实现支持 SOCKS,则将使用以下属性:

    • socksProxyHost (默认值:<none>)
      代理服务的主机名或地址。

    • socksProxyPort (默认值:1080
      代理服务的端口号。

    • socksProxyVersion (默认值:5
      服务支持的 SOCKS 协议版本。默认值是 5 表示 SOCKS V5。或者,可以为 SOCKS V4 指定 4。将属性设置为这些值以外的值会导致未指定的行为。

    • java.net.socks.username (默认值:<none>)
      如果 SOCKSv5 服务要求身份验证但未找到 java.net.Authenticator 实例,则使用的用户名。

    • java.net.socks.password (默认值:<none>)
      如果 SOCKSv5 服务要求身份验证但未找到 java.net.Authenticator 实例,则使用密码。

      请注意,如果没有为上述属性或 Authenticator 提供身份验证,而代理需要一个,则user.name属性将在没有密码的情况下使用。

  • java.net.useSystemProxies (默认值:false
    在 Windows 系统、macOS 系统和 Gnome 系统上,可以告诉 java.net 堆栈,将此属性设置为true, 使用系统代理设置(所有这些系统都允许您通过其用户界面全局设置代理)。请注意,此属性仅在启动时检查一次。

其他 HTTP URL 流协议处理程序属性

  • http.agent (默认值:“Java/<版本>”)
    定义在 http 请求的 User-Agent 请求标头中发送的字符串。请注意,字符串“Java/<version>”将附加到属性中提供的字符串(例如,如果使用-Dhttp.agent="foobar",则如果 VM 的版本为1.5.0)。此属性仅在启动时检查一次。

  • http.keepAlive (默认值:true
    指示是否应支持持久连接。它们通过允许将底层套接字连接重用于多个 HTTP 请求来提高性能。如果将其设置为 true,则将请求与 HTTP 1.1 服务的持久连接。

  • http.maxConnections (默认值:5
    如果启用 HTTP keepalive(见上文),此值确定每个目的地同时保持活动状态的最大空闲连接数。

  • http.keepAlive.time.server http.keepAlive.time.proxy

    在服务(或代理)未指定保活时间的情况下,这些属性会修改 HTTP 保活缓存的行为。如果在这种情况下设置了该属性,则空闲连接将在指定的秒数后关闭。如果设置了该属性,并且服务确实在“Keep-Alive”响应标头中指定了保持活动时间,则使用服务指定的时间。如果该属性未设置且服务未指定保持活动时间,则连接将在实现定义的时间内保持活动状态,假设 http.keepAlivetrue

  • http.maxRedirects (默认值:20
    对于给定的请求,此整数值确定协议处理程序将自动遵循的 HTTP 重定向的最大数量。

  • http.auth.digest.validateServer (默认值:false

  • http.auth.digest.validateProxy (默认值:false

  • http.auth.digest.cnonceRepeat (默认值:5

    这 3 个属性修改了 HTTP 摘要认证机制的行为。摘要式身份验证为服务提供了一种有限的能力来向客户端验证自己(即通过证明它知道用户的密码)。但是,并非所有 HTTP 服务都支持此功能,默认情况下它是关闭的。前两个属性可以设置为 true 以强制执行此检查以分别使用源服务或代理服务进行身份验证。

    通常不需要更改第三个属性。它决定了一个 cnonce 值被重复使用的次数。这在使用 MD5-sess 算法时很有用。通过减少必须为每个 HTTP 请求散列的材料量,增加此值可减少客户端和服务的计算开销。

  • http.auth.ntlm.domain (默认值:<none>)
    NTLM 是另一种身份验证方案。它使用 java.net.Authenticator 类在需要时获取用户名和密码。但是,NTLM 也需要 NT 域名。指定该域有 3 个选项:

    1. 不要指定它。在某些环境中,域实际上不是必需的,应用程序也不必指定它。

    2. 域名可以在用户名中编码,方法是在域名前加前缀,然后在用户名前加上反斜杠“\”。使用此方法,无需修改使用身份验证器类的现有应用程序,只要让用户知道必须使用此表示法即可。

    3. 如果在方法 2) 中未指定域名并且定义了此属性,则其值将用作域名。

  • http.auth.digest.reEnabledAlgorithms (默认值:<none>)
    默认情况下,某些消息摘要算法由于其经过验证的安全限制而被禁用以用于 HTTP 摘要身份验证。这仅适用于代理身份验证和纯文本 HTTP 服务身份验证。禁用的算法仍然可用于 HTTPS 服务身份验证。禁用算法的默认列表在 java.security 属性文件中指定,目前包括 MD5SHA-1。如果仍然需要使用其中一种算法,则可以通过将此属性设置为以逗号分隔的算法名称列表来重新启用它们。

  • jdk.https.negotiate.cbt (默认值:<never>)
    当通过 HttpsURLConnection 通过 HTTPS 使用 Kerberos 或使用 Kerberos 的协商身份验证方案时,这将控制 TLS 通道绑定令牌 (CBT) 的生成和发送。共有三种可能的设置:

    1. “绝不”。如果未设置该属性,这也是默认值。在这种情况下,永远不会发送 CBT。

    2. “总是”。为通过 HTTPS 的所有 Kerberos 身份验证尝试发送 CBT。

    3. “domain:<comma separated domain list>” 列表中的每个域都指定了一个或多个目标主机,CBT 将针对这些主机发送。域可以是单个主机,如 foo 或 foo.com,或 RFC 2732 中指定的文字 IP 地址,或匹配 foo.com 及其子域下的所有主机的通配符,如 *.foo.com。 CBT 不会发送到与列表条目之一不匹配的任何目的地

    生成的通道绑定令牌属于 RFC 5929 中定义的“tls-server-end-point”类型。

所有这些属性只在启动时检查一次。

Address Cache

出于安全和性能原因,java.net 包在进行名称解析时使用地址缓存。任何地址解析尝试,无论是正向(名称到 IP 地址)还是反向(IP 地址到名称),无论成功与否,都会缓存其结果,以便后续相同的请求不必访问命名服务。这些属性允许对缓存的运行方式进行一些调整。

  • networkaddress.cache.ttl (默认:see below)
    值是一个整数,对应于成功名称查找将保留在缓存中的秒数。值 -1 或任何其他负值表示“永远缓存”策略,而值 0(零)表示不缓存。如果安装了安全管理器,则默认值为 -1(永远),如果未安装安全管理器,则默认值为特定于实现。

  • networkaddress.cache.negative.ttl (默认值:10
    值是一个整数,对应于不成功的名称查找将保留在缓存中的秒数。值 -1 或任何负值表示“永远缓存”,而值 0(零)表示不缓存。

由于这 2 个属性是安全策略的一部分,它们不是由 -D 选项或 System.setProperty() API 设置的,而是被设置为安全属性。

Unix domain sockets

使用 null 地址参数调用 ServerSocketChannel.bind 将绑定到一个自动分配套接字地址。对于 Unix 域套接字,这意味着某个预定义系统临时目录中的唯一路径。有许多系统(和网络)属性会影响此行为。

Unix 域套接字地址的长度限制在大约 100 字节(取决于平台),重要的是要确保临时目录的名称和用于套接字的文件名(当前名称类似于 socket_1679697142 )不超过此限制.以下属性可用于控制此目录的选择:

  • jdk.net.unixdomain.tmpdir 这可以在 conf/net.properties 中设置为网络属性 如果设置,这将指定用于自动绑定服务套接字地址的目录。在某些平台上(例如某些 Unix 系统),这将具有预定义的默认值。在其他系统(例如 Windows)上,没有默认值。无论哪种方式,始终可以使用在命令行上设置的同名系统属性覆盖网络属性。如果既没有设置网络属性也没有设置系统属性,那么一些系统(例如Windows)可能会检查一个常用的环境变量作为临时目录。

  • java.io.tmpdir 如果上一步未能找到要使用的目录,则使用系统属性 java.io.tmpdir 标识的目录。

有关平台特定行为的更多信息,请参见conf/net.properties 配置文件。

隐含的SocketChannel 的绑定

如果客户端套接字连接到远程目标而没有先调用 bind,则套接字是含蓄地边界。在这种情况下,Unix域socket是无名(即他们的路径是空的)。此行为不受任何系统或网络属性的影响。

增强的异常消息

默认情况下,出于安全原因,异常消息不包含潜在的敏感安全信息,例如主机名或 Unix 域套接字地址路径。以下属性可用于放宽此限制,用于调试和其他目的。
  • jdk.includeInExceptions 这通常设置为逗号分隔的关键字列表,这些关键字引用异常类型,其消息可能会通过更详细的信息得到增强。如果该值包含字符串hostInfo,则套接字地址将包含在异常消息文本中(例如主机名、Unix 域套接字地址路径)。