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  │
└──────────┘    └─────────┘

Підсумок

Транспортний рівень відповідає за:

  1. Порти — ідентифікація додатків
  2. TCP — надійна, впорядкована передача
  3. UDP — швидка передача без гарантій
  4. Flow control — запобігання переповненню
  5. Firewall — фільтрація на основі портів/станів

Див. також

Шлях: networking/basics/osi-4-transport.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications