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