HTTP持久连接

4

尝试使用Linux套接字接口在C语言中实现简单的HTTP服务器时,我遇到了一些困难,即希望它具有持久连接的某些特性。使用单独的TCP连接发送一个文件并不是很高效的解决方案(考虑到多次握手等),但在同一TCP连接中处理多个请求(如HTML、CSS和图像)应该是可行的。您能给我一些提示如何解决这个问题吗?


2
你是否考虑过使用或者至少研究一下C语言中的一些HTTP服务器自由库,例如D.Moreno的libonion?实现一个完整的HTTP服务器栈需要大量的工作。 - Basile Starynkevitch
1个回答

10

很容易实现——只需在回复后不关闭TCP连接即可。

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

在非流水线式的实现中,您在套接字上读取一个HTTP请求,处理它,将其写回套接字,然后尝试读取另一个请求。重复此操作,直到远程方关闭套接字,或者在约10秒内停止从套接字上收到请求后自行关闭。

在流水线式的实现中,读取套接字上存在的所有请求,在并行处理完所有请求后,按照接收到的相同顺序将它们全部写回套接字。您可以有一个线程一直在读取请求,另一个线程则在写出请求。

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

Connection: Keep-Alive

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

顺便说一下,实际上持久连接并没有太大的优势。与读写网络套接字的时间相比,管理握手的开销非常小。对于持久连接的性能优势存在争议。一方面,在重负载下保持连接意味着在TIME_WAIT上有更少的套接字。另一方面,由于您需要保持套接字打开10秒钟,因此在任何给定时间您将比非持久模式下打开更多的套接字。

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


使用持久连接的另一个巨大优势(根据我从书籍中所读)是跳过“慢启动”阶段,更充分地利用带宽。 - user2558887

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接