我知道在使用HttpURLConnection时,Java尝试重用相同的TCP连接,以便向服务器发出多个请求,除非服务器端存在限制。实际上,当我看到wireshark日志时,HTTP标头的requestHeaders
之一就是Connection:keep-alive。但是当服务器返回数据时,我看到一个TCP [FIN,ACK]
数据包从我这边发送回服务器。
如何重用 tcp连接?
答案 0 :(得分:3)
在HTTP 1.0中,没有关于持久连接的官方规范。要使持久连接能够运行客户端请求,请通过添加Connection
标头来保持连接打开:
Connection: Keep-Alive
如果服务器决定连接应保持活动(即未关闭),则应该使用标头响应:
Connection: Keep-Alive
然后保持连接在其选择的任何定义的时间段内保持活动状态。请注意,保持活动“功能”不是HTTP 1.0的官方协议功能,因此如果客户端请求服务器,则不需要服务器来促进客户端的请求。
在HTTP 1.1中,它隐含了持久连接,因此如果您在使用HTTP / 1.1标头响应的服务器上发现这种情况,则怀疑服务器不遵守HTTP 1.1标准(除非服务器明确响应{{1标头的值为Connection
)。
然而,在任何情况下都存在由服务器定义的超时时段,其中后续请求应该被发送,否则连接被丢弃。这是为了防止客户端在没有正确关闭连接的情况下丢失未连接的垃圾邮件。
Java Close
对象尝试重用 TCP连接,但失败后将简单地回退到创建新的TCP连接。