HTTP请求特性
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内存的消耗过大!!!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Bai's Blog!