跳到主要内容

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

  • 更新了SocketChannelServerSocketChannel规范,以指定 Unix 域套接字的通道的行为方式。

备择方案

应用程序可以通过 Java 本机接口 (JNI) 或巴拿马项目AF_UNIX直接访问地址结构和套接字系统调用。然而,这种类型的套接字对象与现有 API 不兼容,因此无法使用该API 与其他可选通道进行复用。SocketChannel``Selector

测试

自动单元测试将测试 API 和实现。这些测试将在所有受支持的 Unix 平台和多个版本的 Windows 上运行,包括一些支持 Unix 域套接字的版本和一些不支持的版本。

风险和假设

使用SocketChannelServerSocketChannel类的现有代码通常假设SocketAddress这些 API 返回的实例可以盲目地转换为InetSocketAddress.对于 Unix 域套接字通道,此转换将失败。