在 c 中编写一个具有连接持久性支持的 http 服务器
Writing an http server in c with connection persistence support
当我从浏览器读取请求时,HTTP 连接 header 总是带有一个 Keep-Alive
值,所以我保留了连接套接字描述符在对流写入响应后打开。我听说这会导致客户端(浏览器)将重用相同的连接来发送下一个请求。
但是客户端发送了另一个connect()
请求来创建一个新的连接来发送下一个请求。
为什么浏览器会在每个 header 时发送 keep-alive
选项?
the client sends another connect() request to create a new connection for sending the next request.
如果您要向 HTTP 1.0/1.1 请求发送 HTTP 1.0 响应:
- 默认行为是
Connection: close
,除非发送 Connection: keep-alive
响应 header(只有 如果客户端发送 Connection: keep-alive
请求 header!)。如果你不发送那个,客户端将别无选择,只能关闭连接并每次都建立一个新连接。
如果您要向 HTTP 1.1 请求发送 HTTP 1.1 响应:
- 默认行为是
Connection: keep-alive
,除非发送 Connection: close
响应 header,因此请确保您不会发送该响应,除非客户端发送 Connection: close
请求 header,或者你是故意关闭连接。
无论哪种方式,如果在发送响应后连接将保持活动状态,请考虑还包含一个单独的 Keep-Alive
响应 header 以通知兼容的客户端连接何时超时如果客户端在超时之前没有 re-use 则关闭它(然后确保在您的服务器代码中实际实现该超时)。例如:
Connection: keep-alive
Keep-Alive: timeout=300
why do browsers send keep-alive option with every header?
因为它是 per-request 功能。任何请求都可以要求保持连接,服务器每次都必须确认它。一旦连接关闭,它就消失了。
当我从浏览器读取请求时,HTTP 连接 header 总是带有一个 Keep-Alive
值,所以我保留了连接套接字描述符在对流写入响应后打开。我听说这会导致客户端(浏览器)将重用相同的连接来发送下一个请求。
但是客户端发送了另一个connect()
请求来创建一个新的连接来发送下一个请求。
为什么浏览器会在每个 header 时发送 keep-alive
选项?
the client sends another connect() request to create a new connection for sending the next request.
如果您要向 HTTP 1.0/1.1 请求发送 HTTP 1.0 响应:
- 默认行为是
Connection: close
,除非发送Connection: keep-alive
响应 header(只有 如果客户端发送Connection: keep-alive
请求 header!)。如果你不发送那个,客户端将别无选择,只能关闭连接并每次都建立一个新连接。
如果您要向 HTTP 1.1 请求发送 HTTP 1.1 响应:
- 默认行为是
Connection: keep-alive
,除非发送Connection: close
响应 header,因此请确保您不会发送该响应,除非客户端发送Connection: close
请求 header,或者你是故意关闭连接。
无论哪种方式,如果在发送响应后连接将保持活动状态,请考虑还包含一个单独的 Keep-Alive
响应 header 以通知兼容的客户端连接何时超时如果客户端在超时之前没有 re-use 则关闭它(然后确保在您的服务器代码中实际实现该超时)。例如:
Connection: keep-alive
Keep-Alive: timeout=300
why do browsers send keep-alive option with every header?
因为它是 per-request 功能。任何请求都可以要求保持连接,服务器每次都必须确认它。一旦连接关闭,它就消失了。