HTTP持久连接

时间:2013-06-01 18:46:47

标签: c linux sockets http

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

1 个答案:

答案 0 :(得分:11)

这很简单 - 只需在写回复后关闭TCP连接。

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

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

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

您不必这样做,但您可以通过在回复中添加以下标题来宣传您支持持久连接和管道传输:

Connection: Keep-Alive

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

顺便说一句,在实践中,持久连接没有巨大的优势。与将数据读写到网络套接字所花费的时间相比,管理握手的开销非常小。关于持久连接的性能优势存在争议。一方面在重负载下,保持连接打开意味着在TIME_WAIT中系统上的插槽数量要少得多。另一方面,因为你让套接字保持打开状态10秒,所以在任何给定时间都会打开比在非持久模式下更多的套接字。

如果您对提高自编服务器的性能感兴趣 - 您可以做的最好的事情就是实现基于事件的套接字管理系统,以提高服务器网络“前端”的性能。查看libev和eventlib。