OSI L4: Транспортний рівень (Transport Layer)¶
Що таке транспортний рівень?¶
Транспортний рівень відповідає за end-to-end доставку даних між додатками. Він забезпечує мультиплексування (багато додатків через один канал) та може гарантувати надійність передачі.
┌─────────────────────────────────────────────────────────────────┐
│ L3 = Доставка між хостами (IP → IP) │
│ L4 = Доставка між додатками (IP:Port → IP:Port) │
│ │
│ Browser ──:443──▶ Router ──▶ Web Server ──:443──▶ nginx │
│ (PC:54321) (Server:443) │
│ │
│ Порти ідентифікують конкретний додаток │
└─────────────────────────────────────────────────────────────────┘
PDU на L4¶
TCP: Сегмент (Segment)
┌──────────────────────────────────┬──────────────────────────────┐
│ TCP Header │ Data │
│ 20-60 bytes │ (Application data) │
└──────────────────────────────────┴──────────────────────────────┘
UDP: Датаграма (Datagram)
┌──────────────────────────────────┬──────────────────────────────┐
│ UDP Header │ Data │
│ 8 bytes │ (Application data) │
└──────────────────────────────────┴──────────────────────────────┘
Порти¶
Що таке порт?¶
Порт — це 16-бітне число (0-65535), яке ідентифікує конкретний процес або сервіс на хості.
┌─────────────────────────────────────────────────────────────────┐
│ Server: 192.168.1.10 │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ nginx │ │ sshd │ │ mysql │ │ app │ │
│ │ :80 │ │ :22 │ │ :3306 │ │ :8080 │ │
│ └────┬───┘ └────┬───┘ └────┬───┘ └────┬───┘ │
│ │ │ │ │ │
│ ═════╪══════════╪══════════╪══════════╪════════════ │
│ │ │ │ │ │
│ │ TCP/UDP Stack (kernel) │
│ │ │
└───────┴─────────────────────────────────────────────────────────┘
Категорії портів¶
| Діапазон | Назва | Опис |
|---|---|---|
| 0-1023 | Well-known | Системні сервіси (потрібен root) |
| 1024-49151 | Registered | Зареєстровані додатки |
| 49152-65535 | Dynamic/Ephemeral | Клієнтські порти |
Популярні порти¶
| Порт | Протокол | Сервіс |
|---|---|---|
| 20-21 | TCP | FTP (data, control) |
| 22 | TCP | SSH |
| 23 | TCP | Telnet |
| 25 | TCP | SMTP |
| 53 | TCP/UDP | DNS |
| 67-68 | UDP | DHCP |
| 80 | TCP | HTTP |
| 110 | TCP | POP3 |
| 123 | UDP | NTP |
| 143 | TCP | IMAP |
| 443 | TCP | HTTPS |
| 465 | TCP | SMTPS |
| 993 | TCP | IMAPS |
| 3306 | TCP | MySQL |
| 3389 | TCP | RDP |
| 5432 | TCP | PostgreSQL |
| 6379 | TCP | Redis |
| 8080 | TCP | HTTP альтернативний |
Сокети¶
Сокет = IP-адреса + Порт
Клієнт: 192.168.1.100:54321
Сервер: 93.184.216.34:443
┌─────────────────────────────────────────────────────────────────┐
│ Socket pair (унікальне з'єднання): │
│ │
│ 192.168.1.100:54321 ←──────────────▶ 93.184.216.34:443 │
│ (client socket) (server socket) │
│ │
│ Протокол + Src IP:Port + Dst IP:Port = унікальний ідентифікатор│
└─────────────────────────────────────────────────────────────────┘
TCP vs UDP¶
Порівняння¶
┌────────────────────────────────┬────────────────────────────────┐
│ TCP │ UDP │
├────────────────────────────────┼────────────────────────────────┤
│ Connection-oriented │ Connectionless │
│ (встановлює з'єднання) │ (без з'єднання) │
├────────────────────────────────┼────────────────────────────────┤
│ Надійний (reliable) │ Ненадійний (best-effort) │
│ • Підтвердження доставки │ • Без підтверджень │
│ • Повторна передача │ • Без повторів │
│ • Порядок збережено │ • Порядок не гарантовано │
├────────────────────────────────┼────────────────────────────────┤
│ Flow control │ Без flow control │
│ Congestion control │ Без congestion control │
├────────────────────────────────┼────────────────────────────────┤
│ Більше overhead (20+ bytes) │ Менше overhead (8 bytes) │
│ Повільніше │ Швидше │
├────────────────────────────────┼────────────────────────────────┤
│ HTTP, HTTPS, SSH, FTP │ DNS, DHCP, VoIP, Gaming │
│ Email, File transfer │ Video streaming, NTP │
└────────────────────────────────┴────────────────────────────────┘
Коли що використовувати?¶
TCP — коли важлива НАДІЙНІСТЬ:
• Веб-сайти (HTTP/HTTPS)
• Електронна пошта
• Передача файлів
• SSH, Telnet
• Бази даних
UDP — коли важлива ШВИДКІСТЬ:
• Онлайн ігри
• Відеодзвінки (VoIP, Zoom)
• Стрімінг (якщо втрата кадру — не критично)
• DNS запити (маленькі, швидкі)
• DHCP
TCP детально¶
TCP Header¶
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌───────────────────────────────┬───────────────────────────────┐
│ Source Port │ Destination Port │
├───────────────────────────────┴───────────────────────────────┤
│ Sequence Number │
├───────────────────────────────────────────────────────────────┤
│ Acknowledgment Number │
├───────┬───────┬─┬─┬─┬─┬─┬─┬───────────────────────────────────┤
│ Data │ │U│A│P│R│S│F│ │
│Offset │ Rsrvd │R│C│S│S│Y│I│ Window │
│ │ │G│K│H│T│N│N│ │
├───────┴───────┴─┴─┴─┴─┴─┴─┼───────────────────────────────────┤
│ Checksum │ Urgent Pointer │
├───────────────────────────┴───────────────────────────────────┤
│ Options (якщо є) │
└───────────────────────────────────────────────────────────────┘
Важливі поля¶
| Поле | Опис |
|---|---|
| Source Port | Порт відправника |
| Destination Port | Порт отримувача |
| Sequence Number | Номер першого байта в сегменті |
| Acknowledgment Number | Наступний очікуваний байт |
| Window | Розмір вікна прийому (flow control) |
| Flags | URG, ACK, PSH, RST, SYN, FIN |
TCP Flags¶
┌─────┬────────────────────────────────────────────────────────────┐
│ SYN │ Synchronize — початок з'єднання │
├─────┼────────────────────────────────────────────────────────────┤
│ ACK │ Acknowledgment — підтвердження отримання │
├─────┼────────────────────────────────────────────────────────────┤
│ FIN │ Finish — завершення з'єднання │
├─────┼────────────────────────────────────────────────────────────┤
│ RST │ Reset — скидання з'єднання (помилка або reject) │
├─────┼────────────────────────────────────────────────────────────┤
│ PSH │ Push — негайна передача буфера │
├─────┼────────────────────────────────────────────────────────────┤
│ URG │ Urgent — термінові дані │
└─────┴────────────────────────────────────────────────────────────┘
TCP 3-Way Handshake¶
┌────────┐ ┌────────┐
│ Client │ │ Server │
└───┬────┘ └────┬───┘
│ │
│ 1. SYN (seq=100) │
│ ─────────────────────────────────────────────▶ │
│ "Хочу з'єднатись, мій seq=100" │
│ │
│ 2. SYN-ACK (seq=300, ack=101) │
│ ◀───────────────────────────────────────────── │
│ "OK, мій seq=300, очікую твій 101" │
│ │
│ 3. ACK (seq=101, ack=301) │
│ ─────────────────────────────────────────────▶ │
│ "Підтверджую, очікую твій 301" │
│ │
│ ═══════════ З'ЄДНАННЯ ВСТАНОВЛЕНО ═══════════ │
│ │
TCP Data Transfer¶
┌────────┐ ┌────────┐
│ Client │ │ Server │
└───┬────┘ └────┬───┘
│ │
│ DATA (seq=101, 100 bytes) │
│ ─────────────────────────────────────────────▶ │
│ "Ось дані, байти 101-200" │
│ │
│ ACK (ack=201) │
│ ◀───────────────────────────────────────────── │
│ "Отримав, очікую з 201" │
│ │
│ DATA (seq=201, 200 bytes) │
│ ─────────────────────────────────────────────▶ │
│ │
│ ACK (ack=401) │
│ ◀───────────────────────────────────────────── │
│ │
TCP Connection Termination (4-Way)¶
┌────────┐ ┌────────┐
│ Client │ │ Server │
└───┬────┘ └────┬───┘
│ │
│ 1. FIN (seq=500) │
│ ─────────────────────────────────────────────▶ │
│ "Я закінчив передавати" │
│ │
│ 2. ACK (ack=501) │
│ ◀───────────────────────────────────────────── │
│ "OK, зрозумів" │
│ │
│ 3. FIN (seq=600) │
│ ◀───────────────────────────────────────────── │
│ "Я теж закінчив" │
│ │
│ 4. ACK (ack=601) │
│ ─────────────────────────────────────────────▶ │
│ "OK, закриваємо" │
│ │
│ ═══════════ З'ЄДНАННЯ ЗАКРИТО ═══════════════ │
Flow Control (Window)¶
Проблема: Швидкий відправник переповнює повільного отримувача
Рішення: Window — скільки байтів можна надіслати без ACK
┌────────┐ ┌────────┐
│ Sender │ │Receiver│
└───┬────┘ └────┬───┘
│ Window = 3000 │
│ ─────────────────────────────────────────────▶ │
│ │
│ Відправляю 3000 bytes... │
│ [1000] [1000] [1000] │
│ ═══════════════════════════════════════════════▶│
│ │
│ ACK, Window = 1000 │
│ ◀───────────────────────────────────────────────│
│ (буфер майже повний!) │
│ │
│ Зменшую швидкість, відправляю 1000 │
│ [1000] │
│ ═══════════════════════════════════════════════▶│
Retransmission¶
┌────────┐ ┌────────┐
│ Sender │ │Receiver│
└───┬────┘ └────┬───┘
│ │
│ DATA (seq=100) │
│ ─────────────────────────────────────────────▶ │
│ │
│ DATA (seq=200) │
│ ───────────────────╳ (втрачено!) │
│ │
│ DATA (seq=300) │
│ ─────────────────────────────────────────────▶ │
│ │
│ ACK (ack=200) — "досі чекаю 200" │
│ ◀───────────────────────────────────────────── │
│ │
│ Timeout! Повторна передача DATA (seq=200) │
│ ─────────────────────────────────────────────▶ │
│ │
│ ACK (ack=400) — "тепер все OK" │
│ ◀───────────────────────────────────────────── │
UDP детально¶
UDP Header¶
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌───────────────────────────────┬───────────────────────────────┐
│ Source Port │ Destination Port │
├───────────────────────────────┼───────────────────────────────┤
│ Length │ Checksum │
├───────────────────────────────┴───────────────────────────────┤
│ Data │
└───────────────────────────────────────────────────────────────┘
Всього 8 bytes header! (TCP = 20+ bytes)
Переваги UDP¶
1. Швидкість
┌─────────────────────────────────────────────────────────────┐
│ TCP: Handshake → Data → ACK → Data → ACK → Close │
│ UDP: Data → Data → Data (fire and forget) │
└─────────────────────────────────────────────────────────────┘
2. Менший overhead
┌─────────────────────────────────────────────────────────────┐
│ TCP Header: 20-60 bytes │
│ UDP Header: 8 bytes │
└─────────────────────────────────────────────────────────────┘
3. Без затримок на retransmission
┌─────────────────────────────────────────────────────────────┐
│ VoIP: Краще пропустити фрейм, ніж чекати на повтор │
│ Gaming: Стара позиція гравця не потрібна │
└─────────────────────────────────────────────────────────────┘
Приклад: DNS через UDP¶
┌────────┐ ┌────────┐
│ Client │ │DNS Srvr│
└───┬────┘ └────┬───┘
│ │
│ UDP Query: "What is example.com?" │
│ ─────────────────────────────────────────────▶ │
│ (1 пакет, ~50 bytes) │
│ │
│ UDP Response: "93.184.216.34" │
│ ◀───────────────────────────────────────────── │
│ (1 пакет, ~100 bytes) │
│ │
│ Готово! Без handshake, без ACK │
Stateful Firewall на L4¶
Як працює¶
┌─────────────────────────────────────────────────────────────────┐
│ STATEFUL FIREWALL │
│ │
│ Connection Table: │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Proto │ Src IP:Port │ Dst IP:Port │ State │ │
│ ├───────┼──────────────────┼──────────────────┼───────────┤ │
│ │ TCP │ 192.168.1.10:54321│ 93.184.216.34:443│ ESTABLISHED│ │
│ │ UDP │ 192.168.1.10:53421│ 8.8.8.8:53 │ ACTIVE │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Правила: │
│ 1. Дозволити ESTABLISHED/RELATED │
│ 2. Дозволити нові вихідні │
│ 3. Блокувати нові вхідні (крім дозволених) │
└─────────────────────────────────────────────────────────────────┘
iptables приклади¶
# Дозволити established/related
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Дозволити SSH вхідний
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Дозволити HTTP/HTTPS вхідний
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Блокувати все інше вхідне
iptables -A INPUT -j DROP
MikroTik firewall¶
/ip firewall filter
# Established/Related
add chain=input connection-state=established,related action=accept
# SSH
add chain=input protocol=tcp dst-port=22 action=accept
# Drop all other input
add chain=input action=drop
Діагностика L4¶
Linux команди¶
# Активні з'єднання TCP
ss -t
# або
netstat -t
# З портами
ss -tuln
# t=TCP, u=UDP, l=listening, n=numeric
# Статистика TCP/UDP
ss -s
# Процес, що слухає порт
ss -tlnp | grep :80
# або
lsof -i :80
# TCP dump на порт
tcpdump -i eth0 port 443
# Тест порту
nc -zv 192.168.1.10 22
# Connection to 192.168.1.10 22 port [tcp/ssh] succeeded!
# Telnet як тест TCP
telnet example.com 80
MikroTik команди¶
# Активні з'єднання
/ip firewall connection print
# Статистика
/ip firewall connection print stats
# Torch (трафік в реальному часі)
/tool torch interface=ether1 port=any
Wireshark фільтри¶
tcp.port == 443 # TCP порт 443
udp.port == 53 # UDP порт 53
tcp.flags.syn == 1 # SYN пакети
tcp.flags.rst == 1 # RST (скидання)
tcp.analysis.retransmission # Повторні передачі
tcp.analysis.duplicate_ack # Дублікати ACK
tcp.stream eq 5 # Конкретний TCP stream
Типовий troubleshooting¶
# 1. Перевірити, чи слухає сервіс
ss -tlnp | grep :80
# 2. Перевірити firewall
iptables -L -n -v
# 3. Перевірити з'єднання з клієнта
nc -zv server.com 80
# 4. Детальний аналіз
tcpdump -i eth0 -nn port 80
# 5. Перевірити TCP handshake
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'
Типові проблеми та рішення¶
| Проблема | Симптоми | Діагностика | Рішення |
|---|---|---|---|
| Порт закритий | Connection refused | nc -zv host port |
Запустити сервіс |
| Firewall блокує | Timeout | iptables -L |
Додати правило |
| Port exhaustion | Cannot bind | ss -s, ephemeral ports |
Зменшити TIME_WAIT |
| SYN flood | Багато SYN_RECV | ss -t state syn-recv |
SYN cookies |
| Retransmissions | Повільна передача | Wireshark | Перевірити мережу |
| RST пакети | З'єднання скидається | tcpdump | Перевірити firewall/app |
TCP States¶
┌──────────────────────────────────────┐
│ TCP States │
└──────────────────────────────────────┘
┌─────────┐
│ CLOSED │
└────┬────┘
│
┌──────────────────────┴──────────────────────┐
│ (passive open) (active open) │
▼ ▼
┌─────────┐ ┌──────────┐
│ LISTEN │ │ SYN_SENT │
└────┬────┘ └────┬─────┘
│ recv SYN recv SYN-ACK │
│ send SYN-ACK send ACK │
▼ │
┌──────────┐ │
│SYN_RECV │───────────────────────────────────────┘
└────┬─────┘
│ recv ACK
▼
┌─────────────┐
│ ESTABLISHED │ ◀── Нормальна робота
└──────┬──────┘
│
┌────────┴────────┐
│ (active close) │ (passive close)
▼ ▼
┌──────────┐ ┌────────────┐
│FIN_WAIT_1│ │ CLOSE_WAIT │
└────┬─────┘ └─────┬──────┘
│ │
▼ ▼
┌──────────┐ ┌────────────┐
│FIN_WAIT_2│ │ LAST_ACK │
└────┬─────┘ └─────┬──────┘
│ │
▼ ▼
┌──────────┐ ┌─────────┐
│TIME_WAIT │────│ CLOSED │
└──────────┘ └─────────┘
Підсумок¶
Транспортний рівень відповідає за:
- Порти — ідентифікація додатків
- TCP — надійна, впорядкована передача
- UDP — швидка передача без гарантій
- Flow control — запобігання переповненню
- Firewall — фільтрація на основі портів/станів
Див. також¶
- Модель OSI — огляд всіх рівнів
- Мережевий рівень — попередній рівень
- Сеансовий рівень — наступний рівень
- Firewall Linux — iptables, nftables
Шлях: networking/basics/osi-4-transport.md