Tcp-соединения зависают в состоянии ожидания закрытия

клиент сначала закройте сокет, когда с сервера не так много данных, завершение tcp-соединения в порядке, как:

FIN -->
   <-- ACK
   <-- FIN, ACK
ACK -->

когда сервер занят отправкой данных:

FIN -->
    <-- ACK,PSH
RST -->

и соединение с сервером приходит в состояние CLOSE_WAIT и висит там в течение длительного времени.

в чем проблема? связанные с клиентом или сервером? Это происходит на Redhat5 для локальных сокетов.

этой статьи поговорим о том, почему "RST" отправлено, но я не знаю, почему соединение с сервером застряло на CLOSE_WAIT, и не отправляйте FIN out.

[EDIT] я проигнорировал самую важную информацию, это происходит при эмуляции сети slirp qemu. Кажется, это проблема ошибки slirp для работы с тесным соединением.

3 ответов


это означает, что в потоке остались непрочитанные данные, которые клиент не закончил читать.

вы можете отключить его с помощью . вот соответствующая документация для Linux (также см. опцию себя здесь), и [вот соответствующая function2] для Win32.

это серверная сторона, которая остается открытой, поэтому на стороне сервера вы можете попробовать отключить SO_LINGER.


Это может означать, что сервер не закрыл сокет. Вы можете легко сказать это, используя "lsof", чтобы перечислить файловые дескрипторы, открытые этим процессом, который будет включать TCP-сокеты. Исправление состоит в том, чтобы процесс всегда закрывал сокет, когда он закончен (даже в случаях ошибок и т. д.)


Это известный дефект для qemu.