持久连接(Keep Alive)又称长连接,指TCP连接中持续发送多份数据而不断开的连接。与之对应的称为短连接,就是连接后发送一次数据便断开的连接。



建立一个TCP连接需要进行三次握手(Three Way Hand Shake),TCP三次握手需要交换三个分组的数据,而交换数据需要消耗一定的时间。在允许的情况下,重新建立连接的次数越少,越有利于性能的提升。



由于HTTP具有无状态特性,因此不依赖于TCP的长连接。通常一次TCP连接只处理一个HTTP请求,请求处理完毕后马上关闭此次连接。所以,如果HTTP支持长连接,好处是显而易见的,特别对于密集型图片或者网页等小数据请求处理有明显的加速作用。HTTP 1.1 对长连接有完整的定义,同时,很多浏览器和Web服务器也纷纷提供对长连接的支持。



HTTP长连接的实施需要浏览器和Web服务器共同协助完成。一方面,浏览器需要保持一个TCP连接不能释放,并且不断地发送多个请求。另一方面,服务器不能过早地主动关闭连接。目前的浏览器普遍支持长连接,只需要在发出的HTTP请求头中包含相关的长连接声明即可,如下所示:


Connection: Keep-Alive



这个声明告诉服务器:如果可以,请让我重用这个连接。告诉服务器不要在处理完当前请求后马上关闭连接。



同时,Web服务器必须打开长连接的支持。对于Apache,长连接的配置项在 httpd-default.conf 中,开启长连接,如下:


KeepAlive On



每个长连接都需要设置一个超时时间,这个设置同时出现在Web浏览器和服务器上,所有双方都可以主动关闭长连接。Firefox默认超时时间为115秒,可通过注册表或浏览器配置修改超时间。比如,在Firefox浏览器地址栏输入:


about:config


network.http.keep-alive.timeout 参数即可。




对于Web服务器(如Apache),通常提供超时时间的配置参数,如:


KeepAliveTimeout 20



设置Apache的超时时间为20秒,默认情况下为5秒。



注意:TCP连接是双向的,任何一方都可以主动关闭连接。所以,当浏览器与Web服务器设置的超时时间不一致时,以最短的超时时间为准。



在请求大量小文件时,长连接能够有效地减少重新建立连接的开销。在启动ab压力测试工具时,加上 k 参数可以使用 KeepAlive(长连接)模式进行测试。



先不使用长连接请求一个url地址,如:


cd E:\xampp\apache\bin


ab -n10000 -c10 demo.com/image.png



这里只列出吞吐率的输出结果:


Requests per second:    2836.39 [#/sec] (mean)

可以看出,在不使用KeepAlive时,吞吐率为 

2836.39reqs/s。


现在,我们使用KeepAlive模式进行测试,如:


ab -n10000 -c10 -k demo.com/image.png




这里列出部分输出结果:


Keep-Alive requests:    9906



Total transferred:      50355871 bytes



HTML transferred:       47250000 bytes



Requests per second:    4856.25 [#/sec] (mean)


4856.25reqs/s。与之前相比,有了大幅度的提升。在此测试中,使用长连接的请求数为 9906 个,也就是说有 9906 个请求重用了TCP长连接。




注意:长连接不一定都是正效应,也可能会影响服务器的并发性能。