Ответ
При потере TCP-пакета с ответом происходит следующее:
-
Таймаут ожидания – отправитель ждёт ACK в течение RTO (Retransmission Timeout). Если подтверждение не пришло, пакет переотправляется.
-
Экспоненциальное увеличение таймаута – при каждой неудачной попытке RTO увеличивается (например, по алгоритму Karn/Partridge).
-
Повторные попытки – после нескольких неудачных ретрансмиссий (обычно ~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) // Таймаут или разрыв соединения
}
Если ответ не приходит, приложение должно обработать ошибку (таймаут, разрыв) и предпринять действия (повторить запрос, уведомить пользователя и т. д.).