4

尝试使用 Linux 套接字接口在 C 中实现一个简单的 HTTP 服务器时,我遇到了一些我希望它具有的某个功能的困难,即持久连接。使用单独的 TCP 连接一次发送一个文件相对容易,但它似乎不是一个非常有效的解决方案(例如考虑多次握手)。无论如何,服务器应该在一个 TCP 连接期间处理多个请求(HTML、CSS、图像)。你能给我一些如何解决这个问题的线索吗?

4

1 回答 1

10

这很简单——写完回复后不要关闭 TCP 连接。

有两种方法可以做到这一点,流水线和非流水线。

在非流水线实现中,您在套接字上读取一个 http 请求,对其进行处理,将其从套接字中写回,然后尝试读取另一个请求。继续这样做直到远程方关闭套接字,或者在大约 10 秒后停止在套接字上收到请求后自己关闭它。

在流水线实现中,读取与套接字上的请求一样多的请求,并行处理它们,然后将它们全部写回到套接字上,顺序与接收它们的顺序相同。您一直有一个线程读取请求,而另一个线程再次将它们写出来。

您不必这样做,但您可以通过在回复中添加以下标头来宣传您支持持久连接和流水线:

Connection: Keep-Alive

阅读: http ://en.wikipedia.org/wiki/HTTP_persistent_connection

顺便说一句,在实践中,持久连接并没有太大的优势。与将数据读取和写入网络套接字所花费的时间相比,管理握手的开销非常小。关于持久连接的性能优势存在一些争论。一方面,在重负载下,保持连接打开意味着在 TIME_WAIT 中系统上的套接字数量减少。另一方面,因为您将套接字保持打开 10 秒,所以在任何给定时间您将打开比非持久模式更多的套接字。

如果您对提高自写服务器的性能感兴趣 - 提高服务器网络“前端”性能的最佳方法是实现基于事件的套接字管理系统。查看 libev 和 eventlib。

于 2013-06-01T19:44:13.897 回答