October 4, 2020

Сокет как программный интерфейс

Для конкретного понимания что из себя представляют сокеты, дам подробное определение из Wikipedia. Итак, название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

А теперь постараюсь объяснить своими словами. На самом деле все намного легче, по сути это конечная точка к которой можно подключаться для непосредственного обмена данными.

Стоит различать два типа сокетов, это клиентские и серверные. В качестве примера можно привести обмен данными между вебсервером и браузером. Браузер является в нашем случае - клиентом, а вебсервер - сервером. Поступающие HTTP запросы из браузера перенаправляются на вебсервер, где и происходит обработка данных.

При взаимодействии двух машин базирующийся на стеке протокола TCP/IP (чаще называют веб сокетами ), разработчику нужно использовать адрес и порт на котором будет развернут данный сокет или куда он собирается подключиться. Про особенности реализации поясню чуть позже.

Также стоит отметить, что при создании веб сокетов у вас есть выбор между TCP и UDP. Разница между ними в том, что TCP дает гарантию того, что ваши пакеты придут в целостности, что нельзя сказать про UDP. UDP обычно используют в стриминоговых сервисах, а в остальных случаях, к примеру онлайн банки, где потеря пакетов является плохим жестом, используется TCP.

Допустим мы хотим создать веб сокет, который будет базироваться на локальном хосте - это 127.0.0.1, и на 8080 порту. Адрес представляет собой 32-битную структуру для протокола IPv4, 128-битную для IPv6. Номер порта - целое число в диапазоне от 0 до 65535 (для протокола TCP).

В процессе обмена, как правило, используется два сокета — сокет отправителя и сокет получателя. Например, при обращении к серверу на HTTP-порт сокет будет выглядеть так: 127.0.0.1:8080, а ответ будет поступать на mmm.nnn.ppp.qqq:xxxxx. Каждый процесс может создать «слушающий» сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы. Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т. д.

Операционные системы типа UNIX поддерживают большое колличество типов адресов, но обязательными являются INET и UNIX адреса.

INET - это тот самый адрес, что был описан сверху (127.0.0.1:8080)

UNIX - как правило, при создании UNIX сокета, вместе с ним создается файл в ОС. Допустим вы хотите создать UNIX сокет, тогда необходимо указать название файла на который будет ссылаться ваш созданный сокет, это и будет точкой входа.

Каждый создаваемый сокет должен иметь уникальное имя.

Особенности реализации:

Функции и особенности реализации могут зависеть от языка на котором вы собираетесь реализовывать данный функционал. Так что читайте спецификацию, но в основном описанные мной методы уже присутствуют в большинстве backend языках.

Список основных функций:

socket_create - Создает сокет (UNIX или INET)

socket_connect - Подключается к сокету

socket_bind - Привязывает имя к сокету

socket_listen - Прослушивает входящие соединения на сокете

socket_accept - Принимает соединение на сокете

socket_write - Запись в сокет

socket_read - Чтение сокета

socket_close - Закрывает прослушиваемый сокет

Все описанные выше функции есть в языке PHP.

При создании серверного сокета, обычно используют функции: socket_create, socket_bind, socket_listen, socket_accept. Если вы хотите прочитать и записать на сокет достаточно использовать socket_write и socket_read.

При создании клиентского сокета, достаточно использовать socket_create, socket_connect. И такая же ситуация с записью и чтением сокета, как и в серверном.

Надеюсь что достаточно подробно описал функциональные возможности и особенности реализации. Если нет, тогда готов к дискуссиям :) Ведь в дискуссии всегда рождается истина.