Порты и сокеты
Порты и сокеты
У компьютера один 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. Чтобы открыть такой порт, нужны права администратора.
| Порт | Сервис | Протокол |
|---|---|---|
| 80 | HTTP (веб) | TCP |
| 443 | HTTPS (защищённый веб) | TCP |
| 53 | DNS | UDP (и TCP для больших ответов) |
| 22 | SSH (удалённый доступ) | TCP |
| 25 | SMTP (отправка почты) | TCP |
- 1024–49151 — Registered ports. Регистрируются для конкретных приложений: 3306 — MySQL, 5432 — PostgreSQL, 8080 — альтернативный HTTP для разработки.
- 49152–65535 — Dynamic/Ephemeral ports. Используются операционной системой как временные порты для исходящих соединений. Когда браузер открывает сайт, ОС выделяет ему свободный порт из этого диапазона на время соединения.
Клиентские и серверные порты
Когда ты открываешь сайт, за кулисами происходит вот что:
- Твой браузер (клиент) получает от ОС временный порт, скажем,
52341. - Браузер отправляет TCP-пакет с
src_port=52341,dst_port=443(стандартный порт HTTPS). - Сервер слушает порт
443. Он принимает пакет и отправляет ответ сsrc_port=443,dst_port=52341. - ОС твоего компьютера видит
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, и пятёрки не пересекаются.
Как сервер обслуживает тысячи клиентов на одном порту
Серверный процесс выполняет последовательность:
- bind. Привязаться к порту (например, 443). «Я буду слушать этот порт».
- listen. Перейти в режим ожидания входящих соединений.
- accept. Принять входящее соединение. ОС создаёт новый сокет с теми же
server_IP:443, но сclient_IP:client_port. Исходный сокет продолжает слушать, а через новый идёт общение с конкретным клиентом. - Обслужив клиента, закрыть новый сокет. Исходный слушает дальше.
Это похоже на ресепшен в офисе: секретарь (исходный сокет, порт 443) принимает посетителей и передаёт их конкретным сотрудникам (новые сокеты) для разговора. Сам секретарь продолжает принимать новых посетителей.
Проверь себя
- Может ли два приложения на одном компьютере слушать один и тот же порт?
- Зачем нужны временные (ephemeral) порты?
- Что такое сокет простыми словами?
- Нет. Порт может быть занят только одним процессом в каждый момент. Попытка занять уже занятый порт приведёт к ошибке «Address already in use».
- Чтобы клиент мог устанавливать множество одновременных соединений, не конфликтуя с другими приложениями. ОС выделяет каждому новому исходящему соединению свободный порт из динамического диапазона.
- Сокет — это «дверь» в приложение со стороны операционной системы. Для программиста это пара (IP + порт), через которую можно отправлять и принимать данные, как через файл.
Что унести с урока
- Порт — число 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 — тема следующего модуля.