【问题标题】: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 将通过适当的超时值克服。

      【讨论】:

        猜你喜欢
        • 2021-02-26
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-03
        相关资源
        最近更新 更多