Как TCP — соединение может быть закрыто удаленным устройством во время TcpListener AcceptSocket?

#c# #.net #sockets #tcp

Вопрос:

У меня есть служба, которая прослушивает SSL-соединения. Недавно возникла проблема, из-за которой цикл TcpListener выглядел так, как будто он перестал выполняться. Мы предполагали, что это как-то связано с SSL-рукопожатием, но оно было полностью зарегистрировано с помощью некоторых журналов catch all, и ничего не было видно. После некоторых изменений и дополнительной регистрации я понимаю, что проблема не в SSL-соединении, а в TcpListern.Метод AcceptSocketAsync. Исключением является

Система.Сеть.Сокеты.Исключение SocketException (10054): Существующее соединение было принудительно закрыто удаленным хостом.

Мой вопрос в том, как можно закрыть соединение во время метода AcceptSocketAsync? Я думал, что TCP-SYN попадет на сервер, и код завершит метод AcceptSocketAsync. Протокол TCP сначала должен включаться только при следующем вызове для отправки ИЛИ получения в этом сокете.

Комментарии:

1. На самом деле tcp-квитирование содержит 3 пакета: клиент:SYN, сервер:SYN ACK, клиент:ACK. Можете ли вы отслеживать соединение с помощью tcpdump, wireshark или чего-то еще в этом роде?

2. Я уже видел несколько случаев с задействованным балансировщиком сетевой нагрузки или дублированием IP-адресов в сети. Инструменты мониторинга сети могут очень помочь.