KeepAlive

一、介绍

HTTP 1.0 中keep-alive默认是关闭的,需要在HTTP头加入"Connection: Keep-Alive",才能启用Keep-Alive;**HTTP 1.1中默认启用Keep-Alive**,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用HTTP 1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

二、缺点

长时间的TCP连接容易导致系统资源无效占用。
httpd守护进程一般都提供了keep-alive timeout时间设置参数,比如Nginx的keepalive_timeout和Apache的keepalivetimeout。这个 keepalive_timeout时间值意味着,一个http产生的TCP连接在传送完最后一个响应后,还需要保持keepalive_timeout 时间后才开始关闭这个连接;如果在这个时间内client端还有请求发过来,那么server端会继续给予响应,如果keepalive_timeout时间计时结束后,就会进入TCP释放结束掉这次的通信。
最终为了维持这样的状态,服务器会开启一个http进程来维持该连接。

三、应用场景

keep-alive适用情况:
比如很多网页中的图片,CSS,JS,HTML都在一台服务器上,当用户访问网页时,网页中的图片,CSS,JS都会发起访问请求,打开Keep-alive属性可以有效降低TCP握手的次数(当然浏览器同一域下同时请求的图片数有限制,一般是2,这个是关于浏览器并发请求的问题我们在下一篇中讲)。
keep-alive的限制:
当然keep-alive的使用并不是没有限制的,其中有两个属性:

  • MaxKeepAliveRequest:持久连接的连接的生存时间
    • KeepAliveTimeOut:最大服务请求数。
      keep-alive不适用情况:
      上面说的是一个清形,静态网页局居多的情况下,并且网页中其他请求与网页在同一台Server上。当你的应用动态程序居多,此时开启keep-alive反而会降服务器的性能。为什么呢?
      这个主要原因就是我们上面所提到的一个概念http守护进程,每当开启Keep-alive,打开一个TCP连接,以便能够在一次连接中响应多个静态资源,但是一方面上面的情况是我们访问的静态资源少,而且为了维护此次连接,服务器必须开启一个http守护进程,再加上服务器还有动态生成html,这样给服务器的压力是很大的。
      假如:
      这个时候有100个用户访问服务器,且每个用户的MaxKeepAliveRequests=5(也就是浏览器的请求并发数是5),,此时需要的http守护进程数就是100_5=500个,一个http守护进程消耗是5MB内存的话,就是500_5=2500MB=2.5G内存的消耗过大!!!