JEP 380:Unix 域套接字通道
概括
将 Unix 域 ( AF_UNIX
) 套接字支持添加到包中的套接字通道和服务器套接字通道API java.nio.channels
。扩展继承的通道机制以支持Unix域套接字通道和服务器套接字通道。
目标
Unix 域套接字用于同一主机上的进程间通信 (IPC)。它们在大多数方面与 TCP/IP 套接字相似,只是它们是通过文件系统路径名而不是 Internet 协议 (IP) 地址和端口号来寻址的。此 JEP 的目标是支持主要 Unix 平台和 Windows 中常见的 Unix 域套接字的所有功能。 Unix 域套接字通道在读/写行为、连接设置、服务器接受传入连接、与选择器中的其他非阻塞可选通道复用以及相关套接字支持方面与现有 TCP/IP 通道的行为相同选项。
非目标
支持主要 Unix 平台和 Windows 上不常见的功能并不是我们的目标。这包括 Linux 特定的功能,例如独立于文件系统的抽象命名空间。它还包括 Unix 上通常支持但 Windows 上不支持的功能,例如套接字对。如果需要,并且在缺少 Windows 功能的情况下,如果 Windows 平台发展到支持它们,将来可以重新考虑对这些功能的支持。这个非目标的一个例外是对对等凭证的支持,它可以在支持它的平台上作为 JDK 特定套接字选项来实现。在此 JEP 完成后,其他套接字选项可能会作为后续工作进行研究,也可能作为 JDK 特定选项进行研究。
动机
对于本地进程间通信,Unix 域套接字比 TCP/IP 环回连接更安全、更高效。
-
Unix 域套接字严格用于同一系统上的进程之间的通信。不打算接受远程连接的应用程序可以通过使用 Unix 域套接字来提高安全性。
-
Unix 域套接字受到操作系统强制、基于文件系统的访问控制的进一步保护。
-
与 TCP/IP 环回连接相比,Unix 域套接字具有更快的设置时间和更高的数据吞吐量。
-
对于需要同一系统上的容器之间进行通信的容器环境,Unix 域套接字可能是比 TCP/IP 套接字更好的解决方案。这可以使用位于共享卷中的套接字来实现。
Unix 域套接字长期以来一直是大多数 Unix 平台的一项功能,现在 Windows 10 和 Windows Server 2019 均支持该功能。
描述
为了支持 Unix 域套接字通道,我们将添加以下 API 元素:
-
一个新的套接字地址类,
java.net.UnixDomainSocketAddress
; -
UNIX
现有枚举中的常量值java.net.StandardProtocolFamily
; -
指定协议族的新
open
工厂SocketChannel
方法ServerSocketChannel
-
更新了
SocketChannel
和ServerSocketChannel
规范,以指定 Unix 域套接字的通道的行为方式。