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

Понимаем, как одна машина обслуживает много сетевых сервисов одновременно — через порты и сокеты.

Порт — это 16-битный номер (0–65535), который адресует конкретный процесс (сервис) на машине. IP приводит пакет к нужному компьютеру, порт — к нужной программе на нём.

Зачем нужны порты

На одном сервере одновременно работают веб-сервер, почта, база данных, SSH. У них один IP-адрес. Как пакет понимает, какому из сервисов он адресован? По порту. IP-адрес — это как адрес дома, а порт — номер квартиры. Транспортный уровень доставляет данные нужному «жильцу».

Известные порты

За многими сервисами закреплены стандартные номера портов (0–1023 — «well-known»). Их полезно знать наизусть:

ПортСервисОписание
80HTTPвеб без шифрования
443HTTPSвеб с TLS
22SSHудалённый доступ к серверу
53DNSразрешение имён
25 / 587SMTPотправка почты
5432PostgreSQLбаза данных

Поэтому https://site.com и https://site.com:443 — одно и то же: 443 подставляется по умолчанию. А ваш дев-сервер на localhost:3000 слушает порт 3000.

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

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

Уникальное соединение определяется четвёркой: IP и порт источника + IP и порт назначения. Именно поэтому к серверному порту 443 могут одновременно подключиться тысячи клиентов: у каждого своя четвёрка, потому что у клиентов разные адреса и/или порты.

Соединение 1: 203.0.113.5:51000  ->  93.184.216.34:443
Соединение 2: 198.51.100.7:62000 ->  93.184.216.34:443
            (разные источники — разные соединения к одному порту)

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

  • Сервер «слушает» (listen) фиксированный порт, например 443, и ждёт подключений.
  • Клиент при подключении получает случайный высокий порт (ephemeral, обычно 49152–65535) — он временный, на время соединения.

Зачем это веб-разработчику

«Address already in use» при запуске сервера — порт занят другим процессом. «Connection refused» — на порту никто не слушает. Понимание портов объясняет, почему фронтенд на :3000 и API на :8000 — это «разные origin» (важно для CORS, разберём позже), и как пробрасывать порты в Docker (-p 8080:80).

Итог

  • Порт (0–65535) адресует процесс на машине; IP адресует машину.
  • Известные порты: 80 (HTTP), 443 (HTTPS), 22 (SSH), 53 (DNS).
  • Сокет — это пара IP:порт, конец соединения.
  • Соединение уникально определяется четвёркой источник/назначение, поэтому один порт обслуживает много клиентов.
Проверьте себя
1. Зачем нужны порты, если уже есть IP-адрес?
AЧтобы ускорить передачу
BIP адресует машину, а порт — конкретный процесс (сервис) на ней
CПорты шифруют данные
DПорты нужны только для UDP
2. Какой порт по умолчанию использует HTTPS?
A80
B22
C443
D8080
3. Почему к серверному порту 443 могут подключиться тысячи клиентов одновременно?
AСервер открывает 443 копии порта
BКаждое соединение уникально определяется четвёркой IP:порт источника и назначения
CЭто невозможно, порт обслуживает одного клиента
DКлиенты используют один и тот же порт
Поддержать проект