【网络知识之四】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的更多相关文章
- 网络知识学习2---(IP地址、子网掩码)(学习还不深入,待完善)
紧接着:网络知识学习1 1.IP地址 IP包头的结构如图 A.B.C网络类别的IP地址范围(图表) A.B.C不同的分配网络数和主机的方式(A是前8个IP地址代表网络,后24个代表主机:B是16 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 网络知识 - 简易的自定义Web服务器
简易的自定义Web服务器 基于浏览器向服务端发起请求 两台主机各自的进程之间相互通信,需要协议.IP地址和端口号,IP表示了主机的网络地址,而端口号则表示了主机上的某个进程的地址,IP加Port统称为 ...
- 软件测试人员必备网络知识(一):什么是cookie?
初入职场的新人,是不是经常会被一些基础的网络知识难住,又不敢问老大,只好默默的百度?纳,我花一个星期的加班时间,把这些经常要用到的网络知识点给整理出来了!这是一个系列的,如果对你们有用,后续还会继续 ...
- centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...
- Linux运维基础入门(四):Linux中的网络知识04
一,虚拟机的安装 略 二,Linux系统下的网络配置(Linux虚拟机的网络设定为桥接模式) 桥接模式:虚拟机同主机一样,在网络中相当于一个真实存在的装有Linux系统的电脑.(我们先用这个模式) N ...
- Linux实战教学笔记19:Linux相关网络知识梳理
第十九节 Linux相关网络知识梳理 标签(空格分隔): Linux实战教学笔记-陈思齐 一,前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工 ...
- 网络知识===wireshark抓包数据分析(一)
wireshark分析: 上图是我进行一个HTTP协议的下载,文件内容大概是1.7M左右. 抓包数据: https://files.cnblogs.com/files/botoo/wireshark% ...
- 软件工程师需要了解的网络知识:从铜线到HTTP(一)—— 前言
转自:https://lvwenhan.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/485.html?hmsr=toutiao.io&utm_medium ...
随机推荐
- 关于如何提高缓存命中率(redis)
一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...
- Docker Hub 使用初探
Docker Hub 使用初探 —— 魏刘宏 2019.10.26 容器的话题越来越热,今天我也来试试容器的使用,我们以 Docker Hub 为例. Docker Hub 官网为 https://h ...
- SpringBoot打可执行war包
1. 主程序类: @SpringBootApplication public class Application extends SpringBootServletInitializer { @Ove ...
- Unity音乐喷泉效果
本文参考了该文,其素材也取之于该处 效果 实现效果(根据音乐的高低会产生不同的波纹): 可以观看视频来获得更好的体验. 波纹的实现 先模拟出如下效果: 通过鼠标的点击,产生一个扩散的圆圈. 如上图所示 ...
- gsoap生成webservice调用客户端接口
1.下载gsoap2.8 2.运行 wsdl2h.exe -o XXX.h XXX.wsdl wsdl文件可以是本地文件,也可以是服务器的wsdl,比如http://192.168.0.122:333 ...
- Kibana插件开发
当前开发环境 Kibana版本:7.2 elasticsearch版本:7.2 开发环境安装可参考:https://github.com/elastic/kibana/blob/master/CONT ...
- flink Periodic Watermarks 自定义周期性水印
1.BoundedOutOfOrdernessGenerator /** * This generator generates watermarks assuming that elements ar ...
- 【LeetCode】寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- Oracle client 安装、配置
一.安装 链接: https://pan.baidu.com/s/1Yph6hiNkCJsApAzu_Vx2ew 提取码: r9ye 二.配置 1.控制面板\所有控制面板项\管理工具\数据源(ODB ...
- NCcat学习使用
一.使用手册 1.简介:nc/NetCat是一款端口监听工具,可以用来建立系统之间的连接.传输文件.TCP代理等. 2.命令参数 nc [-options] hostname port[s] ...