前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WEB性能--HTTP 1.x

WEB性能--HTTP 1.x

作者头像
从入门到进错门
发布2019-09-23 15:46:22
4600
发布2019-09-23 15:46:22
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/caomage/article/details/100941894

一、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文件组合成一个文件。 拼合:把多张图片组合成一个图片。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、HTTP 1.x介绍
  • 二、持久连接
  • 三、HTTP管道
  • 四、使用多个TCP连接
  • 五、域名分区
  • 六、度量和控制协议开销
  • 七、连接与拼合
相关产品与服务
内容分发网络 CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档