【问题标题】:Persistent HTTP connection Java持久 HTTP 连接 Java
【发布时间】:2014-01-12 15:47:27
【问题描述】:

我知道在使用 HttpURLConnection 时,Java 会尝试重用相同的 TCP 连接来处理对服务器的多个请求,除非服务器端有限制。事实上,当我看到wireshark 日志时,HTTP 标头的requestHeaders 之一是Connection: keep-alive。但是当服务器返回数据时,我看到一个 TCP [FIN,ACK] 数据包从我这边发送回服务器。

这究竟是如何重用 tcp 连接的?

【问题讨论】:

    标签: java http tcp httpurlconnection


    【解决方案1】:

    在 HTTP 1.0 中,没有关于持久连接概念的官方规范。为了使持久连接正常工作,客户端请求通过添加 Connection 标头来保持打开连接:

    Connection: Keep-Alive
    

    如果服务器决定连接应该保持活动状态(即不关闭),它应该用标头响应:

    Connection: Keep-Alive
    

    然后在它选择的任何定义的时间段内保持连接处于活动状态。请注意,保持活动“功能”不是 HTTP 1.0 的官方协议功能,因此如果客户端请求,则不需要服务器来促进客户端的请求。

    在 HTTP 1.1 中,它隐含了持久连接,因此,如果您在使用 HTTP/1.1 标头响应的服务器上看到这种情况发生,则怀疑该服务器没有遵守 HTTP 1.1 标准(除非服务器明确响应 Connection标头的值为Close)。

    在任何情况下,服务器都定义了一个超时期限,在该期限内应发送后续请求,否则连接将被断开。这是为了防止客户端在未正确关闭连接的情况下丢弃未关闭连接的垃圾邮件。

    Java HttpURLConnection 对象尝试重用 TCP 连接,但失败后将简单地退回到创建新的 TCP 连接。

    【讨论】:

    • 谢谢,我刚刚再次检查了我的日志,服务器似乎确实响应 HTTP/1.1 OK 响应,但是 Connection 标头的值为:Close。我想服务器是这样配置的。
    • @astralmaster 保持连接打开确实有助于更有效的内容传输,但也会使服务器容易受到 DoS 攻击,因为可以打开多个持久连接(浪费服务器资源),这可能会很快使服务器不堪重负。在这种情况下,禁用持久连接几乎可以被视为一种安全措施(尽管不是一种非常有效的措施)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2011-04-27
    相关资源
    最近更新 更多