Tcp Socket закрыт - PullRequest
       12

Tcp Socket закрыт

4 голосов
/ 12 марта 2010

Я всегда думал, что если вы не реализуете пульс, не было никакого способа узнать, неожиданно ли одна сторона TCP-соединения оборвалась. Если процесс был просто убит с одной стороны и не завершился корректно, у сокета не было возможности отправить FIN или сообщить другой стороне, что он был закрыт.

(см. Некоторые комментарии, например, http://www.perlmonks.org/?node_id=566568)

Но есть сервер заказов на акции, к которому я подключаюсь, в котором есть новая функция «отменить все заказы при отключении», которая отменяет текущие заказы, если клиент отключается. Это работает, даже когда я прекращаю процесс с моей стороны, и, безусловно, нет пульса от моего приложения к нему.

Так как же он может определить, когда я убил процесс? Мое приложение работает на Windows Server 2003, а сервер заказов - на Suse Linux Enterprise Server 10. Обнаруживает ли Windows, что процесс, связанный с сокетом, больше не работает, и отправляет FIN?

Ответы [ 3 ]

9 голосов
/ 12 марта 2010

При выходе из процесса - по какой-либо причине - ОС закрывает открытые соединения TCP.

Существует множество других способов, как TCP-соединение может оборваться незамеченным

  • кто-то извлекает сетевой кабель между ними.
  • компьютер на другом конце получает ядерное оружие.
  • межсетевой интерфейс nat молча обрывает соединение
  • ОС на другом конце сильно падает.
  • пакеты FIN теряются.

Несмотря на то, что tcp keepalive включен, вы обнаружите его в конце концов, по крайней мере, в течение нескольких часов.

2 голосов
/ 12 марта 2010

Насколько я знаю, ОС обнаруживает завершение процесса и закрывает все файловые дескрипторы / сокеты / дескрипторы, которые использовал процесс. Таким образом, нет разницы между «убийством» приложения и «изящным завершением». Конечно, само ядро ​​должно быть запущено (= компьютер включен, провод подключен ...). Но это на ОС работа по отправке FIN и так далее ... Кроме того, если хост становится недоступным / выключенным, отключенным ...), промежуточный шлюз (или сам клиент) может обнаружить событие (например, потеря несущей, аренда DHCP не возобновлена ​​...) и ответить на пакеты, отправленные на Умерший хост с ошибкой ICMP (хост / сеть недоступны). Это приводит к разрыву TCP-соединения однорангового узла, но это происходит только в том случае, если у клиента есть некоторый пакет для отправки на хост.

2 голосов
/ 12 марта 2010

Это может быть использование TCP Keep Alive для проверки мертвых пиров:

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...