Истекает ли время ожидания соединения, если клиент никогда не отправляет пакет FIN для закрытия соединения?
У меня есть HTTP-сервер, реализованный с помощью Netty. Для отправки сообщений в браузеры требуются длинные опросы. В большинстве случаев сервер не будет пытаться закрыть соединение.
В сеансе TCP, если какая-либо сторона хочет закрыть соединение, она отправляет пакет FIN другой стороне. Что если сервер не получает FIN от клиента, в таких случаях, как 1) у пользователя серьезные сбои в сети или 2) кто-то пытается атаковать сервер, гарантируется ли, что сервер Netty получит тайм-аут (или другой вроде) исключение по истечении определенного времени?
Если это правда, мне не нужно добавлять Read/WriteTimeoutHandler в мой конвейер канала, который закрывает канал, когда таймер запускает тайм-аут. Я должен закрыть канал в любом случае, иначе я буду пропускать ресурсы.
2 ответа
гарантируется ли, что сервер Netty получит исключение тайм-аута (или другого типа) после определенного времени?
Нет, есть SocketTimeoutException
он выдается, если сокет находится в режиме блокировки и установлен тайм-аут чтения. Есть IOException: connection reset
это может произойти, если TCP keepalive был включен, и соединение действительно разрывается в течение 2 часов: это не относится к случаю, когда узел просто молчит, а соединение остается работоспособным. В противном случае нет.
Согласно диаграмме состояния TCP, обе стороны FIN должны быть отправлены для закрытия соединений с обеих сторон. Но, если FIN потерян, как в ваших сценариях, TCP преодолеет правильные значения времени ожидания.