TCP-соединения зависают в состоянии CLOSE_WAIT
-
19-09-2019 - |
Вопрос
Клиент сначала закрывает сокет, когда с сервера не так много данных, отключение TCP-соединения нормально, например:
FIN -->
<-- ACK
<-- FIN, ACK
ACK -->
Когда сервер занят отправкой данных:
FIN -->
<-- ACK,PSH
RST -->
И соединение с сервером приходит в состояние CLOSE_WAIT и долго там зависает.
В чем здесь проблема?Связано с клиентом или с сервером?Это происходит на Redhat5 для локальных сокетов.
Этот статья поговорим о том, почему отправляется «RST», но я не знаю, почему соединение с сервером зависло на CLOSE_WAIT и не отправляет FIN.
[EDIT] Я проигнорировал самую важную информацию, это происходит при эмуляции сети qemu slirp.Кажется, это проблема с ошибкой при работе с тесным соединением.
Решение 3
Это известный дефект для Кему.
Другие советы
Это означает, что в потоке остались непрочитанные данные, которые клиент еще не закончил читать.
Вы можете принудительно отключить его, используя SO_LINGER
вариант. Вот соответствующая документация для Linux (см. также саму опцию, здесь) и [вот соответствующая функция2] для Win32.
Серверная часть остается открытой, поэтому вы можете попробовать отключить ее на стороне сервера. SO_LINGER
.
Это может означать, что сервер не закрыл сокет.Вы можете легко определить это, используя «lsof» для вывода списка дескрипторов файлов, открытых этим процессом, которые будут включать TCP-сокеты.Исправление состоит в том, чтобы процесс всегда закрывал сокет после завершения (даже в случае ошибок и т. д.).