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-сокета проходит следующие стадии:
- Создание (socket()): системный вызов создаёт дескриптор сокета, указывается домен (AF_INET/AF_INET6), тип (SOCK_STREAM/SOCK_DGRAM) и протокол
- Привязка (bind()): сокет привязывается к конкретному IP-адресу и порту
- Ожидание (listen()): серверный сокет переходит в состояние ожидания входящих соединений с очередью backlog
- Принятие соединения (accept()): сервер принимает соединение, создаётся новый сокет для конкретного клиента
- Передача данных (send/recv или write/read): двунаправленная передача данных через установленное соединение
- Закрытие (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 определяет путь пакетов по сети, тогда как сокеты определяют конечные точки взаимодействия.