На предыдущую страницу

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

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

Сокет (от англ. socket — «разъём, гнездо») — это программный интерфейс для обмена данными между процессами. Процессы могут находиться как на одной машине, так и на разных узлах сети. Фактически сокет — это конечная точка соединения: через него приложение отправляет и принимает данные, не вникая в детали физической транспортировки.

Концепция появилась в UNIX-системах в начале 1980-х годов в рамках реализации стека BSD TCP/IP. С тех пор она стала стандартом: сокеты поддерживаются во всех современных ОС — Linux, Windows, macOS — и реализованы в каждом распространённом языке программирования. Браузеры, мессенджеры, серверы баз данных, API-шлюзы — всё это работает поверх сокетного интерфейса.

Для чего нужен сокет?

Сокет выступает абстракцией транспортного уровня. Разработчику достаточно открыть сокет, указать адрес и порт назначения и начать обмен — детали маршрутизации, контроля ошибок и сборки пакетов берёт на себя операционная система. Это принципиально упрощает создание сетевых приложений.

По протоколу передачи сокеты делятся на три основных типа:

  • TCP-сокеты (SOCK_STREAM) — обеспечивают надёжную, упорядоченную доставку данных с подтверждением. Применяются там, где критична целостность данных: HTTP/HTTPS, FTP, SSH, SMTP.
  • UDP-сокеты (SOCK_DGRAM) — работают без установки соединения, не гарантируют доставку и порядок пакетов. Используются в потоковом видео, DNS, VoIP и онлайн-играх, где скорость важнее надёжности.
  • Unix domain-сокеты (AF_UNIX) — предназначены для межпроцессного взаимодействия внутри одной ОС, без выхода в сеть. Быстрее TCP за счёт полного исключения сетевого стека.

Каждый сокет идентифицируется парой «IP-адрес : порт». Сервер открывает сокет в режиме прослушивания (listen), клиент инициирует соединение (connect). После установки соединения обе стороны обмениваются данными симметрично, используя вызовы send/recv или read/write.

Запросить консультацию технического специалиста

Копирование сокетов

В UNIX-системах сокет представлен файловым дескриптором — целым числом, которое процесс передаёт ядру при системных вызовах. Это позволяет применять стандартный механизм дублирования: вызов dup() создаёт новый дескриптор, указывающий на тот же сокет. Оба дескриптора ссылаются на одно соединение, и закрытие одного из них не прерывает его — соединение остаётся активным до тех пор, пока не будут закрыты все его копии.

Такой подход широко используется при разветвлении процессов (fork): дочерний процесс автоматически наследует все дескрипторы родителя, включая сокеты. Это позволяет реализовать классическую модель «один процесс — одно соединение». Альтернатива — многопоточные серверы и асинхронная модель ввода-вывода (epoll на Linux, kqueue на BSD/macOS), при которой единственный процесс управляет тысячами сокетов одновременно, не блокируясь на каждом из них. Именно эта модель лежит в основе высоконагруженных серверов: nginx, Node.js и большинства современных фреймворков.

Оцените данную статью
Предыдущая статья Предыдущая статья Следующая статья