Порты и сокеты

Порты и сокеты

У компьютера один IP-адрес, но одновременно работают десятки сетевых приложений: браузер, почтовый клиент, мессенджер, игра, видеозвонок. Все они отправляют и принимают данные через один и тот же сетевой интерфейс. Как операционная система разделяет входящие пакеты между приложениями? Ответ — порты (ports) и сокеты (sockets).

Порты: адрес внутри компьютера

IP-адрес идентифицирует устройство в сети. Но когда пакет доставлен на устройство, нужно понять, какому приложению его отдать. Для этого служит порт — число от 0 до 65535 (16 бит). Комбинация «IP-адрес + порт» уникально идентифицирует конкретное приложение на конкретном устройстве.

Можно представить так: IP-адрес — это адрес многоквартирного дома (устройства), а порт — номер квартиры (приложения). Почтальон (IP-пакет) доходит до дома, а дальше смотрит на номер квартиры, чтобы понять, кому именно отдать письмо.

Пакет адресован:
  IP: 93.184.216.34 (сервер example.com)
  Порт: 443 (веб-сервер HTTPS)
  
Операционная система: отдать процессу, который слушает порт 443

Структура номеров портов

Диапазон портов условно разделён на три части:

  • 0–1023 — Well-known ports (системные). Зарезервированы для стандартных сервисов. Назначаются организацией IANA. Чтобы открыть такой порт, нужны права администратора.
ПортСервисПротокол
80HTTP (веб)TCP
443HTTPS (защищённый веб)TCP
53DNSUDP (и TCP для больших ответов)
22SSH (удалённый доступ)TCP
25SMTP (отправка почты)TCP
  • 1024–49151 — Registered ports. Регистрируются для конкретных приложений: 3306 — MySQL, 5432 — PostgreSQL, 8080 — альтернативный HTTP для разработки.
  • 49152–65535 — Dynamic/Ephemeral ports. Используются операционной системой как временные порты для исходящих соединений. Когда браузер открывает сайт, ОС выделяет ему свободный порт из этого диапазона на время соединения.

Клиентские и серверные порты

Когда ты открываешь сайт, за кулисами происходит вот что:

  1. Твой браузер (клиент) получает от ОС временный порт, скажем, 52341.
  2. Браузер отправляет TCP-пакет с src_port=52341, dst_port=443 (стандартный порт HTTPS).
  3. Сервер слушает порт 443. Он принимает пакет и отправляет ответ с src_port=443, dst_port=52341.
  4. ОС твоего компьютера видит dst_port=52341 и отдаёт пакет браузеру.
Клиент (192.168.1.5)                  Сервер (93.184.216.34)
  src_port: 52341                       слушает порт 443
  dst_port: 443       ──────────→
                      ←──────────
                      src_port: 443
                      dst_port: 52341

Серверный порт (443) известен заранее — именно поэтому тебе не нужно указывать порт в адресной строке браузера. Клиентский порт (52341) — временный, операционная система выделяет его автоматически и освобождает после закрытия соединения.

Сокет: абстракция для программиста

Сокет — это программный интерфейс (API), через который приложение отправляет и принимает данные по сети. С точки зрения кода, сокет выглядит как файл: открыл, записал данные, прочитал ответ, закрыл.

Сокет идентифицируется пятью параметрами, которые вместе образуют уникальное соединение:

{протокол, src_IP, src_port, dst_IP, dst_port}

TCP требует уникальности этой пятёрки. Именно поэтому сервер может обслуживать тысячи клиентов на одном порту (443): у каждого клиента свой src_IP или src_port, и пятёрки не пересекаются.

Как сервер обслуживает тысячи клиентов на одном порту

Серверный процесс выполняет последовательность:

  1. bind. Привязаться к порту (например, 443). «Я буду слушать этот порт».
  2. listen. Перейти в режим ожидания входящих соединений.
  3. accept. Принять входящее соединение. ОС создаёт новый сокет с теми же server_IP:443, но с client_IP:client_port. Исходный сокет продолжает слушать, а через новый идёт общение с конкретным клиентом.
  4. Обслужив клиента, закрыть новый сокет. Исходный слушает дальше.

Это похоже на ресепшен в офисе: секретарь (исходный сокет, порт 443) принимает посетителей и передаёт их конкретным сотрудникам (новые сокеты) для разговора. Сам секретарь продолжает принимать новых посетителей.

Проверь себя

  1. Может ли два приложения на одном компьютере слушать один и тот же порт?
  2. Зачем нужны временные (ephemeral) порты?
  3. Что такое сокет простыми словами?
<details> <summary>Ответы</summary>
  1. Нет. Порт может быть занят только одним процессом в каждый момент. Попытка занять уже занятый порт приведёт к ошибке «Address already in use».
  2. Чтобы клиент мог устанавливать множество одновременных соединений, не конфликтуя с другими приложениями. ОС выделяет каждому новому исходящему соединению свободный порт из динамического диапазона.
  3. Сокет — это «дверь» в приложение со стороны операционной системы. Для программиста это пара (IP + порт), через которую можно отправлять и принимать данные, как через файл.
</details>

Что унести с урока

  • Порт — число 0–65535, идентифицирующее приложение на устройстве. IP + порт = полный адрес.
  • Порты 0–1023 зарезервированы для стандартных сервисов (80=HTTP, 443=HTTPS, 53=DNS).
  • Клиент получает временный порт (49152–65535), сервер слушает фиксированный.
  • Сокет — это программный интерфейс для работы с сетью, идентифицируется пятёркой {протокол, src_IP, src_port, dst_IP, dst_port}.
  • Один серверный порт может обслуживать тысячи клиентов благодаря уникальности src_IP:src_port.

Транспортный уровень освоен. Теперь мы понимаем, как данные надёжно (или быстро) доставляются между приложениями. Но есть одна проблема: люди не запоминают IP-адреса 142.250.185.206 — они пишут google.com. Как компьютер превращает имя в адрес? Этим занимается DNS — тема следующего модуля.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике