• 【网络知识之四】HTTP/2


    一、HTTP/1.1存在的问题

    1、TCP 连接数限制
    2、线头阻塞 (Head Of Line Blocking) 问题
    3、Header 内容多,而且每次请求 Header 不会变化太多,没有相应的压缩传输优化方案
    4、为了尽可能减少请求数,需要做合并文件、雪碧图、资源内联等优化工作,但是这无疑造成了单个请求内容变大延迟变高的问题,且内嵌的资源不能有效地使用缓存机制
    5、明文传输不安全

    二、HTTP/2优势
    1、二进制分帧层 (Binary Framing Layer)
    2、多路复用 (MultiPlexing)


    3、服务端推送 (Server Push)
    4、Header 压缩 (HPACK)
    5、应用层的重置连接
    6、请求优先级设置
    7、流量控制
    8、HTTP/1 的几种优化可以弃用

    三、HTTP/2原理

    1、帧
    (1)帧的结构
    帧由头部(9字节)+Frame Payload(主体内容)组成。

    Length:frame长度,一个24位无符号整数表示。不包含头部9字节。
    Type:定义frame类型,用8位表示。帧类型决定了帧主体的格式和语义,如果type为unknown应该忽略或抛弃。
    Flags:帧类型相关而预留的布尔标识。标识对于不同的帧类型赋予了不同的语义。如果该标识对于某种帧类型没有定义语义,则它必须被忽略且发送的时候应该赋值为 (0x0)
    R:是一个保留的比特位。这个比特的语义没有定义,发送时它必须被设置为 (0x0), 接收时需要忽略。
    Stream Identifier:流标识,用作流控制,用 31 位无符号整数表示。客户端建立的 sid 必须为奇数,服务端建立的 sid 必须为偶数,0x0保留为连接控制消息不能用于建立新流.
    Frame Payload:是主体内容,由帧类型决定。

    (2)帧的类型
    HEADERS: 报头帧 (type=0x1),仅包含 HTTP 标头信息;
    DATA: 数据帧 (type=0x0),装填主体信息,可以用一个或多个 DATA 帧来返回一个请求的响应主体;
    PRIORITY: 优先级帧 (type=0x2),指定发送者建议的流优先级,可以在任何流状态下发送PRIORITY帧,包括空闲(idle)和关闭(closed)的流;
    RST_STREAM: 流终止帧 (type=0x3),用来请求取消一个流,或者表示发生了一个错误,payload 带有一个 32 位无符号整数的错误码 (Error Codes),不能在处于空闲 (idle) 状态的流上发送 RST_STREAM 帧
    SETTINGS: 设置帧 (type=0x4),设置此 连接 的参数,作用于整个连接
    PUSH_PROMISE: 推送帧 (type=0x5),服务端推送,客户端可以返回一个 RST_STREAM 帧来选择拒绝推送的流
    PING: PING 帧 (type=0x6),判断一个空闲的连接是否仍然可用,也可以测量最小往返时间 (RTT)
    GOAWAY: GOWAY 帧 (type=0x7),用于发起关闭连接的请求,或者警示严重错误。GOAWAY 会停止接收新流,并且关闭连接前会处理完先前建立的流
    WINDOW_UPDATE: 窗口更新帧 (type=0x8),用于执行流量控制功能,可以作用在单独某个流上 (指定具体 Stream Identifier) 也可以作用整个连接 (Stream Identifier 为 0x0),只有 DATA 帧受流量控制影响。初始化流量窗口后,发送多少负载,流量窗口就减少多少,如果流量窗口不足就无法发送,WINDOW_UPDATE 帧可以增加流量窗口大小
    CONTINUATION: 延续帧 (type=0x9),用于继续传送首部块片段序列,见 首部的压缩与解压缩

    2、流-多路复用
    (1)流标识
    流ID是31位无符号整数,客户端发起的流必须是奇数,服务端发起的流必须是偶数,0x0保留为连接控制消息不能用于建立新流。

    (2)流状态
    idle:所有流以“空闲”状态开始。在这种状态下,没有任何帧的交换
    reserved (local) / reserved (remote)
    open
    half-closed (local)
    half-closed (remote)
    closed

    (3)流优先级

    每个流都分配了一个优先级,用于确定它的处理顺序,以及它将收到的资源量。将该优先级输入到给定流的标头帧或优先级帧中,优先级可以是 0 到 256 之间的任何数字。

    3、服务端推送
    (1)PUSH_PROMISE帧
    (2)Server-Push过程
    (3)nginx配置Server-Push
    (4)Server-Push潜在问题

    4、Header压缩-HPACK 算法
    (1)索引表
    (2)编码类型
    (3)二进制编码

    5、流量控制
    (1)WINDOW_UPDATE帧
    (2)流量控制窗口
    (3)合理使用流控制

    6、HTTP/2协议协商机制

    参考
    HTTP2详解
    深入浅出:HTTP/2
    HTTP/2 LAB
    Ngnix7个提高HTTP/2的技巧

    HTTP/2 幕后原理
    Java对HTTP2的支持

  • 相关阅读:
    设计实现业务系统中的用户权限管理
    海量数据的存储和访问解决方案
    Windows2003 IIS6.0配置主机头,一机多站
    web.config(2)
    web.config(1)
    如何查看windows下哪些端口被哪些进程正在监听
    net开发人员应该知道
    异步与多线程的区别(异步是目的,多线程是实现它的一种方式,异步的优先级有时候比主线程还高)
    如何检查Android网络连接状态
    android WIFI检测与设置
  • 原文地址:https://www.cnblogs.com/cac2020/p/11867852.html
Copyright © 2020-2023  润新知