Как именно стек TCP в Windows определяет, что соединение было принудительно закрыто или сброшено одноранговым узлом?
Я знаю, что TCP в Windows по умолчанию пытается повторно передать неподтвержденный пакет 5 раз. Что произойдет, если после 5 попыток по-прежнему нет подтверждения? Он немедленно возвращает код WSAECONNRESET на блокирующем сокете?
Также, когда мы получаем код ошибки WSAECONNRESET, каково фактическое состояние этого TCP-соединения?
Сброс соединения обычно означает, что от удаленного хоста было какое-то сообщение, указывающее на ошибку, в отличие от отсутствия ответа, которое обычно вызывает WSAETIMEDOUT
.
Например, удаленный хост может отправить ICMP-сообщение «Порт недоступен», которое будет указывать на то, что удаленное приложение закрыло свой порт.
В этот момент TCP-соединение закрывается, хотя в вашем локальном сокете все еще могут быть ресурсы, ожидающие закрытия сокета.
Имейте в виду, что поведение может немного отличаться в зависимости от того, какая именно версия операционной системы задействована.