Урок 4. Порты и протоколы: TCP, UDP, HTTP, HTTPS, SSH
IP-адрес доводит данные до устройства. Но на одном компьютере одновременно работают браузер, почта, мессенджер, сервер SSH — каждому нужны свои данные. Их различает порт — номер от 0 до 65535, который стоит рядом с адресом.
Адрес и порт
Если IP-адрес — адрес здания, то порт — номер кабинета в нём. Программа-сервер слушает свой порт: ждёт, пока к нему подключатся. Программа-клиент (например, браузер) подключается к адресу и порту сервера, а для себя берёт любой свободный порт — обычно с большим номером.
Адрес и порт пишут через двоеточие: 192.168.1.10:8080. В адресе сайта порт указывают так же: http://192.168.1.10:8080/. Если порт не написан, браузер берёт стандартный: 80 для http://, 443 для https://.
TCP и UDP
Данные между программами носят два основных протокола:
| TCP | UDP | |
|---|---|---|
| Соединение | устанавливается заранее | не устанавливается |
| Доставка | подтверждается, потерянное отправляется снова | без подтверждений: потерялось — значит, потерялось |
| Порядок | сохраняется | не гарантирован |
| Где нужен | сайты, почта, SSH, передача файлов | DNS, видеозвонки, игры, потоковое видео, точное время |
TCP начинает с «рукопожатия»: клиент просит соединения, сервер соглашается, клиент подтверждает. Дальше каждая порция данных подтверждается получателем. Это надёжно, но медленнее.
UDP просто отправляет пакеты. В видеозвонке так лучше: кадр, который опоздал, уже не нужен, а ждать его повторной отправки — значит заморозить картинку.
Номера портов у TCP и UDP свои: TCP-порт 53 и UDP-порт 53 — разные «двери».
Частые порты
| Порт | Протокол | Что работает |
|---|---|---|
| 22 | TCP | SSH — удалённое управление |
| 25 | TCP | SMTP — передача почты между серверами |
| 53 | UDP и TCP | DNS |
| 67, 68 | UDP | DHCP |
| 80 | TCP | HTTP — сайты без шифрования |
| 123 | UDP | NTP — точное время |
| 443 | TCP, а для HTTP/3 — UDP | HTTPS — сайты с шифрованием |
| 587, 465 | TCP | отправка почты из почтовой программы |
| 993 | TCP | IMAP — чтение почты, с шифрованием |
| 3306 | TCP | база данных MySQL и MariaDB |
| 3389 | TCP и 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:
ss -tlnВ обоих выводах важен адрес перед портом. 0.0.0.0:22 или [::]:22 — программа ждёт подключений из сети. 127.0.0.1:3306 — только с этого же компьютера, из сети к ней не подключиться.
Открыт ли порт на другом компьютере
В Windows — командой PowerShell:
Test-NetConnection 192.168.1.10 -Port 22TcpTestSucceeded : True — подключение прошло. В Linux — командой nc (netcat):
nc -zv 192.168.1.10 22Как понять неудачу:
- отказ (
Connection refused) — компьютер ответил, но этот порт никто не слушает: программа не запущена или слушает другой порт; - тишина до тайм-аута (пока не выйдет время ожидания) — ответа нет вовсе: порт закрыт брандмауэром (программой, которая решает, какие подключения пропускать), неверный адрес или компьютер выключен.
Как открыть порт в брандмауэре — в темах Windows и Ubuntu.
Порт своими руками
Для тех, кто знает Python: программа ниже запускает маленький сервер, который слушает порт на этом же компьютере (127.0.0.1, порт выбирает система), и подключается к нему как клиент. Клиент отправляет слово, сервер отвечает.
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: helloSOCK_STREAM — это TCP. bind занимает адрес и порт, listen начинает слушать, accept ждёт клиента, create_connection подключает клиента — ровно те шаги, о которых шла речь выше.
Коротко
- Порт — номер от 0 до 65535: адрес ведёт к устройству, порт — к программе на нём.
- TCP — с соединением и гарантией доставки (сайты, почта, SSH), UDP — быстрее и без гарантий (DNS, звонки, игры).
- Сайты — 80 (HTTP) и 443 (HTTPS), SSH — 22, DNS — 53, RDP — 3389.
- HTTPS шифрует соединение и подтверждает имя сайта, но не честность его владельца.
- Слушающие порты —
netstat -anoилиss -tln; проверка с другого компьютера —Test-NetConnectionилиnc -zv.