Поиск по сайту:

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


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

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

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

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

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

/var/lib/mysql/mysql.sock

Этот файл ничего не содержит, и вы не должны изменять его напрямую, за исключением разрешений, где это применимо. Это просто имя.

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

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

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

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

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

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

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

Если вы подключаетесь к базе данных MySQL, вы также можете использовать сокет. Обычно вы подключаетесь к host:port из удаленной системы, но если вы подключаетесь к базе данных на том же сервере (например, REST API обращается к базе данных), вы можете использовать сокеты. для ускорения. Это не повлияет на обычное использование, но очень заметно под нагрузкой, более 20% на высокопроизводительном 24-ядерном процессоре со 128 одновременными пользователями и миллионом запросов в секунду. Увидите ли вы выгоду от сокетов — это отдельная история, но в этот момент вы, вероятно, все равно захотите заняться репликацией и балансировкой нагрузки.

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

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

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