3

我有一个用 Netty 实现的 HTTP 服务器。将消息推送到浏览器需要长轮询连接。在大多数情况下,服务器不会尝试关闭连接。

在 TCP 会话中,如果任何一方想要关闭连接,它会向另一方发送一个 FIN 数据包。如果服务器没有收到来自客户端的 FIN,例如 1) 用户有硬网络故障或 2) 有人试图攻击服务器,是否保证 Netty 服务器会收到超时(或其他某种)在给定时间后的异常?

如果是真的,我不需要在我的通道管道中添加一个 Read/WriteTimeoutHandler,它会在定时器触发超时时关闭通道。无论哪种方式我都必须关闭通道,否则我会泄漏资源。

4

2 回答 2

2

是否保证 Netty 服务器在给定时间后会收到超时(或其他类型的)异常?

否。SocketTimeoutException如果套接字处于阻塞模式并且设置了读取超时,则会抛出一个。如果启用了 TCP keepalive 并且连接确实保持断开 2 小时,则IOException: connection reset可能会发生这种情况:这不包括对等方仅保持沉默而连接保持有效的情况。否则没有。

于 2012-11-29T09:43:31.713 回答
0

根据 TCP 状态图,双方都应该发送 FIN 来关闭双方的连接。但是,如果 FIN 在您的场景中丢失,TCP 将通过适当的超时值克服。

于 2012-11-30T06:59:37.140 回答