【交代:时间是在距今的5年后,由于我的智能滑板鞋,还有智能小内内的创业失败,为了在这个先看胸再看脸的时代活下去,我不得不重操旧业,去面试web前端工程师的工作。多年没有接触web开发了,找了个AlloyTeam的老同事晨伯帮我温习一下知识,好让面试通过】
“我给你一个表情,你自己体会一下
”
“你先写个小页面给我看看吧,我指导一下你吧。”晨伯一幅很吊的样子。
但是这样的小case当然难不了我,虽然多年没碰web,但是我当年可以是AlloyTeam的成员啊。很快我就啪啪啪地完成了页面。晨伯看完我写的页面,一幅“我可是有女朋友的男人”的表情,感叹了一句“现在是HTTP2.0的时代啦,给你普及一下知识点”。
HTTP2.0性能增强的核心:二进制分帧
HTTP 2.0最大的特点: 不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。
既然又要保证HTTP的各种动词,方法,首部都不受影响,那就需要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。
在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
然后,HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
当他侃侃而谈的时候,大概是这个样子的,你们也来感受一下。
“听起来好屌的样子,但是那样,所有的二进制帧都会带上Headers帧,这是多大的数据冗余传送啊,性能会多….”我疑问道。
“还没讲完呢,插什么嘴!”(哎呀我差!我这么帅,可别打脸啊。)
HTTP2.0 首部压缩
HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;通信期间几乎不会改变的通用键-值对 (用户代理、可接受的媒体类型,等等)只 需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。
如果首部发生变化了,那么只需要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP 2.0 的连接存续期内始终存在,由客户端和服务器共同渐进地更新 。
“好了,现在你倒是给我解释一下,这里使用自动化合并文件和Sprite合图是什么回事?”晨伯不解
“本质上,当然是为了减少请求啦,通过多个js或css合并成一个文件,多张小图片拼合成Sprite图,可以让多个HTTP请求减少为一个,减少额外的协议开销,而提升性能。”如是道也
“当然,一个HTTP的请求的body太大也是不合理的,有个度。文件的合并也会牺牲模块化和缓存粒度,可以把“稳定”的代码or 小图 合并为一个文件or一张Sprite,让其充分地缓存起来,从而区分开迭代快的文件” 我不明白晨伯的问题,就稍微补充了一下方案。
所有的HTTP2.0的请求都在一个TCP链接上
HTTP2.0所有通信都是在一个TCP连接上完成。HTTP 2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应 着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。就好比,我请求一个页面http://www.qq.com。页面上所有的资源请求都是客户端与服务器上的一条TCP上请求和响应 的!
有关注TCP性能的同学就会知道,HTTP性能的关键在于低延迟而不是高带宽! 大多数HTTP 连接的时间都很短,而且是突发性的,但TCP 只在长时间连接传输大块数据时效率才最高。HTTP 2.0 通过让所有数据流共用同一个连接,可以更有效地使用TCP 连接,让高带宽也能真正的服务于HTTP的性能提升。
同时,单链接多资源的方式,使到至上而下的层面都得到了好处:
1.可以减少服务链接压力,内存占用少了,连接吞吐量大了
2.由于 TCP 连接减少而使网络拥塞状况得以改观;
3.慢启动时间减少,拥塞和丢包恢复速度更快。
也就是说,“资源合并减少请求”的优化手段对于HTTP2.0来说是没有效果的,只会增大无用的工作量而已。
他说得好有道理,我竟然掩脸而对(因为脸被打疼了)。
“你在再我说说,这些cdn1.cn,cdn2.cn,cdn3.cn是什么回事啊”晨伯又问到。
“因为HTTP1.x上如果一个只用一个持久链接,请求只能一个一个顺序请求,为了高效地并行下载资源,浏览器允许我们打开多个TCP会话,但是一个域名下限制6个链接。为了突破这些限制,我们可以域名分区,提高并行下载资源能力…..”我只好把我当年知道的说出来
并行双向字节流的请求和响应
在HTTP2.0上,客户端和服务器可以把HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。注意,同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送stream,也可以一边接收者服务器的响应,而服务器那端同理。
把 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装是 HTTP 2.0 最 重要的一项增强。事实上,这个机制会在整个 Web 技术栈中引发一系列连锁反应, 从而带来巨大的性能提升,因为:
可以并行交错地发送请求,请求之间互不影响;
可以并行交错地发送响应,响应之间互不干扰;
只使用一个连接即可并行发送多个请求和响应;
消除不必要的延迟,从而减少页面加载的时间;
那么也就是说“域名分区”这种优化手段对于HTTP2.0是无用的,因为资源都是并行交错发送,且没有限制,不需要额外的多域名并行下载。
“既然所有资源都是并行交错发送,会不会出现这样的情况【浏览器明明在等关键的 CSS 和JS,你TMD的服务器还在发送图片】” 我疑问道。结果还是
HTTP2.0的请求优先级
每个HTTP2.0流里面有个优先值,这个优先值确定着客户端和服务器处理不同的流采取不同的优先级策略,高优先级的流都应该优先发送,但又不会绝 对的。绝对地准守,可能又会引入首队阻塞的问题:高优先级的请求慢导致阻塞其他资源交付。分配处理资源和客户端与服务器间的带宽,不同优先级的混合也是必 须的。
“有了优先级,HTTP2.0根本不会发生【浏览器明明在等关键的 CSS 和JS,你TMD的服务器还在发送黄图】”晨伯道。
“我根本没有说是服务器在发黄图,好不好。”我吐槽了一下。
“还有还有,你这里的一段base64内嵌图片又是什么回事?是黄图吗?” 晨伯又挑战我了。
内嵌图片这种,有使用条件的优化手段,我还是不要说话好,不然的话按照这个故事的尿性,他应该又要飞拳我。
HTTP2.0的服务器推送
HTTP 2.0 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,服务器可以强 奸你的浏览器,哦不,应该是,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。
当浏览器请求一个html,服务器其实大概知道你是接下来要请求资源了,而不需要等待浏览器得到html后解析页面再发送资源请求。我们常用的内嵌图片也可以理解为一种强制的服务器推送:我请求html,却内嵌了张黄图。
有了HTTP2.0的服务器推送,HTTP1.x时代的内嵌资源的优化手段也变得没有意义了。而且使用服务器推送的资源的方式更加高效,因为客户端还可以缓存起来,甚至可以由不同的页面共享(依旧遵循同源策略)。当然,你是个正直的浏览器,是可以决绝服务器推送的黄图的。
不知道为什么,说到黄图这个家伙就兴奋起来了,再也没有打我了。然后交谈就变成了16+周岁的少女不宜收听的内容了。不过HTTP2.0的知识收获了不少。
到了我要面试的日子了,互联网公司A果真要(笔试|鄙视)一下我。我写出了下面的页面
在场面试官,纷纷鼓掌站了起来,“如此高效的页面,难得啊~你被录取了!”。
这看着这份如同我前端实习时候写的页面,我心中默默感叹“十年前端,终归如初”。
出于礼貌,我想起了晨伯教我的新式前端工程师肢体礼仪,然后…..
这是 Akamai 公司建立的一个官方的演示,用以说明 HTTP/2 相比于之前的 HTTP/1.1 在性能上的大幅度提升。 同时请求 379 张图片,从Load time 的对比可以看出 HTTP/2 在速度上的优势。
http 1.0
https://http1.akamai.com/demo/h2_demo_frame.html
http 2.0
https://http2.akamai.com/demo/h2_demo_frame.html
http 1.0 and http 2.0 demo
https://http2.akamai.com/demo
相关推荐
在ASP.NET中,FlyTreeView控件是一个增强型的树视图组件,它相比内置的TreeView控件有诸多优势。FlyTreeView提供了更流畅的用户体验,如快速加载、动态展开和折叠节点、以及优化的性能。这些特性使得它在处理大量...
- **HTTPS支持**:HTTP2.0通过TLS进行加密传输,增强安全性。 - **TLS协商**:通过TLS进行安全握手,确定是否使用HTTP2.0。 - **HTTP/2明文模式**:虽然推荐使用TLS,但也支持明文模式。 #### HTTP2.0协议特性 - *...
根据提供的文档信息,本文将对"Mule 2.0用户指南"进行深入解析,并提炼出与标题、描述及...对于已经熟悉Mule 1.x版本的用户来说,迁移到Mule 2.0相对简单,但仍然需要仔细阅读官方文档以充分利用新版本带来的所有优势。
2. **带宽增强**:相较于CXL 1.0,CXL 2.0在传输速率上有显著提升,提供了2倍于1.0版本的数据传输速度,使得数据交换更为迅速,对于大数据处理和AI计算来说至关重要。 3. **缓存一致性**:CXL 2.0引入了跨设备的...
1. **增强的调试工具**:TBC2.0可能会包含更强大的调试功能,使程序员能够在代码编写阶段就进行初步的错误检查,避免了编译后才发现问题的困扰。 2. **更好的内存管理**:C语言的一个常见挑战是内存管理,TBC2.0...
2. **语义化增强**:XHTML2.0增强了文档的语义性,使文档不仅具有更好的可读性,同时也便于机器理解。 3. **跨平台兼容性**:XHTML2.0被设计成能够在不同的平台上实现一致的表现,这对于移动设备和不同浏览器环境尤...
MXLogic作为电子邮件和Web 2.0威胁防护领域的领导者,提供了一系列按需服务的防御方案,有效降低了企业在网络交易中的风险,使企业能够充分利用Web 2.0技术带来的效率提升和协作增强。MXLogic的解决方案不仅关注于...
此外,文档可能还会对比USB 2.0与其他版本(如USB 1.1和USB 3.0)的区别,说明USB 2.0在实际应用中的优势和局限性,并介绍一些常见问题的解决方案。对于想要深入理解USB技术,尤其是USB 2.0的读者来说,这份文档将是...
当我们需要构建复杂的企业级应用时,将两者整合能充分发挥它们的优势,提高开发效率和代码质量。 **Spring 2.0** 是Spring框架的一个重要版本,引入了许多新特性,如支持JSR-250规范、改进的AOP支持、数据源管理...
4. **多态性支持**:JPA 2.0增强了对继承和多态性的处理,允许子类共享相同的数据库表结构。 5. **复合主键**:支持复合主键,可以由多个属性组成,方便处理复杂的主键结构。 6. **延迟加载(Lazy Loading)**:...
在详细探讨HTTP 2.0之前,有必要先了解一下HTTP的早期版本,特别是HTTP 1.0和HTTP 1.1,以及它们存在的问题和限制。HTTP 2.0的出现解决了这些问题,并且提供了新的特性和优势,以更好地满足现代网络需求。 首先,...
本文详细介绍了一种基于USB2.0协议的高分辨率数字摄像头的设计方案,该方案使用了CMOS图像传感器OV9620和USB控制器CY7C68013,旨在为用户提供一种高效、低成本的图像采集解决方案。 #### 二、USB2.0协议概览 USB...
6. **协议与编码**:USB 2.0采用增强全双工(High-Speed Full-Duplex)模式,使用8b/10b编码方案,有效提高了数据传输的效率和准确性。 USB 2.0在鼠标设计中的应用则体现在以下几个方面: 1. **连接性**:USB 2.0...
尽管现代编程语言和环境层出不穷,Turbo C 2.0凭借其历史地位和工具优势,依然在教学和学习中占据一席之地。 Turbo C 2.0的主要功能包括代码编辑、编译、调试等,这些功能对于学习C语言是至关重要的。其集成的代码...
【VE修改器2.0】是一款强大的游戏辅助工具,主要用于修改游戏中的各种参数,以提升玩家的游戏体验。这款软件能够帮助用户对游戏的数据进行个性化调整,例如修改角色属性、资源数量、技能效果等,使玩家在游戏过程中...
2. **AOP(Aspect-Oriented Programming,面向切面编程)增强**:Spring 2.0增强了对AOP的支持,允许开发者定义和实现切面,从而更好地分离关注点,比如事务管理、日志记录等,可以独立于业务逻辑进行处理。...
在OAuth 2.0 中,有几个关键的角色和概念: 1. **第三方** - 想要访问受保护资源的应用程序。 2. **应用/程序** - 第三方的软件实体。 3. **私有证书** - 用户的登录凭据,如用户名和密码。 4. **身份验证** - 验证...
4. **数据访问集成**:Spring 2.0增强了对各种数据访问技术的支持,包括JDBC、Hibernate、iBatis等ORM框架。它引入了`org.springframework.jdbc.core.JdbcTemplate`,提供了一种简化JDBC操作的模板类,减少了数据库...
Struts 2.0是Java Web开发中的一个关键框架,它是Apache软件基金会的顶级项目,融合了原本独立的Struts 1.x和WebWork框架的优势,为开发者提供了一个强大、灵活且可扩展的MVC(Model-View-Controller)架构。...
### Kinect2.0 API概述与关键技术点 #### 标题:Kinect2.0 API PPT 本PPT文档旨在为新手提供一个...对于初学者来说,了解这些关键技术和差异点是非常重要的,这有助于他们在实际项目中更好地利用Kinect2.0的优势。