C套接字HTTP 1.1持久连接服务器何时应关闭套接字?

Posted

技术标签:

【中文标题】C套接字HTTP 1.1持久连接服务器何时应关闭套接字?【英文标题】:C socket HTTP 1.1 persistent connection when should server close the socket? 【发布时间】:2021-12-12 11:59:59 【问题描述】:

我有一个使用原始 C 的简单 Web 服务器,它尝试实现 HTTP 1.1 的“保持活动”功能。但是,如果客户端没有指定额外的信息,有没有办法知道服务器应该等待多长时间?下面是关于来自浏览器的 HTTP GET 请求以获取localhost:9999/ 以及来自服务器的响应的示例。浏览器在第一个请求之后不会发送任何额外的请求,但服务器仍然必须保持连接打开。

//request
GET / HTTP/1.1
Host: localhost:9999
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9


//response
HTTP/1.1 200 OK
Content-Type: text/html

<html><head><style>bodyfont-family: monospace; font-size: 14px;td padding: 2px 7px;</style></head><body><table>
<tr><td><a href="ctpl.h">ctpl.h</a></td><td>2021-10-27 09:38</td><td>9.8K</td></tr>
<tr><td><a href="M_files/">M_files/</a></td><td>2021-10-24 16:23</td><td>[DIR]</td></tr>
</table></body></html>

在这种情况下,服务器接下来应该做什么?它应该忽略连接(并在一段时间后关闭它)还是要求客户端关闭它?

【问题讨论】:

【参考方案1】:

但服务器仍然必须保持连接打开。

HTTP keep-alive 不要求连接保持打开状态。客户端和服务器都可以随时关闭空闲连接,即在请求和响应完成后。

客户端和服务器都可以从保持连接打开中获益,因为这会减少新请求的开销。但是保持过多的连接打开也有它的成本,特别是在服务器上,因为它会消耗内存和其他资源。因此,服务器通常会在一段时间后或达到某些资源限制后关闭空闲连接。

...或要求客户端关闭它

除了发起 TCP 关闭之外,服务器没有办法询问客户端。

【讨论】:

所以正确的解决方案就是让服务器关闭任何长时间(~5秒)不活动的连接,对吗? @HuyLe:让服务器关闭连接是正确的。合适的值取决于网站的类型、服务器上可用的资源等。同样,关闭太晚可能会由于资源使用过多而影响服务器性能,关闭太早可能会影响连接性能,因为来自同一个客户端将需要一个相对昂贵的新 TCP/TLS 连接设置。

以上是关于C套接字HTTP 1.1持久连接服务器何时应关闭套接字?的主要内容,如果未能解决你的问题,请参考以下文章

C |套接字未正确关闭

如何使用java套接字编程知道网络何时关闭

HTTP/1.1 "persistent" 连接

知识点回顾(自顶向下)

关闭后从套接字读取数据

http2 TCP 连接何时关闭?