Что происходит с TCP-пакетом, если сервер завершен? - PullRequest
3 голосов
/ 13 февраля 2009

Я знаю, что TCP очень надежен, и то, что когда-либо отправлено, гарантированно доберется до места назначения. Но что произойдет, если после пакета отправлено, а до того, как поступит на сервер, сервер выйдет из строя? Подтверждается ли подтверждение того, что пакет успешно отправлен, по факту существования сервера при первоначальной отправке пакета или при успешной доставке пакета на сервер?

По сути, я спрашиваю: если сервер перестанет работать между отправкой и получением пакета, узнает ли клиент?

Ответы [ 3 ]

10 голосов
/ 13 февраля 2009

Это действительно не имеет значения, но вот некоторые мелкие детали:

Вы должны различать сервер-компьютер, который выключается, и сервер-процесс, который выключается.

Если сервер-машина дала сбой, то, очевидно, нечего принимать пакет. Отправляющий клиент не получит ни повторных запросов, ни подтверждения успеха или неудачи. После того, как клиент вообще не получил никакой обратной связи, клиент в конечном итоге получит тайм-аут и посчитает, что соединение разорвано. Это очень похоже на неожиданное физическое повреждение кабеля.

Если, однако, Сервер-Машина продолжает функционировать, но Сервер-Процесс дает сбой из-за программной ошибки, то принимающий стек TCP, который является функцией ОС, а не процесса, скорее всего, подтвердит пакет. и любые другие, которые прибывают. Это будет продолжаться до тех пор, пока ОС не уведомит стек TCP о том, что процесс больше не активен. Стек TCP, скорее всего, отправит клиенту уведомление о RST (сбросе) или может разорвать соединение (как описано выше)

2 голосов
/ 13 февраля 2009

Это в основном то, что происходит. Трудно описать всю реальность без привязки к ненужным деталям.

TCP управляет соединениями, которые определены как четыре кортежа (source-ip, source-port, dest-ip, dest-port).

Когда сервер закрывает соединение, соединение переводится в состояние TIME_WAIT2, где оно не может быть повторно использовано в течение определенного времени. Это время вдвое превышает максимальное значение времени жизни пакетов. Любые пакеты, поступающие в течение этого времени, отбрасываются самим TCP.

Итак, когда соединение становится доступным для повторного использования, все пакеты были уничтожены (в любом месте сети) либо:

  • получено в пункте назначения и выброшено из-за состояния TIME_WAIT2; или
  • уничтожается пересылщиками пакетов в сети из-за истекшего срока службы.
0 голосов
/ 13 февраля 2009

Когда вы отправляете пакет в сеть, грантополучателя никогда не будет, он благополучно перейдет на другую сторону. Надежность TCP достигается именно так, как вы предлагаете использовать пакеты подтверждения.

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