Что происходит, если ответ при передаче по TCP не приходит

«Что происходит, если ответ при передаче по TCP не приходит» — вопрос из категории Сети, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При потере TCP-пакета с ответом происходит следующее:

  1. Таймаут ожидания – отправитель ждёт ACK в течение RTO (Retransmission Timeout). Если подтверждение не пришло, пакет переотправляется.

  2. Экспоненциальное увеличение таймаута – при каждой неудачной попытке RTO увеличивается (например, по алгоритму Karn/Partridge).

  3. Повторные попытки – после нескольких неудачных ретрансмиссий (обычно ~15) соединение разрывается.

Пример обработки в Go:

conn, _ := net.Dial("tcp", "example.com:80")
conn.SetDeadline(time.Now().Add(5 * time.Second)) // Установка таймаута
_, err := conn.Write([]byte("request"))
if err != nil {
    log.Println("Write failed:", err) // Таймаут или разрыв соединения
}

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