← Назад к вопросам

За счет чего TCP гарантирует корректную передачу данных

2.0 Middle🔥 181 комментариев
#Сети и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как TCP гарантирует корректную передачу данных

TCP (Transmission Control Protocol) — это надёжный протокол передачи данных, который гарантирует доставку всех пакетов в правильном порядке и без повреждений. Это отличает его от UDP, который просто отправляет пакеты без гарантий.

1. Порядковые номера (Sequence Numbers)

Каждый пакет имеет порядковый номер, который позволяет:

  • Гарантировать доставку всех пакетов (отсутствие потерь)
  • Восстанавливать правильный порядок пакетов
  • Обнаруживать дублирование пакетов
Отправитель               Получатель
├─ пакет SEQ=1000        ──────→ принял SEQ=1000, отправил ACK=1001
│
├─ пакет SEQ=1001        ──────→ принял SEQ=1001, отправил ACK=1002
│
└─ пакет SEQ=1002        ──────→ принял SEQ=1002, отправил ACK=1003

Каждый ACK подтверждает, что все пакеты до этого номера получены корректно.

2. Acknowledgments (ACK) — подтверждение доставки

Получатель обязательно отправляет подтверждение при получении данных:

Отправитель                    Получатель
├─ send "Hello" (SEQ=100)     ──────→
│                              ←────── ACK=105 (получил 5 байт)
│
└─ send "World" (SEQ=105)     ──────→
                               ←────── ACK=110

Если подтверждение не приходит, отправитель повторно передаёт пакет.

3. Контрольная сумма (Checksum)

Каждый пакет содержит контрольную сумму (Checksum), которая:

  • Вычисляется на основе содержимого пакета
  • Проверяется при получении
  • Обнаруживает повреждение данных в пути
Отправитель: данные "Hello"
├─ Вычислить checksum = hash("Hello")
├─ Отправить: [данные + checksum]
│
Получатель:
├─ Получить данные + checksum
├─ Вычислить checksum локально
├─ Сравнить: если не совпадают → данные повреждены → ОТБРОСИТЬ
└─ Если совпадают → ACK отправителю

Если checksum не совпадает, пакет отбрасывается и отправитель повторно его передаст.

4. Retransmission (повторная передача)

Когда отправитель не получает ACK за определённое время, он повторно отправляет пакет:

Отправитель                    Получатель
├─ send пакет               ──────→ (пакет потерян!)
├─ ждёт ACK...
├─ timeout истёк!
├─ повторно send пакет      ──────→ получено!
│                           ←────── ACK
└─ окей, пакет доставлен

Параметры retransmission:

  • RTO (Retransmission TimeOut) — время ожидания ACK (обычно 200ms-300ms)
  • Увеличение RTO — если пакет потеряется снова, RTO удваивается (200ms → 400ms → 800ms)
  • Максимум повторов — обычно 5-15 попыток перед разрывом соединения

5. Flow Control (управление потоком)

TCP предотвращает переполнение приёмника, используя скользящее окно (sliding window):

Отправитель может отправить только столько данных,
сколько приёмник может принять (window size)

Получатель: "Я могу принять 4096 байт"
Отправитель: отправляет максимум 4096 байт, ждёт ACK
Получатель обработал данные: "Я могу принять ещё 4096 байт"
Отправитель: отправляет следующие 4096 байт

Это гарантирует, что данные не будут потеряны из-за переполнения буфера приёмника.

6. Out-of-order detection

Если пакеты приходят в неправильном порядке, TCP:

  • Буферирует их
  • Ждёт пропущенные пакеты
  • Переупорядочивает
  • Доставляет приложению в правильном порядке
Отправитель отправляет: [пакет 100][пакет 105][пакет 110]
Получатель может получить: [пакет 105][пакет 110][пакет 100]

ТCP буферирует:
├─ пакет 105 (не 100!) → жду пакет 100
├─ пакет 110 (не 100!) → жду пакет 100
└─ пакет 100 → окей! → отправляю приложению [100][105][110]

7. Дублирование (duplicate detection)

Если из-за retransmission приходит дублированный пакет, TCP его отбросит, использую порядковые номера:

Отправитель: send SEQ=100-105
Получатель: получил два раза SEQ=100-105
→ видит, что этот SEQ уже был
→ отбрасывает дубликата

8. Connection Management (управление соединением)

3-way handshake при установлении соединения:

Отправитель      Получатель
├─ SYN (SEQ=x)  ──────→
│              ←────── SYN-ACK (SEQ=y, ACK=x+1)
└─ ACK (SEQ=x+1, ACK=y+1) ──────→

Теперь оба знают, что соединение установлено корректно

Практический пример

# Просмотр TCP соединений и их состояния
netstat -tnap | grep ESTABLISHED

# Проверка TCP параметров
cat /proc/sys/net/ipv4/tcp_retries2  # Макс. попыток retransmit
cat /proc/sys/net/core/wmem_default  # Размер send буфера
cat /proc/sys/net/core/rmem_default  # Размер receive буфера

# Мониторинг потерянных пакетов
netstat -s | grep retransmit

Результат: надёжная доставка

За счёт комбинации всех этих механизмов TCP гарантирует:

Полнота — все пакеты будут доставлены (no lost packets) ✅ Целостность — данные не повреждены (checksum) ✅ Порядок — пакеты в правильном порядке (sequence numbers) ✅ Отсутствие дублей — нет повторных данных (duplicate detection) ✅ Скорость соответствует приёмнику — не переполнится (flow control)

Вывод

TCP гарантирует корректную передачу через комплекс механизмов: порядковые номера, подтверждения, контрольные суммы, повторная передача, управление потоком и обнаружение дублей. Это делает TCP надёжным протоколом, идеальным для приложений, где целостность данных критична (HTTP, SMTP, SSH).

За счет чего TCP гарантирует корректную передачу данных | PrepBro