一分钟了解 Keep-Alive

默认的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的连接来说,提高性能更是需要做的事情。

原文发布于微信公众号 - ImportSource(importsource)

原文发表时间:2018-02-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python自动化测试

python接口测试之401错误的分析和解决(十七)

通过一个案例来分析在HTTP的请求中403错误的解决以及HTTP的状态码中403怎么理解,见发送一个请求后,返回的状态码,见如下的信息:

1706
来自专栏静默虚空的博客

剖析 HTTP 协议

HTTP 概述 HTTP 是什么? HTTP(HyperText Transfer Protocol,超文本传输协议)是WWW (World Wide Web)...

2127
来自专栏V站

HTTP协议经典详解

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目...

2044
来自专栏Java学习123

HTTP协议详解

5657
来自专栏landv

js循环POST提交添加辅助单位

1152
来自专栏技术博文

http状态码一览表

http状态码一览表 1**:请求收到,继续处理 2**:操作成功收到,分析、接受 3**:完成此请求必须进一步处理 4**:请求包含一个错误语法或不能完成 5...

3667
来自专栏python学习指南

python爬虫(七)_urllib2:urlerror和httperror

urllib2的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个respo...

2338
来自专栏Linyb极客之路

网络编程之HTTP状态码详解

1074
来自专栏应兆康的专栏

如何在腾讯云上安装 MapD 的 GPU 可视化数据库

MapD Technologies将MapD Core数据库进行开源啦。MapD是使用图形处理单元(GPU)以毫秒为单位分析数十亿行数据的先驱,比传统的基于CP...

2.1K5
来自专栏王金龙的专栏

HTTP状态码及其含义

        开发Web项目的时候,因为环境搭建和配置的原因,经常会出现部署失败的情况;搭建这个博客的时候,也因为php-admin缺少某些库的原因,导致出现...

3322

扫码关注云+社区

领取腾讯云代金券