zoukankan      html  css  js  c++  java
  • [http] 有关http2的主要知识点整理

    一 介绍

    [classic_tong @  https://www.cnblogs.com/hugetong/p/12694322.html

    为了解决HTTP1的性能问题,HTTP2出现了。

    http1有什么问题

    1.  半双工的。请求与回应一来一回,彼此等待对方到底。

    2.  不能并发,一个TCP隧道只能处理一个 请求回应 队列。

    3.  隧道利用率低。大部分TCP连接,握手之后只通讯一次就结束了。

    http2有什么新的

    1.  在传输层与应用层直接,增加分帧层。

    2.  增加流控制。

    3.  增加服务器推送。

    4.  增加头压缩。

    二 分帧层

    分帧层功能

    1  分帧层使半双工变成了全双工。

    2  分帧层在传输层之上实现了多条全双工隧道。

    3  隧道支持优先级。

    分帧层模型

    为了实现多个全双工隧道的功能,引入以下三个概念:

    1. 流 stream

    2. 消息 message

    3. 帧 frame

    参考: https://developers.google.com/web/fundamentals/performance/http2?hl=zh-cn

    三 包格式

    应用层,也就是分帧层之上的一层。在逻辑结构和内容上,与http1相同。具体实现上有所差别。

    帧结构

        +-----------------------------------------------+
        |                 Length (24)                   |
        +---------------+---------------+---------------+
        |   Type (8)    |   Flags (8)   |
        +-+-------------+---------------+-------------------------------+
        |R|                 Stream Identifier (31)                      |
        +=+=============================================================+
        |                   Frame Payload (0...)                      ...
        +---------------------------------------------------------------+

    详见: https://tools.ietf.org/html/rfc7540#section-4.3

    四 头压缩

    HEADER就是HTTP中的HEADER,它是有压缩的。

    第一步,把常用的header name + value 用数组进行了替换,使用查表的方式进行约定,

    表在这里: https://tools.ietf.org/html/rfc7541#appendix-A

    后七个bit查表,第一个bit恒为1

         0   1   2   3   4   5   6   7
       +---+---+---+---+---+---+---+---+
       | 1 |        Index (7+)         |
       +---+---------------------------+

    表中没有约定的内容,仍然使用ascii码的形式。

    第二步,使用哈夫曼编码进行字符压缩。当然,其实也可以直接ascii码,说的有点乱,详见:https://tools.ietf.org/html/rfc7541#section-5.2

    有三种情况:with indexing, without indexing, and never indexed, 格式类似,但是不完全相同。

    第一种情况的格式是这样的:

         0   1   2   3   4   5   6   7
       +---+---+---+---+---+---+---+---+
       | 0 | 1 |      Index (6+)       |
       +---+---+-----------------------+
       | H |     Value Length (7+)     |
       +---+---------------------------+
       | Value String (Length octets)  |
       +-------------------------------+

    要点:1  第二个bit是1代表当前这种情况。2  第9个bit是1代表后边的内容使用哈夫曼编码,如果是0直接使用ascii码。

    举个例子: server: nginx

    这个例子里,第三到第八个bit,查前文“第一步”里面的表,可以得到代表server的index值。填进去,在这里,它是54,加上第二个bit的1,16进制就是0x76。

    如下图:

     如图,0x76 84 aa 63 55 e7

    76分析过了。84第一个bit是1,代表使用哈夫曼编码,去掉1剩下的4代表长度4个字节。后边的是个字节,就是哈夫曼编码。

    可以通过查表得到,是另一张表,在这:https://tools.ietf.org/html/rfc7541#appendix-B

    字符串nginx查表结果二进制:(后边的两个 11 是padding)

     我们的例子里的二进制,是这样的。两个对照,是一致的。

     

     以上。header的编码就是酱紫。

    五 举个例子

    http2c.pcap

    使用nginx + hghttp2工具实验,抓到的包,截图在这里:

    六  与SPDY的区别

    1  SPDY是用控制与数据两种帧类型,HTTP2只使用一种。

    2  HTTP2使用哈夫曼编码压缩,SPDY使用基于流的压缩。

    来自wiki:https://en.wikipedia.org/wiki/HTTP/2#Genesis_in_and_later_differences_from_SPDY

    七 完

    [classic_tong @  https://www.cnblogs.com/hugetong/p/12694322.html

  • 相关阅读:
    替代PhotoShop:GIMP图形编辑器的使用
    Matlab: 主函数和子函数间接传递变量
    代码管理:SVN的使用
    Python: 科学计算
    Python: 代码调试
    Latex: article模板
    Matlab: 程序优化和调试
    LibreOffice的使用技巧
    mysql--多表联合查询
    mysql--数据查询
  • 原文地址:https://www.cnblogs.com/hugetong/p/12694322.html
Copyright © 2011-2022 走看看