zoukankan      html  css  js  c++  java
  • 【网络知识之四】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的支持

  • 相关阅读:
    Hadoop 学习笔记 (十) hadoop2.2.0 生产环境部署 HDFS HA Federation 含Yarn部署
    hadoop 2.x 安装包目录结构分析
    词聚类
    Hadoop 学习笔记 (十一) MapReduce 求平均成绩
    Hadoop 学习笔记 (十) MapReduce实现排序 全局变量
    Hadoop 学习笔记 (九) hadoop2.2.0 生产环境部署 HDFS HA部署方法
    Visual Studio Code 快捷键大全(Windows)
    Eclipse安装教程 ——史上最详细安装Java &Python教程说明
    jquery操作select(取值,设置选中)
    $.ajax 中的contentType
  • 原文地址:https://www.cnblogs.com/cac2020/p/11867852.html
Copyright © 2011-2022 走看看