HTTP持久连接

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

Solutions Collecting From Web of "HTTP持久连接"

这很简单 – 只要在编写回复之后不要关闭TCP连接。

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

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

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

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

Connection: Keep-Alive 

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

顺便说一下,在实践中,持续连接并没有太大的优势。 管理握手的开销与读取和写入数据到网络套接字所花费的时间相比非常小。 关于持续连接的性能优势有一些争议。 一方面,在负载较重的情况下,保持连接打开意味着您的系统在TIME_WAIT上的套接字少得多。 另一方面,由于您将套接字保持打开状态的时间为10秒,因此在任何给定时间都会打开更多的套接字,而不是在非持久方式下。

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