Истекает ли время ожидания соединения, если клиент никогда не отправляет пакет FIN для закрытия соединения?

У меня есть HTTP-сервер, реализованный с помощью Netty. Для отправки сообщений в браузеры требуются длинные опросы. В большинстве случаев сервер не будет пытаться закрыть соединение.

В сеансе TCP, если какая-либо сторона хочет закрыть соединение, она отправляет пакет FIN другой стороне. Что если сервер не получает FIN от клиента, в таких случаях, как 1) у пользователя серьезные сбои в сети или 2) кто-то пытается атаковать сервер, гарантируется ли, что сервер Netty получит тайм-аут (или другой вроде) исключение по истечении определенного времени?

Если это правда, мне не нужно добавлять Read/WriteTimeoutHandler в мой конвейер канала, который закрывает канал, когда таймер запускает тайм-аут. Я должен закрыть канал в любом случае, иначе я буду пропускать ресурсы.

2 ответа

Решение

гарантируется ли, что сервер Netty получит исключение тайм-аута (или другого типа) после определенного времени?

Нет, есть SocketTimeoutException он выдается, если сокет находится в режиме блокировки и установлен тайм-аут чтения. Есть IOException: connection reset это может произойти, если TCP keepalive был включен, и соединение действительно разрывается в течение 2 часов: это не относится к случаю, когда узел просто молчит, а соединение остается работоспособным. В противном случае нет.

Согласно диаграмме состояния TCP, обе стороны FIN должны быть отправлены для закрытия соединений с обеих сторон. Но, если FIN потерян, как в ваших сценариях, TCP преодолеет правильные значения времени ожидания.

Другие вопросы по тегам