详细分析http2 和http1.1 区别

之前整理了一遍http1.0, http1.1, http2.0之前的区别,但是里面很多细节都没有弄清。特别是在http1.1和2.0之间关于多路复用,头压缩这一块儿。 最近在外网上搜到一遍蛮详细的文章,觉得讲的很清晰,所以就翻译了分享给大家。原文地址

背景

在比较http2 和http1.1区别之前,让我们先宏观的看一看两者历史性的发展。

HTTP1.1

1989年作为万维网交流标准,属于应用层协议,在客户端和服务器端进行信息交换。这个过程中,客户端发送一个基于文本的请求到服务器通过调用GET 或者POST方法。 相应的,服务器返回资源给客户端。

例如:

GET /index.html HTTP/1.1

Host: www.example.com

该请求用GET方法。 服务器会返回一个HTML页面和一些图片,样式表和一些其他资源。注意:所有的资源并不是一次性返回给客户端。两者会在之间反反复复进行几次请求和响应,直到该html页面所有的资源内容在你的屏幕上被绘制。

HTTP/2

http2 刚开始为SPDY协议,起初Google为了减少加载延迟而开发的,通过使用例如压缩,多路复用,优化等。 目前该协议已经被很多浏览器所支持。

从技术角度而言,http1.1和2.0 最大的区别是二进制框架层。与 http1.1把所有请求和响应作为纯文本不同,http2 使用二进制框架层把所有消息封装成二进制,且仍然保持http语法,消息的转换让http2能够尝试http1.1所不能的传输方式。

Http1.1 流水线和队头阻塞

客户端首次接受的响应常常不能完全渲染。相反,它包含一些其他需要的资源。 因此,客户端必须发出一些其他请求。 Http1.0客户端的每一个请求必须重新连接,这是非常耗时和资源的。

Http1.1 通过引入长连接和流水线技术处理了这个问题。 通过长连接,http1.1假定这个tcp连接应该一直打开直到被通知关闭。 这就允许客户端通过同一连接发送多个请求。不巧的是,这优化策略有个瓶颈。当一个队头的请求不能收到响应的资源,它将会阻塞后面的请求。这就是知名的队头阻塞问题。虽然添加并行的tcp连接能够减轻这个问题,但是tcp连接的数量是有限的,且每个新的连接需要额外的资源。

Http2 二进制框架层的优势

在http2 , 二进制框架层编码 请求和响应 并把它们分成更小的包,能显著的提高传输的灵活性。

与http1.1利用多个tcp连接来减少队头阻塞的影响相反,http2在两端建立一个单独的连接。该连接包含多个数据流。 每个流包含多个请求/响应格式的消息 。 最终,每个消息被划分为更小的帧单元。

1.png

在最细微层面上,交流通道由一系列二进制帧组成,每一个被标记到特定的流。可识别标签允许连接在传输过程中来交错这些帧并在另一端去组合它们。 交错的请求和响应能够并行的传输而不被阻塞。该过程被称作多路复用技术。

因为多路复用允许客户端并行的构建多个流,这些流仅仅需要一个tcp连接。 相比http1.1能很大程度上减少内存和整个网络中的足迹。所以有更好的网络及带宽利用率。

Tcp连接也能改善https协议的性能,因为客户端可针对多个请求/响应 复用同一个连接 在tls和ssl握手期间,双方在整个会话同意使用唯一的key。 如果连接中断,新的会话需要一个新生成的key。 因此,维持单链接能很大程度优化https。

Http2 流的优先级

流优先级不仅仅解决同一资源的竞态问题,也允许开发人员自定义请求的权重。

如你所知,二进制框架层把消息组织成并行数据流。 当一个客户端发送并行请求,它能把请求的响应设置优先级权重 ,从1-256 ,更高的数字代表更高的优先级。 此外,该客户端也通过特定的流ID指明每个流的依赖。如果id被忽略,说明这个流是根流。

2.png

上图中,channel包含6个流,每个有一个唯一id 且有一个特定的权重。 流1没有父ID,说明是根节点。分配给每个流的资源将根据权重和它们需要的依赖。

服务器端利用该信息创建一个依赖树,通过次树来决定响应的数据。根据之前的图表,依赖树如下:

3.png

根据此依赖树,所有可用资源将会先分配给 流1。 因为流2依赖流1,流2直到流1完成后才处理。流2完成后,资源分配给流3,流4. 两者权重比为2:4,资源也会依此来分配。3,4完成后,流5,流6将会等分资源。

作为开发者,你可以根据需要去设置权重,例如,给高分辨率图片设置低优先级。Http2协议允许客户端在运行时根据用户交互重新分配权重和改变依赖。 然而,服务器端会改变优先级根据如果某个流因为请求特定资源被阻塞。

缓冲区溢出

客户端和服务器都有一定数量的缓冲区来持有还未被处理的请求。

当服务器返回给客户端一大堆数据,或者客户端上传一个大的图片和视频,可能造成缓冲区溢出。

为了避免缓冲区溢出,流控制机制可以禁止发送者发送太多数据。下面我们聊聊http1.1和http2不同的流控制机制。

Http1.1

http1.1流控制基于tcp连接。当连接建立时,两端通过系统默认机制建立缓冲区。 并通过ack报文来通知对方接收窗口大小。

因为Http1.1 依靠传输层来避免流溢出,每个tcp连接需要一个独立的流控制机制。

Http2

http2通过一个连接来多路复用。 结果是在传输层的tcp连接不足以管理每个流的发送。http2允许客户端和服务器端实现他们自己的流控制机制,而不是依赖传输层。两端在传输层交换可用的缓冲区大小,来让他们在多路复用流上设置自己的接收窗口。

预测资源请求

通常web应用,客户端发送一个GET请求且收到一个HTML。当检测收到html的内容,会发现它需要拿取其他的资源。例如CSS和JS文件。然后就会继续请求其他资源。这些请求会最终加长连接加载时间。

解决办法:因为服务器端提前知道客户端需要额外资源,服务器端可以通过提前发送这些资源给客户来节省时间,而不用客户来请求。

Http/1.1 资源内联

如果开发者提前知道客户机器需要哪些额外的资源来渲染界面,他们使用资源内联的技术来包含需要的资源。例如:如果一个客户需要一个特定的CSS文件,内联该文件就可以不通过请求来拿到,减少客户端必须发送的请求数。

该技术对于小文件是可行的,但是大文件会降低连接的速度。还可能造成文件多次请求。

Http2 服务器推送

因为http2支持多个并发响应,服务器可以提前把HTML 页面中的其他资源在客户端请求之前发给它。

服务器先发送一个PUSH_PROMISE 帧通知客户端将推送资源。该帧只包含头消息,且允许用户提前知道哪些资源将会推送。如果客户端已经缓存,可以拒绝该推送。

压缩技术

常用的优化web应用是用压缩算法减少HTTP消息大小。 HTTP/1.1 和2 都用该技术HTTP/1.1不支持整个消息压缩。下面我们来聊聊区别。

Http1.1

Gzip已经被用于压缩http消息很久了,特别是减少CSS和JS脚本的文件。然而消息头部分依然是纯文本发送。尽管每个头都很小,但随着请求越来越多,连接的负担就会越重,如果带了cookie. Header将变得更大。

Http2

Http2 的二进制框架层在细节上表现出强大的控制力,在头压缩上也是如此。 http2 能把头从他们的数据中分离,并封城头帧和数据帧。 http2特定的压缩程序HPACK可以压缩头帧。 该算法用Huffman编码头metadata,可以很大程度上减少头大小。此外, HPACK可以跟踪先前传输的metadata字段,然后通过动态改变服务器端和客户端共享的索引来进一步压缩。如下:

4.png

如上图,上述字段只有path有不同的值。 因此,HPACK可以只发送需要改变的值

5.png

此外:
关于Https,Http1.0, 1.1, 2.0的区别,可以参考这篇文章
关于tcp,udp报文讲解和分析,可以参考这里
关于tcp,udp 三次握手和四次挥手,可以参考这里

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349