У нас есть серверное приложение, которое сталкивается с проблемами исчерпания TCP при примерно 4000 подключениях. Это будет происходить каждые 3-4 недели (приблизительно). Поставщик, создавший это серверное приложение, сообщает нам после изучения вывода netstat -b, что некоторые соединения остаются открытыми, даже если клиенты разорваны.
Мне было поручено выяснить, почему конкретное клиентское приложение не закрывает TCP-соединение должным образом. Я верю, что если клиентский компьютер выключен, он НЕ МОЖЕТ сообщить с сервера, что TCP-соединение все еще установлено с этим клиентом. К сожалению, я не могу найти никакой информации, подтверждающей мою точку зрения. Я не хочу больше тратить время на изучение потенциальной проблемы, которая, как мне кажется, даже не может быть проблемой.
tldr;
Может ли сервер сообщить об установленном подключении к выключенному компьютеру?
TCP не пытается обнаружить обрыв соединения, кроме как на стороне, передающей данные. За это отвечает код приложения, вызывающий стек TCP. Какой протокол здесь задействован? (Тот, который находится поверх TCP.)
Это ужасно уродливое "решение", но вы можете включить Протоколы активности TCP. Есть больше в этой статье.
Да, это возможно. Как Дэвид и Пол заявили в своих ответах, в TCP нет механизма (кроме TCP keep-alive, который является необязательным) для обнаружения полуоткрытого соединения. Поставщик приложения должен определить состояние подключения и предпринять соответствующие действия.
Что касается TCP, не существует обнаружения или различия между полуоткрытым соединением и длительным неиспользуемым соединением.
Вам нужно будет начать устранение неполадок с уровня 1 (физического) модели OSI до уровня 7 (приложения), чтобы выяснить, где возникает проблема. Я бы посоветовал установить и запустить программу захвата пакетов на одном из затронутых клиентов, пока не возникнет проблема, а затем проанализировать захват, чтобы попытаться определить, что заставляет клиента не закрывать соединение.
Когда рабочая станция хочет закрыть соединение с сервером, она отправляет TCP FIN. Если клиент не ведет себя должным образом и не закрывает свои соединения, они фактически могут оставаться установленными на сервере. Вы можете установить тайм-ауты для открытых соединений на сервере, чтобы очистить их, хотя было бы лучше найти причину. В какой порт входят открытые соединения? Как только вы узнаете, к какой службе осуществляется доступ, вы сможете определить клиентское приложение, которое обращается к серверу.