用c编写支持连接持久性的http服务器
当我从浏览器读取请求时,HTTP连接头总是带有一个用c编写支持连接持久性的http服务器,c,http,server,connection,keep-alive,C,Http,Server,Connection,Keep Alive,当我从浏览器读取请求时,HTTP连接头总是带有一个Keep Alive值,因此我在向流写入响应后保持连接套接字描述符打开。我听说这会导致客户端(浏览器)重复使用相同的连接来发送下一个请求 但是客户端发送另一个connect()请求,以创建一个用于发送下一个请求的新连接 为什么浏览器在每个标题中都发送保持活动选项 客户端发送另一个connect()请求以创建新的连接以发送下一个请求 如果要向HTTP 1.0/1.1请求发送HTTP 1.0响应: 默认行为是连接:关闭,除非发送了连接:保持活动响应
Keep Alive
值,因此我在向流写入响应后保持连接套接字描述符打开。我听说这会导致客户端(浏览器)重复使用相同的连接来发送下一个请求
但是客户端发送另一个connect()
请求,以创建一个用于发送下一个请求的新连接
为什么浏览器在每个标题中都发送保持活动
选项
客户端发送另一个connect()请求以创建新的连接以发送下一个请求
如果要向HTTP 1.0/1.1请求发送HTTP 1.0响应:
- 默认行为是
,除非发送了连接:关闭
响应头(如果客户端发送了连接:保持活动
请求头,则仅)。如果不发送,客户端将别无选择,只能关闭连接并每次创建一个新连接连接:保持活动
- 默认行为是
,除非发送了Connection:keep alive
响应头,所以请确保您没有发送该响应头,除非客户端发送了Connection:close
请求头,或者您有意关闭连接Connection:close
无论哪种方式,如果在发送响应后连接将保持活跃,考虑也包括一个单独的响应头,以通知连接的客户端何时超时,如果客户端在超时结束之前不重新使用,则关闭。(然后确保在服务器代码中实际实现该超时)。例如:
Connection: keep-alive
Keep-Alive: timeout=300
为什么浏览器在每个头上都发送“保持活动”选项
因为它是按请求的功能。任何请求都可以请求保持连接活动,服务器每次都必须确认它。一旦连接关闭,它就消失了
客户端发送另一个connect()请求以创建新的连接以发送下一个请求
如果要向HTTP 1.0/1.1请求发送HTTP 1.0响应:
- 默认行为是
,除非发送了Connection:close
响应头(如果客户端发送了Connection:keep-alive
请求头,则只有),否则客户端将别无选择,只能关闭连接并每次创建一个新的连接Connection:keep-alive
- 默认行为是
,除非发送了Connection:keep alive
响应头,所以请确保您没有发送该响应头,除非客户端发送了Connection:close
请求头,或者您有意关闭连接Connection:close
无论哪种方式,如果在发送响应后连接将保持活跃,考虑也包括一个单独的响应头,以通知连接的客户端何时超时,如果客户端在超时结束之前不重新使用,则关闭。(然后确保在服务器代码中实际实现该超时)。例如:
Connection: keep-alive
Keep-Alive: timeout=300
为什么浏览器在每个头上都发送“保持活动”选项
因为它是每请求一次的功能。任何请求都可以请求保持连接的活动状态,服务器每次都必须确认。一旦连接关闭,它就会消失。确保所有响应都具有
内容长度:
或使用分块编码,以便客户端可以知道响应何时完成而不需要waiting等待您关闭连接。客户端可能会打开多个连接,以便他们可以同时下载多个项目。例如,当它下载HTML主页时,如果它看到
,它将打开另一个连接,同时下载,而不是等到它下载完所有HTML。请确保您已完成所有操作r响应要么具有内容长度:
,要么使用分块编码,这样客户端就可以在不等待您关闭连接的情况下判断响应何时完成。客户端可以打开多个连接,以便同时下载多个项目。例如,在下载HTML主页面时,如果它看到
它将同时打开另一个连接来下载,而不是等待下载完所有HTML。