openjdk.ruOpenJDK на русском

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-домена такое приведение завершится ошибкой.