Linux socket unix domain socket

Передача данных через UNIX сокеты¶

Сокет домена Unix (англ. Unix domain socket, UDS) или IPC-сокет (сокет межпроцессного взаимодействия) — конечная точка обмена данными, подобная Интернет-сокету, но не использующая сетевой протокол для взаимодействия (обмена данными). Используется в операционных системах, поддерживающих стандарт POSIX, для межпроцессного взаимодействия.

Доменные соединения Unix являются по сути байтовыми потоками, сильно напоминая сетевые соединения, но при этом все данные остаются внутри одного компьютера (то есть обмен данными происходит локально). UDS используют файловую систему как адресное пространство имен, то есть они представляются процессами как иноды в файловой системе. Это позволяет двум различным процессам открывать один и тот же сокет для взаимодействия между собой. Однако, конкретное взаимодействие, обмен данными, не использует файловую систему, а только буферы памяти ядра.

Пример передачи в одну сторону¶

Сервер¶

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
import os import socket SOCKET_FILE = './echo.socket' if os.path.exists(SOCKET_FILE): os.remove(SOCKET_FILE) print("Открываем UNIX сокет. ") server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) server.bind(SOCKET_FILE) print("Слушаем. ") while True: datagram = server.recv(1024) if not datagram: break else: print("-" * 20) print(datagram) if b"DONE" == datagram: break print("-" * 20) print("Выключение. ") server.close() os.remove(SOCKET_FILE) print("Выполнено")

Клиент¶

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
import os import socket SOCKET_FILE = './echo.socket' print("Подключение. ") if os.path.exists(SOCKET_FILE): client = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) client.connect(SOCKET_FILE) print("Выполнено.") print("Ctrl-C чтобы выйти.") print("Отправьте 'DONE' чтобы выключить сервер.") while True: try: x = input("> ") # for py2 use raw_input if "" != x: print("ОТПРАВЛЕНО: %s" % x) client.send(x.encode('utf-8')) if "DONE" == x: print("Выключение.") break except KeyboardInterrupt as k: print("Выключение.") break client.close() else: print("Не могу соединиться!") print("Выполнено")

Источник

Читайте также:  Linux команды консоли перезагрузка

Что такое сокеты Unix и как они работают?

Сокеты Unix — это форма связи между двумя процессами, которая отображается в виде файла на диске. Этот файл может использоваться другими программами для установления очень быстрых соединений между двумя или более процессами без каких-либо сетевых накладных расходов.

Что такое сокеты?

Сокеты — это прямая связь между двумя процессами. Представьте, что вы хотите позвонить своему другу по дороге; вы можете сделать звонок, направив его через вашу телефонную компанию и обратно в их дом, или вы можете провести провод прямо в их дом и исключить посредника. Последнее, очевидно, непрактично в реальной жизни, но в мире Unix очень распространено устанавливать эти прямые связи между программами.

Собственное имя для сокетов unix — сокеты домена Unix (Unix Domain Sockets), потому что все они находятся на одном компьютере. В некотором смысле сокеты — это сеть, полностью содержащаяся в ядре; вместо того, чтобы использовать сетевые интерфейсы и соответствующие накладные расходы для отправки данных, те же самые данные могут быть отправлены напрямую между программами.

Несмотря на создание файлов на диске, сокеты Unix на самом деле не записывают данные, которые они отправляют на диск, так как это было бы слишком медленно. Вместо этого все данные хранятся в памяти ядра; единственная цель файла сокета — поддерживать ссылку на сокет и давать ему разрешения файловой системы для управления доступом.

В современных системах файлы управления сокетами обычно расположены в директории /run/. Например, файл управления сокетом MariaDB обычно находится по адресу /run/mysqld/mysqld.sock, а файл службы Tor по пути /run/tor/socks. Этот файл ничего не содержит, и вы не должны изменять его напрямую, за исключением разрешений, где это применимо. Это просто имя.

Читайте также:  Chrome kerberos authentication linux

А файлы управления сокетами обычно расположены в директории /usr/lib/systemd/system/. Например, файл управления сокетом MariaDB обычно находится по адресу:

/usr/lib/systemd/system/mariadb.socket

Это простой текстовый файл с настройками, например:

[Unit] Description=MariaDB 10.6.5 database server (socket activation) Documentation=man:mariadbd(8) Documentation=https://mariadb.com/kb/en/library/systemd/ [Socket] ############################################################################## ## USERs can override ## ## ## by creating a file in /etc/systemd/system/mariadb.socket.d/MY_SPECIAL.conf ## and adding/setting the following under [Socket] will override this file's ## settings. SocketUser=mysql SocketMode=777 ListenStream=@mariadb ListenStream=/run/mysqld/mysqld.sock ListenStream=3306 # Backlog=150

Обратите внимание на директивы ListenStream (путь до файла сокета), вторая ListenStream (номер порта), SocketUser (владелец файла сокета), SocketMode (режим, права доступа к сокету).

Как работают сокеты?

Сокеты просто предоставляют фактическое оборудование для перемещения данных. Сокеты на основе TCP называются потоковыми сокетами, куда все данные будут поступать по порядку. Сокеты на основе UDP — это сокеты для дейтаграмм, для которых порядок (или даже доставка) не гарантируется. Существуют также необработанные (raw) сокеты, которые не имеют каких-либо ограничений и используются для реализации различных протоколов и утилит, которые должны проверять низкоуровневый сетевой трафик, например Wireshark.

Сокеты обычно по-прежнему используют TCP или UDP, поскольку они не являются чем-то особенным, кроме причудливого канала внутри ядра. TCP и UDP — это транспортные протоколы, которые определяют, как данные передаются с места на место, но не заботятся о том, что это за данные. TCP и UDP обеспечивают платформу для большинства других протоколов, таких как FTP, SMTP и RDP, которые работают на более высоких уровнях.

Приложение может использовать несколько иную реализацию TCP; потоковые сокеты используют протокол SOCK_STREAM, который TCP также использует для транспорта почти всё время, и хотя они в основном взаимозаменяемы, технически они немного отличаются. Хотя это низкоуровневый материал и на самом деле это не то, о чем вам придётся беспокоиться, просто знайте, что большая часть трафика, отправляемого через сокеты домена UNIX, основана на TCP или UDP или, по крайней мере, очень похожа на трафик этих транспортных протоколов, и TCP отправляется через сокеты домена UNIX быстрее, чем TCP через сетевые интерфейсы, такие как порты.

Читайте также:  Linux mint изменить язык

Использование сокетов на практике

Сокеты Unix обычно используются в качестве альтернативы сетевым TCP-соединениям, когда процессы выполняются на одном компьютере. Данные обычно по-прежнему отправляются по тем же протоколам; но поскольку они просто остаются на той же машине, в том же домене (отсюда и название сокеты домена UNIX), поэтому им никогда не нужно беспокоить петлевой (loopback) сетевой интерфейс для подключения к самому себе.

Самым ярким примером этого является Redis, чрезвычайно быстрое хранилище значений ключей, которое полностью работает в памяти. Redis часто используется на том же сервере, который обращается к нему, поэтому обычно можно использовать сокеты. На таких низких уровнях и с учётом того, насколько быстр Redis, сокеты обеспечивают повышение производительности на 25% в некоторых синтетических тестах.

Если вы подключаетесь к базе данных MySQL, вы также можете использовать сокет. Обычно вы подключаетесь к ХОСТ:ПОРТ из удалённой системы, но если вы подключаетесь к базе данных на том же сервере (например, REST API обращается к базе данных), вы можете использовать сокеты для ускорения. При обычном использовании сокеты не дадут ощутимого прироста производительности, но при высокой нагрузке это иначе: более 20% прироста производительности на 24 ядрах высокого класса со 128 одновременными пользователями и миллионом запросов в секунду. Увидите ли вы выгоду от сокетов при описанных условиях? Да, но при такой нагрузке всё равно придётся заняться репликацией и балансировкой нагрузки.

Если вы хотите работать с сокетами вручную, вы можете использовать утилиту socat, чтобы открыть их через сетевые порты:

socat TCP-LISTEN:12345 UNIX-CONNECT:/var/lib/socket.sock

Это технически противоречит назначению сокетов домена Unix, но может использоваться для отладки на транспортном уровне.

Источник

Оцените статью
Adblock
detector