Sockets

Введение

Сокет (Socket) – абстракция конечной точки двустороннего коммуникационного канала между двумя процессами, взаимодействующими по сети или в пределах одной машины. В терминах TCP/IP сокет однозначно идентифицируется пятёркой: протокол, локальный IP-адрес, локальный порт, удалённый IP-адрес, удалённый порт.

Концепция сокетов была разработана в рамках BSD Unix в 1983 году (Berkeley Sockets). Это de facto стандарт сетевого программирования, поддерживаемый всеми операционными системами: POSIX-сокеты в Unix/Linux/macOS, WinSock (Windows Sockets API) в Windows.

История и контекст

Berkeley Sockets API появился в 4.2BSD Unix (1983) как результат работы команды Билла Джоя в Калифорнийском университете Беркли. Задача состояла в создании универсального интерфейса для работы с протоколом TCP/IP, разработанным DARPA. В 1986 году появилась библиотека WINSOCK.DLL для Windows, в 1996 году стандартизированная как WinSock 2.

С развитием веб-приложений появился стандарт WebSocket (RFC 6455, 2011) – протокол полнодуплексной связи поверх HTTP/HTTPS для браузерных приложений. WebSocket устранил ограничения HTTP-polling, позволив серверу инициировать отправку данных клиенту без запроса.

Как это работает

Жизненный цикл TCP-сокета проходит следующие стадии:

  1. Создание (socket()): системный вызов создаёт дескриптор сокета, указывается домен (AF_INET/AF_INET6), тип (SOCK_STREAM/SOCK_DGRAM) и протокол
  2. Привязка (bind()): сокет привязывается к конкретному IP-адресу и порту
  3. Ожидание (listen()): серверный сокет переходит в состояние ожидания входящих соединений с очередью backlog
  4. Принятие соединения (accept()): сервер принимает соединение, создаётся новый сокет для конкретного клиента
  5. Передача данных (send/recv или write/read): двунаправленная передача данных через установленное соединение
  6. Закрытие (close/shutdown()): четырёхшаговое завершение TCP-соединения (FIN/ACK)

UDP-сокеты (SOCK_DGRAM) не требуют установления соединения: данные отправляются датаграммами без гарантии доставки и порядка. Используются в DNS, DHCP, стриминге медиа, онлайн-играх.

Типы сокетов

  • Stream Socket (SOCK_STREAM): TCP – надёжная доставка, контроль потока, двунаправленный поток байтов
  • Datagram Socket (SOCK_DGRAM): UDP – без соединения, нет гарантии доставки, низкая задержка
  • Raw Socket (SOCK_RAW): прямой доступ к транспортному/сетевому уровню, используется в Ping, Traceroute, сниферах
  • Unix Domain Socket (AF_UNIX): межпроцессное взаимодействие в пределах одного хоста через файловую систему, выше пропускная способность, меньше overhead
  • WebSocket: полнодуплексный протокол для браузерных приложений поверх HTTP/HTTPS

Где применяется

  • Веб-серверы: каждый HTTP/HTTPS запрос – TCP-сокетное соединение
  • СУБД: PostgreSQL, MySQL принимают соединения через TCP-сокеты или Unix domain sockets
  • Real-time приложения: чаты, онлайн-игры, биржевые торговые платформы используют WebSocket
  • Микросервисная архитектура: gRPC (над TCP), межсервисное взаимодействие
  • Телекоммуникации: VoIP, медиастриминг через UDP-сокеты с RTP

Связь с другими понятиями

Сокеты работают на транспортном уровне модели OSI (уровень 4), используя протоколы TCP и UDP. В контексте Softswitch Architecture сокеты обеспечивают транспортировку сигнальных (SIP) и медиапотоков (RTP). Software-Defined Networks (SDN) управляют сетевым трафиком, который в конечном счёте передаётся через сокетные соединения на уровне конечных узлов.

В микросервисных архитектурах сокеты – базовый транспортный примитив для межсервисного взаимодействия через HTTP/2, gRPC или брокеры сообщений. Source Routing определяет путь пакетов по сети, тогда как сокеты определяют конечные точки взаимодействия.