1

У кого-нибудь есть идея, что может привести к тому, что TCP-соединение (на стороне клиента) будет оставаться в состоянии ESTABLISHED около 24 часов, даже если сервер был перезапущен? Клиентский процесс остается на системном вызове recv и остается таким же, не вызывая ошибки!

Клиент находится на установке Ubuntu 11.04. Это уже случалось со мной несколько раз, но я не могу понять, почему или как это решить.

1 ответ1

3

Соединение остается УСТАНОВЛЕННЫМ с одной стороны и не существующим с другой, потому что это состояние, в котором оно находилось после перезапуска сервера. Клиент не знает, что сервер перезапустился, и сервер не знает, что клиент думает, что он все еще подключен. Если клиент не попытается использовать соединение, оно останется таким навсегда. (Если не включены keepalive, в этом случае он будет оставаться таким около двух дней.)

Почему клиент всегда ждет сервера ?! Либо клиент, либо протокол нарушен. Если клиент не следует протоколу, клиент сломан. Если в протоколе не указано, как обнаружить мертвое соединение, протокол нарушается.

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

Действительно ли в спецификации протокола говорится, что нужно ждать данных вечно ? Если так, я бы поставил под сомнение разумность разработчиков протокола.

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