2010-03-11 3 views
4

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

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

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

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

ответ

7

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

Там же множество других способов соединения TCP может пойти мертвым незамеченной

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

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

+0

Btw вы можете подробнее описать, как «пакеты FIN теряются»? – Pacerier

+1

@Pacerier Ну, IP ненадежен, существует несколько способов падения или повреждения пакетов. Если пакет FIN (и последующие повторные передачи FIN или RST-пакеты), который должен взаимодействовать со сверстником, который должен быть закрыт, потерян, эксперт никогда не узнает об этом факте. Возможно, сверстник ожидает получить больше данных, которых никогда не будет. – nos

+0

Да, я имею в виду, как насчет «количества способов падений пакетов или их повреждения»? – Pacerier

2

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

Смежные вопросы