【问题标题】:Does the connection timeout if the client never sends a FIN packet to close the connection?如果客户端从不发送 FIN 数据包关闭连接,连接是否超时?
【发布时间】:2012-11-17 08:14:15
【问题描述】:
我有一个使用 Netty 实现的 HTTP 服务器。将消息推送到浏览器需要长轮询连接。在大多数情况下,服务器不会尝试关闭连接。
在一个 TCP 会话中,如果任何一方想要关闭连接,它会向另一方发送一个 FIN 数据包。如果服务器没有收到来自客户端的 FIN 怎么办,例如 1)用户有硬网络故障或 2)有人试图攻击服务器,是否保证 Netty 服务器会收到超时(或其他某种)在给定时间后的异常?
如果是这样,我不需要将 Read/WriteTimeoutHandler 添加到我的通道管道中,它会在计时器触发超时时关闭通道。无论哪种方式我都必须关闭频道,否则我会泄漏资源。
【问题讨论】:
标签:
java
networking
tcp
netty
tcplistener
【解决方案1】:
是否保证 Netty 服务器在给定时间后会收到超时(或其他类型的)异常?
没有。如果套接字处于阻塞模式并且设置了读取超时,则会抛出SocketTimeoutException。如果 TCP keepalive 已启用并且连接确实保持断开 2 小时,则可能会发生IOException: connection reset:这不包括对等方仅保持沉默而连接保持有效的情况。否则不行。
【解决方案2】:
根据TCP状态图,双方都要发送FIN来关闭双方的连接。但是,如果 FIN 在您的场景中丢失,TCP 将通过适当的超时值克服。