当我从浏览器读取请求时,HTTP 连接标头始终带有一个Keep-Alive
值,因此我在向流写入响应后保持连接套接字描述符打开。我听说这会导致客户端(浏览器(将重用相同的连接来发送下一个请求。
但是客户端发送另一个connect()
请求以创建新连接以发送下一个请求。
为什么浏览器会keep-alive
每个标题发送选项?
客户端发送另一个 connect(( 请求以创建一个新连接来发送下一个请求。
如果要向 HTTP 1.0/1.1 请求发送 HTTP 1.0 响应:
- 默认行为是
Connection: close
除非发送Connection: keep-alive
响应标头(仅当客户端发送Connection: keep-alive
请求标头时! 如果您不发送该连接,客户端将别无选择,只能关闭连接并每次创建一个新连接。
请求发送 HTTP 1.1 响应:
- 除非发送
Connection: close
响应标头,否则默认行为Connection: keep-alive
,因此请确保除非客户端发送Connection: close
请求标头,否则不会发送该标头,或者有意关闭连接。
无论哪种方式,如果在发送响应后连接将保持活动状态,请考虑还包括一个单独的Keep-Alive
响应标头,以通知兼容的客户端连接何时超时,如果客户端在超时之前未重用连接,则连接何时关闭(然后确保在服务器代码中实际实现该超时(。 例如:
Connection: keep-alive
Keep-Alive: timeout=300
为什么浏览器会为每个标头发送保持活动状态选项?
因为它是按请求的功能。 任何请求都可以要求保持连接活动状态,并且服务器每次都必须确认它。一旦连接关闭,它就会消失。