成都web前端培训
成都达内金融街中心

18328393564

热门课程

HTTP推送的重要性

  • 时间:2018-05-10 10:25
  • 发布:达内杨老师
  • 来源:达内

HTTP推送能做哪些预加载不能做的事?
从怀疑者那里一再听到的观点是,“推送相对于预加载来说,只不过节省了一次RTT(Round Trip Time)而已”。在实践中,这并非总是对的,有一个使用案例,推送可以完成,但预加载无法做到。
利用服务器思考时间think-time
如今,HTML响应很少只是单纯的静态资源了。它们通常都是通过数据库获取所需的信息、使用高级语言(可能略微慢一些)动态生成的。虽然后端响应时间确实可以而且应当优化,但几百毫秒的响应时间也并不常见。
成都web开发培训:有一个常见的建议,“提早flush”HTML,在查询数据库并构建动态内容的同时,发送HTML的首个chunk块。但是,并非所有服务端的构架都能这么简单地实现。
另外一个让问题变得困难的因素是,需要开始向浏览器发送数据时,我们尚无法确定响应的构建是否会完全成功。为避免出现响应创建逻辑出错(比如说,数据库错误或者服务端代码运行失败),我们需要在应用逻辑中创建一种“回滚”已发送响应数据的方式,并向用户展示错误信息。
成都web前端培训:尽管这肯定有可能做得到(甚至是自动化的),但目前还没有一种通用的方式能够作为协议的一部分。
因此一般场景是,Web服务器等待后端数百毫秒以构建页面,而后开始返回数据。这时候我们就碰到了慢启动(注:slow start),所以首次RTT只能发送大约14 KB数据,第二次28 KB左右,如此等等。由此我们知道,将HTML发送出去,需要用去服务器思考时间加上慢启动时间。在思考时间期间,浏览器对接下来所需的资源一无所知,故也不会针对接下来所需资源的关键路径发送任何请求。
而且,即使我们试着耍小聪明,针对那些资源添加preload报头,若我们不提早flush文档开头,那还是没有对思考时间加以利用。
现在,成都web前端培训将这个与使用HTTP推送能做的事情做个对比。服务器可以利用思考时间来推送相关的关键性资源 —— 尤其是CSS和JS。这样一来,当思考时间结束时,我们极有可能已将所有关键性资源都推送给浏览器了。
还有额外好处,这些资源也预热了TCP连接,也提升了拥塞窗口congestion window,确保思考时间之后的首个RTT中,可以使用28 KB,56 KB,乃至更大的拥塞窗口发送HTML(这取决于思考时间的长短,以及在此期间我们推送了多少资源)。
一起来看下具体案例:一个120 KB的HTML页面,关键CSS有24KB,关键JS有74 KB,在100ms RTT、无限带宽的网络环境下是如何加载的?
没有HTTP推送的情况下,生成HTML等待了300ms,接着4次RTT发送HTML,因为慢启动的缘故,使用了一个RTT请求JS和CSS。在首次渲染之前,时间超过了800毫秒。
使用HTTP推送,CSS和JS会在HTML请求到达之后尽快推送出去,发送它们需要3个RTT(又一次因为慢启动),它们将拥塞窗口增大至128 KB左右,将要发送HTML时,一个RTT就能可以了。首次渲染总时间:400毫秒。首次渲染加速了50%!也不算很差嘛。
上一篇:前端代码响应回路解析
下一篇:浏览器缓存机制原理浅析
选择城市和中心
贵州省

广西省

海南省