【问题标题】:Writing an http server in c with connection persistence support用 c 编写一个支持连接持久性的 http 服务器
【发布时间】:2016-02-14 13:58:42
【问题描述】:

当我从浏览器读取请求时,HTTP 连接标头始终带有 Keep-Alive 值,因此我在向流写入响应后保持连接套接字描述符打开。我听说这会导致客户端(浏览器)将重用相同的连接来发送下一个请求。

但是客户端发送另一个connect()请求来创建一个新的连接来发送下一个请求。

为什么浏览器会在每个标头中发送keep-alive 选项?

【问题讨论】:

  • 确保你的所有响应要么有Content-Length:,要么使用分块编码,这样客户端就可以知道响应何时完成,而无需等待你关闭连接。
  • 客户端可以打开多个连接,以便他们可以同时下载多个项目。例如,当它正在下载主 HTML 页面时,如果它看到 <img>,它将同时打开另一个连接来下载它,而不是等到它下载完所有 HTML。

标签: c http server connection keep-alive


【解决方案1】:

客户端发送另一个 connect() 请求以创建一个新连接以发送下一个请求。

如果您向 HTTP 1.0/1.1 请求发送 HTTP 1.0 响应:

  • 默认行为是Connection: close,除非发送了Connection: keep-alive 响应标头(如果客户端发送Connection: keep-alive 请求标头!)。如果您不发送,客户端将别无选择,只能关闭连接并每次创建一个新连接。

如果您向 HTTP 1.1 请求发送 HTTP 1.1 响应:

  • 默认行为是Connection: keep-alive,除非发送了Connection: close 响应标头,因此请确保您不发送该响应标头,除非客户端发送Connection: close 请求标头,或者您有意关闭连接。

无论哪种方式,如果在发送响应后连接将保持活动状态,请考虑包含一个单独的Keep-Alive 响应标头,以通知兼容的客户端连接何时超时并​​在客户端未超时时关闭在超时过去之前重新使用它(然后确保在您的服务器代码中实际实现该超时)。例如:

Connection: keep-alive
Keep-Alive: timeout=300

为什么浏览器会在每个标头中发送 keep-alive 选项?

因为它是每个请求的功能。任何请求都可以要求保持连接处于活动状态,并且服务器每次都必须确认它。一旦连接被关闭,它就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多