Я отправляю HTTP-запрос на сервер. На сервере давно запущен обработчик запросов, и через 10 секунд возвращается 200. Если я отменю запрос и немедленно отправлю второй запрос, я ожидаю только один ответ на второй запрос. Но получил также ответ на первый, отмененный, запрос. Почему это может произойти?

Вот лог обмена wireshark между клиентом 192.168.1.3 и сервером xxx10

Пакет 21 - первый запрос.
Пакет 57 является первым запросом отмены.
Пакет 184 является ответом на первый запрос. Это не должно быть здесь! (?)

1 ответ1

4

TCP-соединения являются двунаправленными, и один фин закрывает только одно направление. Когда вы отменили свой запрос на стороне клиента, вы отправили Fin и серверный стек TCP подтвердил его, что подтверждает, что направление клиент-сервер теперь закрыто. Поэтому для вашего клиента было бы незаконно отправлять больше данных на сервер по этому соединению сейчас. Но так как сервер никогда не отправлял Fin, направление сервер-клиент по-прежнему открыто. Поэтому законно, что сервер продолжает отправлять данные по этому соединению, что он и делает: HTTP-ответ.

Если вы хотите немедленно закрыть оба направления, вы должны были отправить сброс TCP (Rst) вместо Fin.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .