C语言实现HTTP 1.1长连接时服务端应在何时关闭socket连接?
HTTP 1.1 keep-alive 服务端实现问题解答
1. 默认空闲超时时间设定
HTTP 1.1 规范没有强制要求统一的空闲超时阈值,你可以根据自身服务的并发场景灵活调整:
- 通用静态资源服务的默认值参考:5~30秒是比较常见的配置,Apache默认5秒、Nginx默认75秒可作为参考
- 注意不要设置过长的超时时间:每个存活连接会占用一个文件描述符,过长的超时会导致高并发场景下文件描述符耗尽,服务无法接受新连接
2. 连接关闭的处理逻辑
先修复当前响应的兼容性问题
你现在返回的响应头缺少Content-Length字段也没有使用Transfer-Encoding: chunked分块编码,客户端无法准确判断响应体的结束边界,会导致长连接无法正常复用,必须先补上两个字段的其中一个。
空闲超时后的处理
- 如果客户端在你设定的超时时间内没有发送新请求,服务端可以直接正常关闭连接(走TCP四次挥手流程,不要发送RST包中断连接),不需要额外发送通知报文:此时没有正在处理的HTTP请求,直接关闭不会产生数据截断问题。
- 如果你是打算处理完当前正在请求的HTTP报文后就关闭连接,需要在本次响应的头中新增
Connection: close字段,主动通知客户端本次响应结束后连接会关闭,不要复用该连接发送新请求。
优化建议
你可以在响应头中明确返回Keep-Alive字段告知客户端你的超时策略,示例如下:
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 387 Connection: keep-alive Keep-Alive: timeout=10, max=100 <html><head><style>body{font-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>
上面的配置代表服务端会保持连接最多10秒空闲,单个长连接最多处理100次请求后主动关闭。
内容的提问来源于stack exchange,提问作者Huy Le
相关产品推荐
相关产品推荐

