我已经为嵌入式系统设置了一个 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
参阅timeout
https://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html