持久化HTTP连接Java

5
我知道当使用HttpURLConnection时,Java会尝试在服务器没有限制的情况下重复使用同一TCP连接来发送多个请求。实际上,在查看Wireshark日志时,HTTP头中的一个requestHeaders是Connection: keep-alive。但是当服务器返回数据时,我会看到我的一侧向服务器发送了一个TCP [FIN,ACK]包。
那么这种TCP连接的“重用”是如何实现的呢?
1个回答

3
在HTTP 1.0中,关于持久连接的概念没有官方规范。为了使持久连接正常工作,客户端需要通过添加"Connection"头部请求保持连接打开状态,示例如下:
Connection: Keep-Alive

如果服务器决定保持连接不关闭,它应该响应以下标头:
```html Connection: keep-alive ```
Connection: Keep-Alive

紧接着,保持连接活动状态并选择任何定义的时间段。请注意,保持活动状态的“功能”不是HTTP 1.0的官方协议功能,因此服务器无需满足客户端的请求。

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

无论如何,服务器都会有一个超时期限,在此期限内应发送后续请求,否则将断开连接。这是为了防止客户端在未正确关闭连接的情况下产生未关闭的连接垃圾邮件。

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


谢谢,我刚刚再次检查了我的日志,服务器似乎确实响应了HTTP/1.1 OK响应,但是连接头的值为:Close。我想服务器是这样配置的。 - astralmaster
@astralmaster 保持连接开放确实可以促进更有效的内容传输,但也会使服务器容易受到拒绝服务攻击,因为可以打开多个持久连接(浪费服务器资源),这可能会迅速压垮服务器。在这种情况下,禁用持久连接几乎可以看作是一种安全措施(虽然不是非常有效的措施)。 - initramfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接