启用保持连接时 HTTP 客户端泄漏连接

启用保持连接时 HTTP 客户端泄漏连接

我已经为嵌入式系统设置了一个 HTTP 服务器,以便与已知的非恶意远程客户端应用程序进行通信。

我不得不禁用服务器上的保持连接支持,因为远程客户端应用程序始终请求保持连接,但从不重用连接。相反,客户端会为每个请求打开一个新连接,并无限期地保持旧连接打开。

例如:

客户端发送:

POST /my_server_path HTTP/1.1
accept: text/plain, */*; q=0.01
accept-encoding: gzip
connection: keep-alive
content-length: 4
content-type: application/x-www-form-urlencoded;charset=UTF-8
host: some_host:1234
origin: https://the_origin.com

test

我的服务器响应:

HTTP/1.1 200 OK
access-control-allow-headers: post-body
access-control-allow-origin: https://the_origin.com
allow: POST, OPTIONS
connection: keep-alive
content-length: 4
content-type: text/html
date: Mon, 01 Feb 2018 15:00:00 GMT
server: MyServer/1.0

test

虽然我的 HTTP 服务器支持关闭陈旧连接,但我已开始发送Connection: closed每个请求以减少系统负载。

这种行为是否正常,我是否遗漏了什么,或者我是否正确地假设这是远程客户端应用程序的一个错误?

答案1

虽然不太好,但客户端可以自由地关闭连接并使用另一个连接。当然,请求保持活动状态然后不使用它是很愚蠢的,因此您可以将其作为错误进行定位,但这仍然是可能发生的情况。它也可能与路径中的代理有关。

请参阅 RFC 7230 并注意“可以”:

客户端可以通过持久连接发送其他请求,直到它发送或收到“关闭”连接选项,或者收到没有“保持活动”连接选项的 HTTP/1.0 响应。

这就是为什么服务器不应该长时间保持太多打开的保持活动连接。它可以通过标Keep-Alive头向客户端发出其策略信号。

max参阅timeouthttps://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html

相关内容