默认的HTTP连接(connection)通常都会在每次request完成后就关闭掉,这也就意味着server端会在发送了一个response之后就把TCP 连接(connection)close掉。为了能够让connection在多次请求中保持open,就引入了keep-alive connection,也就是长连接,也可以叫persistent connection(持续连接)。ps:以下统称长连接。
只要server端愿意配合,所有现代浏览器都可以使用长连接。你也可以直接使用HTTP/1.1,它的Keep-Alive实现有点不同,就是connection是默认是一直保持open的状态,除非response中包含“Connection: close”的header。
没有Keep-Alive的情况下HTTP是如何工作的
客户端去创建一个新的connection来交互并且接收到来自server的一个文件。客户端使用一个新的connection来发起一次请求(request),在接收到文件后就会终止。浏览器解析response,然后检查是否还有其他的必须的文件来辅助显示整个网页(比如js、css、图片等等)。经过分析后,它会对每个这些文件分别创建新的连接去发起请求来获取,但这种机制是非常低效的,特别是对于那种有大量元素(element)的网页。
使用Keep-Alive之后
使用了Keep-Alive之后,客户端会重用现存的connection,而不是每次都去重新创建一个新的connection。
使用Keep-Alive的好处
更低的CPU和内存使用(因为在同一时间打开的连接更少了)。
可以让HTTP对request和response实现pipeline。
减少了网络堵塞(TCP连接更少了)。
request的延迟降低了(第一次握手之后就不需要握手了)。
在不需要关闭TCP连接的情况下就可以告知errors。
这些优势对于安全的HTTPS连接更为重要,因为建立安全连接需要更多的CPU时间和网络往返(round-trips)。
影响Keep-Alive功能的几个属性
这里仅列举Apache的配置:
KeepAlive
使用 “KeepAlive On” 来开启。
如果要关闭,就使用 “KeepAlive Off”。
MaxKeepAliveRequests
这个属性负责设置每个Keep-Alive连接所允许的最大请求数。
一般设置100对于大多数场景就够了。但是,具体还得取决于一个网页所依赖的file有多少,随着file的增加而调整此值。
KeepAliveTimeout
这个属性就是为了避免一个闲置的连接空闲太长时间。具体就是你的server需要等待下一个新的客户端request多长时间。如果等了指定时长还是没有新的request那么就关闭了。
一旦在规定的时间内客户端发过来新的请求,那么这个timeout又开始重新计算。
总之
总之,我们可以看到HTTP Keep-Alive在我们的应用程序性能提升方面起到了关键的作用。我们应该把它利用起来而不是使用默认的设置。并尝试根据自己的一个网页所涉及的请求次数来调整,特别是对于https的连接来说,提高性能更是需要做的事情。
领取专属 10元无门槛券
私享最新 技术干货