Глиф Учебники

Урок 4. Порты и протоколы: TCP, UDP, HTTP, HTTPS, SSH

Курс «Компьютерные сети» · урок 4 из 9 · 4 минуты чтения

IP-адрес доводит данные до устройства. Но на одном компьютере одновременно работают браузер, почта, мессенджер, сервер SSH — каждому нужны свои данные. Их различает порт — номер от 0 до 65535, который стоит рядом с адресом.

Адрес и порт

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

Адрес и порт пишут через двоеточие: 192.168.1.10:8080. В адресе сайта порт указывают так же: http://192.168.1.10:8080/. Если порт не написан, браузер берёт стандартный: 80 для http://, 443 для https://.

IP-адрес → компьютер порт → программа на нём Ваш компьютер 192.168.1.10:8080 браузер свой порт браузера — любой свободный: 51000 Сервер 192.168.1.10 программы слушают свои порты 22 80 443 8080 SSH — удалённое управление сайт по HTTP сайт по HTTPS ещё один сайт
IP-адрес ведёт к компьютеру, порт — к программе на нём: браузер со своего порта 51000 подключается к 192.168.1.10 на порт 8080.

TCP и UDP

Данные между программами носят два основных протокола:

TCPUDP
Соединениеустанавливается заранеене устанавливается
Доставкаподтверждается, потерянное отправляется сновабез подтверждений: потерялось — значит, потерялось
Порядоксохраняетсяне гарантирован
Где нуженсайты, почта, SSH, передача файловDNS, видеозвонки, игры, потоковое видео, точное время

TCP начинает с «рукопожатия»: клиент просит соединения, сервер соглашается, клиент подтверждает. Дальше каждая порция данных подтверждается получателем. Это надёжно, но медленнее.

UDP просто отправляет пакеты. В видеозвонке так лучше: кадр, который опоздал, уже не нужен, а ждать его повторной отправки — значит заморозить картинку.

TCP — надёжно, но медленнее UDP — просто отправляет клиент сервер клиент сервер рукопожатие данные просьба о соединении согласие подтверждение данные 1 получено данные 2 данные 2 — снова данные 1 данные 2 данные 3 данные 4 ни соединения, ни подтверждений: потерянное не повторяется
TCP начинает с рукопожатия, подтверждает каждую порцию данных и повторяет потерянное, а UDP отправляет пакеты без соединения и подтверждений.

Номера портов у TCP и UDP свои: TCP-порт 53 и UDP-порт 53 — разные «двери».

Частые порты

ПортПротоколЧто работает
22TCPSSH — удалённое управление
25TCPSMTP — передача почты между серверами
53UDP и TCPDNS
67, 68UDPDHCP
80TCPHTTP — сайты без шифрования
123UDPNTP — точное время
443TCP, а для HTTP/3 — UDPHTTPS — сайты с шифрованием
587, 465TCPотправка почты из почтовой программы
993TCPIMAP — чтение почты, с шифрованием
3306TCPбаза данных MySQL и MariaDB
3389TCP и UDPудалённый рабочий стол Windows (RDP)

Порты до 1023 называют общеизвестными, их список ведёт организация IANA (ссылка — в обзоре темы). Но номер — лишь договорённость: сайт может работать и на порту 8080, а SSH — на 2222, если так настроить сервер.

HTTP и HTTPS

HTTP — язык, на котором браузер просит страницу, а сервер её отдаёт. Сам по себе HTTP не шифруется: всё, что передаётся, — страницы, пароли из форм — может прочитать и подменить любой, через чьё оборудование идут пакеты, например владелец открытой сети Wi‑Fi.

HTTPS — тот же HTTP внутри шифрования TLS. Сервер предъявляет сертификат, подтверждающий, что он действительно отвечает за это имя сайта. Браузер проверяет сертификат и показывает значок замка у адреса.

Замок значит только одно: соединение зашифровано, и сертификат выдан на это имя. Он не говорит, что сайт честный. Поддельный сайт с похожим именем тоже может получить сертификат — поэтому проверяйте само имя в адресной строке.

Новая версия HTTP/3 работает поверх протокола QUIC, а он — поверх UDP, поэтому порт 443 бывает нужен и по UDP.

SSH

SSH — зашифрованное удалённое управление: вы набираете команды у себя, а выполняются они на сервере. Стандартный порт — 22. Почти все серверы на Linux управляются именно так. Как включить и настроить SSH — в теме Ubuntu.

Какие порты слушает компьютер

В Windows (в командной строке или PowerShell):

Командная строка
netstat -ano | findstr LISTENING

В Linux:

Bash
ss -tln

В обоих выводах важен адрес перед портом. 0.0.0.0:22 или [::]:22 — программа ждёт подключений из сети. 127.0.0.1:3306 — только с этого же компьютера, из сети к ней не подключиться.

Открыт ли порт на другом компьютере

В Windows — командой PowerShell:

PowerShell
Test-NetConnection 192.168.1.10 -Port 22

TcpTestSucceeded : True — подключение прошло. В Linux — командой nc (netcat):

Bash
nc -zv 192.168.1.10 22

Как понять неудачу:

Отказ: Connection refused клиент к порту 22 сразу ответ: отказ 22 компьютер на связи, порт никто не слушает Тишина до тайм-аута клиент к порту 22 брандмауэр 22 компьютер выключен или адрес неверный ответа нет
Отказ Connection refused приходит сразу, когда порт никто не слушает; если путь закрыт брандмауэром или компьютер недоступен, ответа нет до тайм-аута.

Как открыть порт в брандмауэре — в темах Windows и Ubuntu.

Порт своими руками

Для тех, кто знает Python: программа ниже запускает маленький сервер, который слушает порт на этом же компьютере (127.0.0.1, порт выбирает система), и подключается к нему как клиент. Клиент отправляет слово, сервер отвечает.

Python
import socket
import threading

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 0))
server.listen()
port = server.getsockname()[1]


def serve():
    conn, addr = server.accept()
    data = conn.recv(1024)
    conn.sendall(b"OK: " + data)
    conn.close()


worker = threading.Thread(target=serve)
worker.start()

client = socket.create_connection(("127.0.0.1", port))
client.sendall(b"hello")
print(client.recv(1024).decode())
client.close()
worker.join()
server.close()
Вывод
OK: hello

SOCK_STREAM — это TCP. bind занимает адрес и порт, listen начинает слушать, accept ждёт клиента, create_connection подключает клиента — ровно те шаги, о которых шла речь выше.

Коротко

Проверьте себя

1. Какой порт браузер использует для https://, если порт в адресе не указан?
2. Почему видеозвонки обычно идут по UDP?
3. Что гарантирует значок замка у адреса сайта?
4. Проверка порта закончилась ошибкой Connection refused. Что это значит?