Если во время отправки клиентом серверу пропадет соединение, будет ли доставлен пакет, если мы используем TCP?

«Если во время отправки клиентом серверу пропадет соединение, будет ли доставлен пакет, если мы используем TCP?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TCP гарантирует надежную доставку данных через механизмы подтверждения (ACK) и повторной передачи. Если соединение прервется во время отправки, пакет не будет доставлен, и приложение получит уведомление об ошибке.

Что происходит при обрыве:

  1. Повторная передача (Retransmission): Клиент отправляет сегмент данных и запускает таймер. Если подтверждение (ACK) от сервера не приходит до истечения таймаута, клиент повторяет отправку. Этот процесс повторяется несколько раз (зависит от настроек ОС, например, net.ipv4.tcp_retries2 в Linux).
  2. Восстановление соединения: TCP попытается обнаружить обрыв и восстановить соединение, отправляя keep-alive probes (если включены) или реагируя на таймауты.
  3. Финальная ошибка: Если все попытки повторной передачи исчерпаны или соединение признано разорванным (например, получен RST-пакет), стек TCP сообщит об ошибке приложению (например, вернет ошибку ETIMEDOUT или ECONNRESET).

Пример на уровне приложения:

# Команда curl завершится с ошибкой, если TCP не сможет доставить данные
$ curl https://example.com
curl: (28) Connection timed out after 10000 milliseconds

Вывод: TCP обеспечивает надежность в условиях временных сетевых проблем, но не может гарантировать доставку при постоянном физическом обрыве соединения. Приложение всегда будет проинформировано о статусе операции (успех или конкретная ошибка).