Назад | Перейти на главную страницу

Что происходит, когда сервер отправляет пакет данных клиенту, когда последний (клиент) находится в состоянии TCP FIN-WAIT-1?

В соответствии с Руководство по TCP / IP, когда клиент закрывает TCP-сеанс, он отправляет пакет с ПЛАВНИК установить на Сервер и перейти на FIN-WAIT-1, однако он говорит:

В этом состоянии клиент по-прежнему может получать данные от сервера, но больше не будет принимать данные от своего локального приложения для отправки на сервер.

Итак, мой вопрос: что произойдет, если Сервер отправит данные обратно Клиенту? поскольку приложение, вероятно, уже закрыто или не находится в состоянии, когда оно больше может читать из сокета, куда будут отправляться данные? Кроме того, клиент отправит ACK вернуться за этими данными? что тогда происходит с подключением? (RST может быть?)

Примечание: меня не интересуют такие данные, я просто хочу знать, есть ли потенциально утечка памяти, учитывая, что ни один процесс не считывается из буфера TCP, или сам сетевой стек позаботится об этом.

Спасибо.

поскольку приложение, вероятно, уже закрыто или не находится в состоянии, когда оно больше может читать из сокета, куда будут отправляться данные?

Это зависит от реализации. Если сокет закрыт на стороне приложения, стек TCP может просто сбросить эти входящие данные на пол. В качестве альтернативы у вас может быть реализация, которая не вернулась из close() (или аналогичный) до тех пор, пока не будет получен FIN сервера, позволяя другому потоку продолжить read() из розетки (хотя write() получит сообщение об ошибке). Если read() не завершилась до прибытия FIN сервера, можно было сигнализировать EOF. (Замените «поток» на «обратный вызов» в асинхронной модели).

Лучший способ ответить на ваш вопрос: протестируйте его на предпочтительной реализации (-ах).