1 前言
今天一起来研究Http协议的一些事情,通过本文你将了解到以下内容:
乘风破浪前往知识的海洋吧, 大白船长 要开船了!
2. Http协议各版本的对比
Http超文本传输协议同空气一般, 感触不到它的存在但是又无处不在 ,笔者从维基百科摘录了一些Http协议的发展历程的简单信息,一起来看下吧:
超文本传输协议是 分布式协作超媒体信息系统的应用协议 。超文本传输协议是万维网数据通信的基础,在万维网中超文本文档包括到用户可以轻松访问的其他资源的超链接。
蒂姆·伯纳斯·李于1989年在欧洲核子研究中心发起了超文本传输协议的开发。早期的超文本传输协议征求意见(RFCs)的开发是由互联网工程任务组(IETF)和万维网联盟(W3C)共同努力的结果,其工作后来转移到IETF。
万维网之父蒂姆·伯纳斯·李简介
Tim Berners-Lee是英国工程师和计算机科学家,最著名的是万维网的发明者。他是 牛津大学计算机科学教授和麻省理工学院教授 。
他于1989年3月12日提出了一种信息管理系统,然后在同年11月中旬通过Internet实现了超文本传输协议HTTP客户端和服务器之间的 首次成功通信 。
他是万维网联盟W3C的负责人,该联盟负责监督Web的持续发展,他还是 万维网基金会的创始人 ,还是麻省理工学院计算机科学和人工智能实验室CSAIL的3Com创始人主席和高级研究员,他也是网络科学研究计划WSRI的主任和MIT集体智慧中心的顾问委员会成员,他也是开放数据研究所的 创始人兼总裁 ,目前是社交网络MeWe的顾问。
2004年,伯纳斯·李因其开创性工作而被女王伊丽莎白二世 封为爵士 。在2009年4月,他当选为 美国国家科学院外籍研究员 ,位列《时代》杂志的 20世纪100位最重要人物 名单被誉为“万维网发明者”获得了2016年 图灵奖 。
http各个版本的基本情况
http协议经过20多年的演进出现过 0.9、1.0、1.1、2.0、3.0 五个主要版本,笔者画了张图看下:
A.Http0.9版本
0.9是鼻祖版本,它的主要特点包括:
B.Http1.0版本
1.0版本主要是对0.9版本的强化,效果也比较明显,主要特性和缺点包括:
C.Http1.1版本
1.1版本在1.0版本发布后大约1年就推出了,是 对1.0版本的优化和完善 ,1.1版本的主要特点包括:
D.Http2.0版本
2.0版本是个里程碑式的版本,相比1.x版本有了非常多的优化去适应当前的网络场景,其中几个重要功能点包括:
3 Http2.0 详解
前面对比了几个版本的演进和优化过程,接下来深入研究下2.0版本的一些特性及其基本实现原理。
从对比来看2.0版本并不是在1.1版本上的一些 优化而是革新 ,因为2.0背负了更多的 性能目标任务 ,1.1虽然增加了长连接和管道化,但是从根本上并没有实现真正的高性能。
2.0的设计目标是在 兼容1.x语义和操作 的基础上,给用户带来 更快捷、更简单、更安全 的体验高效地利用当前的网络带宽,为此2.0做了很多调整主要包括: 二进制化分帧、多路复用、头部压缩 等。
akamai做了http2.0和http1.1在加载过程中的对比效果( 实验中加载379个小片段 在笔者的电脑上的加载时间是0.99s VS 5.80s ):
https://http2.akamai.com/demo
3.1 SPDY协议
要说2.0版本标准和新特性就必须提谷歌的 SPDY协议 ,看一下百度百科:
SPDY是Google开发的基于TCP的会话层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。
新协议的功能包括 数据流的多路复用、请求优先级以及HTTP报头压缩 。谷歌表示引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。
随后SPDY协议得到 Chrome、Firefox 等大型浏览器的支持,在一些大型网站和小型网站种部署,这个高效的协议引起了 HTTP工作组 的注意,在 此基础上制定了官方Http2.0标准 。
之后几年SPDY和Http2.0继续演进相互促进,Http2.0让服务器、浏览器和网站开发者在新协议中获得更好的体验,很快被大众所认可。
3.2 二进制分帧层
二进制分帧层 binary framing layer 在不修改请求方法和语义的基础上,重新设计了 编码机制 ,如图为http2.0分层结构( 图片来自参考4 ):
二进制编码机制使得通信可以在 单个TCP连接 上进行,该连接在整个对话期间一直处于活跃状态。
二进制协议将通信 数据分解为更小的帧 ,数据帧充斥在C/S之间的双向数据流中,就像双向多车道的高速路,来往如织川流不息:
要理解二进制分帧层需要知道四个概念:
四者是 一对多的 包含 关系,笔者画了一张图:
再来看一下HeadersFrame头部帧的结构:
再来看一下HeadersFrame头部帧的结构:从各个域可以看到长度、类型、标志位、 流标识符、 数据净荷等,感兴趣可以阅读rfc7540相关文档。
- https://httpwg.org/specs/rfc7540.html
总之 2.0版本将通信数据分解为二进制编码帧进行交换,每个帧对应着特定数据流中的特定消息,所有帧和流都在一个TCP连接内复用,二进制分帧协议是2.0其他功能和性能优化的重要基础。
3.3 多路复用
1.1版本中存在 队首阻塞问题 ,因此如果客户端要发起多个并行请求来提升性能,必须使用 多个TCP连接 ,这样就要承受 更大延时和建链拆链成本 ,不能有效利用TCP链接。
由于2.0版本中使用新的二进制分帧协议突破了1.0的诸多限制,从根本上实现了真正的 请求和响应多路复用 。
客户端和服务器将交互数据分解为 相互独立的帧 ,互不影响地 交错传输 ,最后再在对端根据 帧头中的流标识符 把它们 重新组装 起来,从而实现了TCP链接的多路复用。
如图展示了2.0版本的基于帧的消息通信过程 ( 图片来自参考4 ) :
3.4 首部压缩
A.Header冗余传输
我们都知道http请求都有header部分,每个包都有并且相对于一条链接而言 大部分的包的header部分都是相同 的,这样的话每次传输相同的部分确实 非常浪费 。
现代网络中每个网页平均包含100多个http请求,每个请求头平均有300-500字节,总数据量达到几十KB以上,这样可能造成数据延时,尤其复杂 的WiFi环境或者蜂窝网络 ,这样只能看到手机在转圈,但是这些请求头之间通常几乎没有变化,在本已经拥挤的链路中多次传输相同的数据部分确实不是高效做法。
基于TCP设计的 拥塞控制 具有 线增积减AIMD特性 ,如果发生丢包那么传输速率将大幅度下降,这样在拥挤的网络环境中大的包头意味着只能 加剧拥塞控制造成的低速率传输 。
B.Http压缩和犯罪攻击
在2.0版本的HPACK算法之前,http压缩使用gzip去压缩,后来提出的SPDY算法对Headers进行特殊设计,但是它依旧使用的是 DEFLATE算法 。
在后面的一些实际应用中发现 DEFLATE和SPDY都有被攻击的危险 ,因为DEFLATE算法使用后向 字符串匹配和动态Huffman编码 ,攻击者可以控制部分请求头部通过修改请求部分然后看压缩之后大小改变多少,如果变小了攻击者就知道注入的文本和请求中的某些内容有重复。
这个过程有点像 俄罗斯方块的消除过程 ,这样经过一段时间的尝试数据内容就可能被全部搞清楚,由于这种风险的存在才研发出更安全的压缩算法。
C.HPACK算法
2.0版本中HPACK算法在C/S中使用 首部表 来存储之前发送的键值对,对于相同的数据通信期间几乎不会改变的通用键值对只需发送一次即可。
极端情况如果请求头每次没有变化,那么传输中则不包含首部,也就是首部开销就是 零字节。如果首部键值对发生变化了,也只需要发送变化的数据,并且将 新增或修改的首部帧会被追加到首部表 ,首部表在链接存活期始终存在, 并且由客户端和服务器 共同更新和维护 。
简单说就是客户端和服务端共同维护了一个 key-value 的结构,发生变化时则更新传输,否则就不传输,这样相当于 首次全量传输之后增量更新传输 即可,这个思想在日常开发中也非常普遍,不用想的太复杂。
如图展示了首部表的更新过程 ( 图片来自参考4 ) :
hpack算法的相关文档:
- https://tools.ietf.org/html/draft-ietf-httpbis-header-compression-12
3.5 服务端推送
服务端推送是2.0版本新增的一个强大功能,和一般的 一问一答 式的C/S交互不同, 推送式交互中服务器可以对客户端的一个请求发送多个响应 ,除了对最初请求的响应外还向客户端推送额外资源,无需客户端明确地请求也可以推送。
举个栗子:
想象一下你去餐厅吃饭,服务好的快餐厅在你点好一份牛肉面之后,还会给你送上餐巾纸、筷子、勺子甚至调料等,这样主动式的服务,节约了客人的时间并且提高了用餐体验。
在实际的C/S交互中这种 主动推送额外资源 的方法很有效,因为几乎每个网络应用都会包含多种资源,客户端需要全部逐个获取它们,此时如果让服务器提前推送这些资源,从而可以 有效减少额外的延迟时 间 ,因为服务器可以知道客户端下一步要请求什么资源。
如图为服务端推送的简单过程 ( 图片来自参考4 ) :
4. 总结
本文通过介绍Http协议的历史演进、各个版本的主要特征和优缺点、重点介绍了Http2.0协议的一些特性,包括: SPDY协议、二进制分帧协议、多路复用、首部压缩、服务端推送 等重要功能, 篇幅有限不能展开太多 。
虽然http2.0版本协议有很多非常优秀的功能并且在 2015年正式发布 ,现在国内外一些大厂基本都有使用http2.0承担部分请求,但是目前仍 然未广泛普及 。
目前http3.0版本在2018年也推出来了,至于http2.0和http3.0的推广和普及是需要时间的,但是坚信我们的网络可以 更安全、更快捷、更节约 。
9月22日是秋分,同时也是我国第三个农民丰收节。金秋时分,恰逢丰收,无疑四海欢...
中国的5G技术已经达到了世界领先水平,拥有多项优秀的专利技术,备受全球各国民...
数字经济时代,云、5G、AI、大数据、人工智能等新技术正在重构社会生产要素和生产...
ATT和其他许多领先的无线网络运营商正在逐渐进入边缘计算领域,希望该领域最终能...
人工智能在近十年来飞速地发展,现在已经逐渐走进了我们的生活。如今人工智能被...
1月19至21日,2020中国移动全球合作伙伴大会在广州召开,大会以5G融入百业 数智...
过去10年中,智能手机的快速普及,改变了全世界大多数人的生活和工作方式,而在...
今天和大家分享8个冷门但是特别好用的手机app,你有没有用过? 一、简窗 简窗是一...
以前人们在睡觉前喜欢看一会儿书,而到了现在的人们睡觉前则习惯看一会儿手机。...
《中国互联网络发展状况统计报告》数据显示,截至2018年12月,中国网民规模达到8...