WEB性能(4)--HTTP 1.x

一、HTTP 1.x介绍

HTTP 1.0的优化策略非常简单,就一句话:升级到HTTP 1.1!

改进HTTP的性能是HTTP 1.1工作组的重要目标,后来HTTP1.1页引入了大量增强性能的特性:

  1. 持久化连接以支持连接重用;
  2. 分块传输编码以支持流式相应;
  3. 请求管道以支持并行请求处理;
  4. 字节服务以支持基于范围的资源请求;
  5. 改进的更好的缓存机制。

在《高性能网站建设指南》中有14条规则,其中有6条是针对网络的:

  1. 减少DNS查询

    每次域名解析都需要一次网络往返,增加请求延迟,在查询期间会阻塞请求。

  2. 减少HTTP请求

    任何请求优化都不如没有请求块。

  3. 使用CDN

    从地理位置上把数据放到更接近用户的地方,可以显著减少每次TCP连接的网络延迟。

  4. 添加Expires首部并配置ETag标签

    缓存相关资源,避免重复请求每个页面中相同的数据。

  5. Gzip资源

    所有文本资源都应该使用Gzip压缩。

  6. 避免HTTP重定向

    HTTP重定向极其耗时,特别是把客户端重定向到一个完全不同的域名下,还会导致额外的DNS查询。

二、持久连接

HTTP1.1的一个主要改进就是引入了持久连接。

每个TCP连接开始都有三次握手,要经历一次客户端与服务器间完整的一次往返。此后会因为HTTP请求和响应的两次通信而至少引发另一次往返。最后还要加上服务器处理时间,才能得到每次请求的总时间。

服务器处理时间无法预测,因为这个时间因资源和后端硬件而异,不过,这里的重点其实是由一个新TCP连接发送的HTTP请求所花的总时间,最少等于两次网络往返的时间:一次用于握手,一次用于请求和响应。这是所有非持久HTTP会话都要付出的规定时间成本。服务器处理速度越快,固定延迟对每个网络请求总时间的影响就越大。

添加对HTTP持久连接的支持,就可以避免第二次TCP连接时的三次握手、消除另一次TCP慢启动的往返,节约整整一次网络延迟。

三、HTTP管道

持久HTTP可以让我们重用已有的连接来完成多次应用请求,但是多次请求必须严格满足先进先出(FIFO)的队列顺序:发送请求,等待响应完成,再发送客户端队列中的下一个请求。HTTP管道是一个很小但对上述工作流却非常重要的一次优化。管道可以让我们把FIFO队列从客户端(请求队列)迁移到服务器(响应队列)。

我们来理解一下这样做的好处。首先,服务器处理完第一次请求后,会发生一次完整的往返:先是响应回传,接着是第二次请求。在此期间服务器空闲。如果服务器能在处理完第一次请求后,立即开始处理第二次请求呢?甚至,如果服务器可以并行或在多线程上或者使用多个工作进程,同时处理两个请求呢?

通过尽早分派请求,不被每次响应阻塞,可以再次消除额外的网络往返。这样就从非持久连接状态下的每个请求两次往返,变成了请求队列只需要两次网络往返。

HTTP管道的好处,主要就是消除了发送请求和响应的等待时间。这种并行处理请求的能力对提升应用性能的帮助非常大。

可惜的是,当我们想要采取这个优化措施时,发现了HTTP1.x协议的一些局限性。HTTP1.x只能严格串行的返回响应。特别是,HTTP1.x不允许一个连接上的多个响应数据交错到达(多路复用),因而一个响应必须完全返回后,下一个响应才会开始传输。

实践中部署HTTP管道的最佳途径,就是在客户端和服务器间使用安全通道(HTTPS)。这样,就能可靠的避免那些不理解或不支持管道的中间代理的干扰。

四、使用多个TCP连接

由于HTTP1.x不支持多路复用,浏览器可以不假思索的在客户端排队所有HTTP请求,然后通过一个持久连接,一个接一个的发送这些请求。然而,这种方式在实践中太慢。实际上,浏览器开发商没有别的办法,只能允许我们并行打开多个TCP会话,一般是6个。

五、域名分区

HTTP1.x协议的一项空白强迫浏览器开发商引入并维护着连接池,每个主机最多6个TCP流。好的一方面是对这些连接的管理工作都是浏览器完成。不好的一方面是,6个并行的连接可能还是不够用。

实际上,何必把自己只限制在一个主机上呢?我们不必只通过一个主机提供所有的资源,而是可以手工将所有资源分散到多个域名。由于主机名不一样了,就可以突破浏览器的连接限制,实现更高的并行能力。

当然,天下没有免费的午餐,域名分区也不例外:每个新主机名都要求有一次额外的DNS查询,每多一个套接字都会多消耗两端的一些资源。

六、度量和控制协议开销

HTTP0.9当初就是一个简单的只有一行的ASCII请求,用于取得一个超文本文档。HTTP1.0增加了请求和响应头部,以便双方可以交换请求和响应的元信息。今天,每个浏览器发起的HTTP请求,都会携带额外500-800字节的HTTP元数据:用户代理字符串、很少改变的接收和传输首部、缓存指令等等。如果再加上Cookie进行会话管理,综合到一起,所有这些未经压缩的HTTP元数据通常会给每个HTTP请求增加几千字节的协议开销。

七、连接与拼合

最快的请求就是不用请求。不管使用什么协议,也不管是什么类型的应用,减少请求次数总是最好的性能优化手段。可是,如果如果无法减少请求数量,那么对HTTP1.x而言,可以考虑把多个资源捆绑到一起,通过一次网络请求获取:

连接:把多个JavaScript或CSS文件组合成一个文件。

拼合:把多张图片组合成一个图片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值