JEP 380: Unix-Domain Socket Channels
Каналы сокетов Unix-домена
| Ответственный | Michael McMahon |
| Тип | Feature |
| Область | SE |
| Статус | Closed / Delivered |
| Выпуск | 16 |
| Компонент | core-libs / java.nio |
| Обсуждение | nio dash dev at openjdk dot java dot net |
| Трудоёмкость | S |
| Длительность | M |
| Рецензенты | Alan Bateman, Brian Goetz, Chris Hegarty |
| Одобрен | Brian Goetz |
| Создан | 2020/02/06 09:45 |
| Обновлён | 2021/06/29 09:00 |
| Задача | 8238588 |
Аннотация
Добавить поддержку сокетов Unix-домена (AF_UNIX) в API каналов сокетов и каналов серверных сокетов в пакете java.nio.channels. Расширить механизм наследуемых каналов, чтобы он поддерживал каналы сокетов Unix-домена и каналы серверных сокетов Unix-домена.
Цели
Сокеты Unix-домена используются для межпроцессного взаимодействия (IPC) на одном хосте. В большинстве отношений они похожи на сокеты TCP/IP, но адресуются путями в файловой системе, а не адресами Internet Protocol (IP) и номерами портов. Цель этого JEP — поддержать все возможности сокетов Unix-домена, общие для основных Unix-платформ и Windows. Каналы сокетов Unix-домена будут вести себя так же, как существующие каналы TCP/IP, в отношении чтения и записи, установки соединения, приёма входящих соединений серверами, мультиплексирования с другими неблокирующими каналами, поддерживающими выборку, в селекторе и поддержки соответствующих параметров сокетов.
Что не является целью
Целью не является поддержка возможностей, которые не являются общими для основных Unix-платформ и Windows. Сюда относятся возможности, специфичные для Linux, например абстрактное пространство имён, не зависящее от файловой системы. Сюда также относятся возможности, которые, как правило, поддерживаются в Unix, но не поддерживаются в Windows, например пары сокетов. К поддержке этих возможностей можно будет вернуться в будущем, если понадобится, а в случае возможностей, отсутствующих в Windows, — если платформа Windows будет развиваться и начнёт их поддерживать. Исключение из этого пункта — поддержка учётных данных удалённой стороны (peer credentials), которую можно реализовать как специфичный для JDK параметр сокета на платформах, где она поддерживается. Другие параметры сокетов могут быть изучены в рамках последующей работы, возможно, также как параметры, специфичные для JDK, после завершения этого JEP.
Мотивация
Для локального межпроцессного взаимодействия сокеты Unix-домена и безопаснее, и эффективнее, чем соединения TCP/IP через loopback-интерфейс.
-
Сокеты Unix-домена предназначены исключительно для взаимодействия между процессами в одной системе. Приложения, которые не должны принимать удалённые соединения, могут повысить безопасность, используя сокеты Unix-домена.
-
Сокеты Unix-домена дополнительно защищены механизмами контроля доступа на основе файловой системы, которые обеспечивает операционная система.
-
У сокетов Unix-домена меньше время установки соединения и выше пропускная способность при передаче данных, чем у соединений TCP/IP через loopback-интерфейс.
-
Сокеты 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-домена.
Альтернативы
Приложение могло бы обращаться к структурам адресов AF_UNIX и системным вызовам сокетов напрямую, либо через Java Native Interface (JNI), либо через проект Panama. Однако сокетные объекты такого типа были бы несовместимы с существующим API SocketChannel и поэтому не могли бы мультиплексироваться с другими каналами, поддерживающими выборку, с помощью API Selector.
Тестирование
API и реализацию будут проверять автоматические модульные тесты. Эти тесты будут запускаться на всех поддерживаемых Unix-платформах и на нескольких версиях Windows, включая как версии с поддержкой сокетов Unix-домена, так и версии без неё.
Риски и допущения
Существующий код, использующий классы SocketChannel и ServerSocketChannel, часто предполагает, что экземпляры SocketAddress, возвращаемые этими API, можно без проверки приводить к InetSocketAddress. С каналами сокетов Unix-домена такое приведение завершится ошибкой.