Что такое сокет и зачем он нужен
Эта статья расширяет ваш кругозор в вопросах устройства компьютеров и их софта. Текст про важную вещь в сетевой архитектуре, и он будет полезен тем, кто собирается проектировать софт, как-то связанный с интернетом.
Чтобы разобраться в том, что такое сокеты и чем они так полезны, нужно кое-что вспомнить из статей про IP-адреса и про порты в программировании. Вот короткая выжимка из этих статей:
- У каждого компьютера в сети есть IP-адрес, даже если это просто локальная сеть.
- IP-адрес — это четыре числа от 0 до 255, разделённые точками, например 77.88.55.88 (это адрес сервера Яндекса).
- С помощью этих адресов компьютеры знают, куда направить свои запросы и ответы.
- Когда один компьютер соединяется с другим, они это делают через сетевой порт. Можно сказать, что порт — это номер соединения.
- Сетевые порты в компьютере нумеруются от 1 до 65535, а компьютер сам следит за тем, как распределяются эти номера.
- С помощью портов компьютер понимает, какие данные предназначены какой программе.
- Некоторые программы и соединения всегда используют один и тот же порт, а другие получают его случайным образом.
Главное: что такое сокет
Сокет — это виртуальная конструкция из IP-адреса и номера порта. Её придумали для того, чтобы разработчикам было проще писать код, а программы могли передавать данные друг другу даже в пределах одного компьютера.
⭐ Можно представить, что сокет — это виртуальная труба, которую строят между двумя приложениями, чтобы гонять между ними данные. Приложения видят только концы трубы, а как проходит трубопровод — они не знают и им неважно.
Смысл в том, чтобы программист работал не с IP-адресами и портами, разбираясь в тонкостях работы протоколов, а использовал что-то попроще. В итоге получается так:
- программист пишет в программе, что он хочет сделать новый сокет;
- указывает для него IP-адрес, если это необходимо;
- программа собирает это в виртуальную конструкцию, и получается сокет;
- после этого программист может отправлять данные просто в сокет и принимать их оттуда, а компьютер берёт на себя все вопросы по передаче данных.
Для чего нужны сокеты
Сокеты используют для двух вещей:
Как работает передача по сети, расскажем ниже, а сейчас поговорим про связь между приложениями. Идея в том, что если на компьютере запустить два приложения и в каждом из них настроить сокеты, то можно передавать данные из одного в другое даже без API. Например, на внутренних сокетах работают многие служебные программы — так они передают данные в операционную систему.
На сокетах работает половина интернета. Например, чтобы получить данные из мобильного приложения, сервер запускает у себя сокет для связи с приложением. Каждое приложение тоже открывает свой сокет, связывается через него с сервером, и так они обмениваются данными.
Но сокет на сервере один, а желающих подключиться к нему — много. Чтобы решить эту проблему, сервер копирует сокеты.
Копирование сокетов и множественные подключения
Когда на сервер поступает запрос на соединение с сокетом, он не устанавливает связь напрямую, а копирует этот сокет и настраивает связь через него. После копирования сервер запоминает, какая копия отвечает за какое соединение, и дальше просто обрабатывает все запросы по очереди. При этом исходный сокет остаётся нетронутым — он не используется для связи напрямую, а служит шаблоном для создания копий.
Если бы сервер так не делал, то с ним могло бы соединиться только одно приложение — первое, которое успело подключиться.
Что дальше
А дальше сделаем проект — напишем серверную и клиентскую часть и будем передавать данные между ними через сокеты, чтобы увидеть, как это работает в жизни. Подпишитесь, чтобы не пропустить проект.
Этот рекламный блок сообщает, что после обучения в «Яндекс Практикуме» вы можете получить высокооплачиваемую работу разработчика, тестировщика, аналитика, менеджера и дата-сайентиста.
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Сетевые сокеты
Сетевые сокеты — способ взаимодействия любого приложения с системой на которой оно работает. Сокет — это интерфейс, который по сути представляет собой совокупность адреса в сети и используемого порта. Также часто термин употребляется применительно к Socket API, о котором рассказывается во второй части материала.
Приложение работает на сервере, подключенном к сети: глобальной или локальной.
Интерфейс между приложением и хост-машиной (Network-Application Interface) определяет как приложение может использовать сеть.
Сетевые сокеты и клиент серверная модель
Приложение клиента запрос (к MySQL, например) на определенный сетевой адрес и порт. В примере это localhost и порт 3306 — сервер в свою отвечает приложению.
К приложению при этом могут обращаться множество клиентов. Запросы и использованием сокета приходят на один и тот же адрес и обрабатываются одним пакетом. Так работает клиент-серверая модель взаимодействия.
В рамках одной системы часто используются Unix сокеты. Такой способ взаимодействия быстрее.
Один сервис может работать и по Unix сокету и по сетевому сокету в зависимости от настроек.
Примером может быть php-fpm.
Сервис часто запускается на unix сокете и в настройках nginx настраивается проксирование на него. Столь же часто она запускается на адресе 127.0.0.1 и порту 9000 или любом другом.
Чтобы написать приложение, которое могло бы обслуживать множество клиентов (последовательно и параллельно) нужно сокет API
Socket API — интерфейс используемый всеми интернет приложениями.
Socket API при соединении 2-х приложений может работать с потоками и с датаграммами :
- потоки — отправка потока байтов с гарантированной доставкой
- датаграммы — отдельные сообщения без гарантии доставки
Сетевой сокет — комбинация IP адреса и номера порта, которые представляют собой способ адресации.
Адрес и порт обеспечивают нормальное взаимодействие большого количества приложений в рамках одной системы.
Один сокет не может использовать два приложения одновременно или два экземпляра одного приложения.
Вызовы в Socket API
SOCKET — вызов создает структуру
BIND — связывает локальный адрес с сокетом
LISTEN — заявляет о готовности установить соединение
ACCEPT — принимает входящее соединение
CONNECT — пробует установить соединение
SEND — отправляет данные в рамках соединения
RECEIVE — принимает информацию в рамках соединения
CLOSE — прерывает соединение
В нагруженных системах иногда применяют socat, инструмент, позволяющий системе работать с сервисом на другом хосте так, как будто он доступен локально.