Насколько распространен прием пакетов от TCP-соединения ПОСЛЕ инициирующего завершения с пакетом FIN? - PullRequest
0 голосов
/ 27 октября 2019

Я недавно читал о прекращении TCP-соединения в доброй старой Википедии [1], и в упомянутой статье упоминалась возможность полуоткрытого состояния [2]. По сути, машина, которая инициирует закрытие TCP-соединения, «должна» продолжить чтение данных, пока не завершится и другая сторона. Это делается на каждой стороне с помощью сегмента / пакета TCP, для которого установлен флаг FIN.

Меня беспокоит это слово "следует". У меня есть два вопроса проверки работоспособности:

Во-первых, как часто это, ДЕЙСТВИТЕЛЬНО? Мне кажется, что, вообще говоря, клиент или запросчик ресурсов должен был бы инициировать разрыв соединения TCP, и они будут делать это после получения всего, что им нужно. При нормальных обстоятельствах не должно быть никаких пакетов, проходящих по проводам, когда соединение TCP завершено, верно?

На связанном примечании, это утверждение, что терминатор соединения "должен" продолжать принимать данныеСильное требование или больше руководства? Как упоминалось выше, с моей точки зрения, соединение может преждевременно закрыться, если что-то пойдет не так, и в этом случае, вероятно, будет невозможно продолжить чтение данных. На мой взгляд, это была бы лазейка в безопасности для продолжения обработки данных. Я мог бы выполнить DDOS-атаку уровня 4, открыв множество TCP-соединений с мошенническими клиентами и отправляя непрерывные спам-данные, даже не отправляя пакет FIN.

[1] https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination [2] https://en.wikipedia.org/wiki/TCP_half-open

1 Ответ

2 голосов
/ 27 октября 2019

Я предполагаю, что отправка пакета FIN является синонимом сообщения о том, что я хочу разорвать соединение как можно скорее

Это не так. Отправка FIN просто означает, что эта сторона закончила отправку данных, а не то, что она закончила получение данных. Такие half-close могут, например, использоваться клиентом для сигнализации о завершении запроса, но затем все еще ждать ответа сервера - который затем завершается с помощью FIN, что приводит к полностью закрытомуподключение. Тем не менее, хотя такой дизайн протокола возможен в теории, на практике это не часто.

Но вы можете столкнуться с данными клиента после FIN сервера при использовании постоянных соединений HTTP: Сервер может закрыть незанятое соединение в любое время после отправки ответа на запрос. Но клиент может отправить новый запрос на соединение, которое все еще открыто. Поскольку существует некоторая задержка между отправкой FIN на сервере и получением и обработкой его на клиенте, отключение неактивного соединения на сервере и отправка нового запроса на клиенте могут перекрываться. В этом случае вы получите новые данные на сокете сервера, даже если сокет сервера был отключен для отправки.

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