Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

合并HTTP请求优化了什么?

  我们经常在强调要尽可能的避免不必要的HTTP请求。图片加载用上了CSS spirtes,甚至把CSS、JS,等一些静态文件都合并加载了。但是HTTP请求的开销到底是什么呢?为什么要减少HTTP请求呢?这么做是为了前端的用户体验还是为了后端的资源节省呢?
  很多人只知道东西应该怎么做,但不知为什么这么做,也不会去怀疑这么做是否值得,更不会去试着寻找比现有的做法更优秀的做法。我们为什么要减少HTTP请求呢?那就得先看看HTTP会话是怎么工作的。完整的HTTP会话需要经过这么几个步骤:
步骤功能耗时
1域名解析客户端到其DNS服务器的延迟,但这个结果通常会缓存。
2TCP连接客户端到服务器的一次交互时间,实际上就是服务器的ping值。
3发送HTTP请求客户端到服务器的单向延迟加上数据在可用带宽上传输的时间。
4等待服务器响应由服务器程序决定。
5接收响应数据客户端到服务器的单向延迟加上数据在可用带宽上传输的时间。
6断开连接客户端到服务器的两次数据通信时间,但这个步骤可以忽略。
  先讨论关于请求耗时的问题。
  域名解析由于会缓存,只会在首次请求时做,所以它的耗时基本可以忽略。TCP连接虽然是三步握手,但只通信了两次,所以耗时和服务器的ping值一样。当然服务器程序也会影响到这个结果,但正常的服务器处理TCP请求的速度比网络传输速度快的多,基本可以忽略。接下来的三个步骤才是重点。发送HTTP请求和接收响应的数据这两个步骤加起来消耗了在可用带宽上传输这些数据的时间和一次交互的时间。传输的耗时由可用带宽来决定,一次交互的耗时等于一个服务器的ping值。这两个步骤之间还有个等待服务器响应的步骤,它的耗时在不同的服务器程序上差异比较大。单线程的NodeJS上,如果请求时服务器是空闲状态,那么耗时基本上就来自请求自身的业务处理。但在Apache上就要慢一些,Apache要处理线程分配等一系列操作,还有各个模块的处理,这些耗时全都是Apache买单。最后的断开操作实际上没必要算入耗时,因为接收到响应的数据后客户端就可以开始处理数据了,不会等到连接断开。
  这么一整理就可以得到一个完整的HTTP会话耗时。首先是网络延迟的耗时,这个耗时是两次服务器的ping值;然后是服务器处理HTTP请求的等待时间;以及HTTP请求数据和响应数据的通信时间。在开启keep-alive的情况下,TCP连接的耗就不用考虑。那么网络延迟的耗时就剩下用于传输的部分,也就是一个服务器ping值。而服务器处理的耗时还可以分为两部分,一部分是程序本身的业务逻辑,比如数据库查询之类的。这是硬性的,或者说,对它的优化不是通信层要考虑的,所以忽略它。另一部分是额外耗时,比如Apache对HTTP请求一些其它处理。总结这些情况,最后剩下的就是网络延迟的耗时和服务器额外处理的耗时以及数据传输的耗时。
  合并请求实际上就是把多个HTTP会话中网络延迟的耗时和服务器额外处理的耗时以及传输数据中的HTTP头部分给合并了。浏览器提供了足够的并发,所以网络延迟的耗时优化并不会起到太大作用。而合并掉服务器额外处理确实是很可观的一笔,特别是在服务器繁忙时非常有效。由于单次传输的数据量变大了,在开启GZIP时,压缩率可能也会得到提升。这个数据压缩率和HTTP头的合并属于流量和带宽方面的优化。它们程度取决于数据的类型和HTTP头占数据的比重。以上这些就是合并HTTP请求对前端的优化作用。
  对于服务器开销的方面而言,情况就不同了。
  并不是所有内容都可以合并。对于一些商品或文章图片之类的内容图片,它们是零散的,合并它们反而会造成缓存上实现的困难。在网页需要加载的资源数量超过浏览器对域名的并发限制时,总的连接数就不会因为使用了CSS spirtes或合并了JS、CSS文件而减少。就一般的网页而言,加载资源的数量超出浏览器对域名的并发限制是非常普遍的。所以,合并文件对连接数的优化效果并不大。合并服务器的额外处理实际上也没有多大优化效果,比起数据库查询和业务处理的开销,这些额外开销对服务器而言就是九牛一毛。越是优秀的HTTP服务器,优化效果就越不明显。对于服务器而言,合并HTTP请求带来的最大优化就是合并掉了不必要的HTTP头和提高了GZIP压缩率所带来的流量和带宽方面的优化。
  总之,合并一些静态资源确实是一种有效的优化方式,但本文只介绍了他们的优化方面和优化效果。实际使用时不能光考虑这些,合并资源也是有其它代价的。什么东西需要合并,什么东西不要,这些得从更多的方面考虑。
网名:
54.162.218.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^