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

Как работает гарантия доставки пакетов в TCP?

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

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Принцип гарантированной доставки в TCP

TCP (Transmission Control Protocol) — это протокол транспортного уровня с установлением соединения, который обеспечивает надежную, упорядоченную и проверенную на ошибки доставку потока данных между приложениями, работающими на хостах в IP-сети. Гарантия доставки — его фундаментальная характеристика, достигаемая за счет комбинации нескольких ключевых механизмов.

Ключевые механизмы гарантии доставки

1. Установление и завершение соединения (Three-way handshake и Four-way handshake)

Перед обменом данными TCP устанавливает логическое соединение, используя трехстороннее рукопожатие (SYN, SYN-ACK, ACK). Это гарантирует, что обе стороны готовы к обмену и согласовали начальные параметры (номера последовательностей). Завершение соединения также происходит упорядоченно (FIN, ACK), что предотвращает потерю последних данных.

2. Нумерация сегментов и подтверждение получения (Sequence и Acknowledgment Numbers)

Каждый байт данных имеет свой порядковый номер. Отправитель нумерует сегменты, а получатель отправляет ACK (подтверждение) с номером следующего ожидаемого байта. Это позволяет:

  • Подтвердить успешный прием данных.
  • Обнаружить потерю, дублирование или нарушение порядка сегментов.
# Пример (упрощенно). Отправитель отправляет сегмент с данными [Seq=1, Len=100]
# Получатель отвечает: [ACK=101] — "Я получил все байты до 101, жду байт №101"

3. Таймауты и повторная передача (Retransmission)

Для каждого отправленного сегмента запускается таймер повторной передачи (RTO — Retransmission Timeout). Если подтверждение (ACK) не пришло до истечения таймера, сегмент считается утерянным и передается повторно. Современные реализации используют алгоритмы вроде Karn/Partridge и RTT (Round-Trip Time) для динамического расчета RTO.

4. Контроль потока (Flow Control) с помощью скользящего окна

Этот механизм предотвращает «переполнение» получателя. Получатель указывает в поле Window Size размер своего свободного буфера. Отправитель может передавать данные только в пределах этого «окна». Это гарантирует, что данные не будут отправлены, если получатель не готов их принять, избегая потерь из-за перегрузки.

# Упрощенная логика работы окна (псевдокод)
sender_window_size = receiver_advertised_window
while unacknowledged_data < sender_window_size:
    send_next_segment()
    # Ждем ACK для освобождения места в окне

5. Контроль перегрузки (Congestion Control)

Это более высокоуровневый механизм, защищающий сеть от коллапса. Отправитель динамически определяет размер окна перегрузки (cwnd) на основе сигналов сети (потеря пакетов, задержки). Основные алгоритмы:

  • Медленный старт (Slow Start) — экспоненциальный рост cwnd в начале передачи или после простоя.
  • Предотвращение перегрузки (Congestion Avoidance) — линейный рост cwnd после достижения порога.
  • Реакция на потерю — при обнаружении потери (по таймауту или трем дублирующим ACK) cwnd резко уменьшается.

Что происходит при потере пакета?

Сценарий гарантии доставки на практике:

  1. Сегмент №X теряется в сети.
  2. Получатель, получив сегмент №X+1, отправляет дублирующий ACK с номером X (так как ожидает именно X).
  3. Получив три одинаковых дублирующих ACK, отправитель инициирует быструю ретрансмиссию (Fast Retransmit) — немедленно повторяет передачу сегмента X, не дожидаясь таймаута.
  4. Одновременно с этим запускается алгоритм быстрого восстановления (Fast Recovery) для более плавного управления перегрузкой.
  5. После получения ACK на сегмент X передача продолжается с учетом новых параметров окна.

Резюме: как обеспечивается гарантия

Гарантия доставки в TCP — это не магия, а результат работы надежного протокола с состояниями, который:

  • Отслеживает состояние каждого отправленного байта (отправлен/подтвержден/в буфере).
  • Использует положительные подтверждения с накоплением (ACK подтверждает все предыдущие байты).
  • Автоматически повторяет передачу при обнаружении потерь.
  • Адаптирует скорость отправки к возможностям получателя и сети.
  • Обеспечивает целостность данных с помощью контрольной суммы (checksum).

Важно помнить, что 100% гарантии в условиях ненадежной сети (например, IP) быть не может. TCP гарантирует, что он сделает максимально возможное для доставки: будет пытаться ретранслировать потерянные сегменты в течение долгого времени (минуты), прежде чем окончательно разорвать соединение. Если физическое соединение прервано, доставка, очевидно, станет невозможна, и приложение получит соответствующую ошибку. Таким образом, TCP предоставляет приложениям абстракцию надежного потока байтов поверх ненадежной сетевой инфраструктуры.