HTTP2的优点

http1的性能问题

高延迟

原因是现在的网站消息大小变大,页面资源变多,内容形式变多样,实时性要求高

http1的延迟难以下降,并发连接有限,队头阻塞问题,http头部巨大且重复,不支持服务器推送

兼容http1

1http2没有在url里引入新的协议名,仍旧使用http://表示明文协议,用https://表示加密协议

2只在应用层做了改变,还是基于tcp传输,http2将http分解成语法和语义两部分,语义不变,如请求方法,状态码和头字段等规则保持不变,但在语法上做出改造

头部压缩

HPACK算法

静态字典,动态字典,huffman编码(压缩算法)

客户端和服务端都会建立和维护字典,用长度较小的索引号表示重复的字符串,再用huffman编码压缩数据

静态表编码

2代为高频出现在头部的字符串和字段建立了一张静态表,这是写入框架中的不会变化,共61组

静态表中有的index索引号直接和一组key和value对应,例如2表示key=method,value=get

有的index索引号只有key没有value,因为value可变,所以需要使用huffman编码压缩value后发送,这些index在头部中前两位固定为01

头部基于二进制编码,采用value length来分割index和value

image-20250813104322177

动态表编码

不在静态表中的字符串就要采用构建动态表的方式,index从62起步,在编码解码时随时更新,例如某个字段有上百字节,在发送和接收时,客户端和服务端都会更新动态表,下一次再发送只需要发送序号即可

动态表生效前提是,在同一个tcp连接上,重复传输完全相同的头部,如果消息字段只发送一次或一直在变化就不能充分利用动态表

动态表也会消耗内存,所以有限制的配置,当达到请求上限之后主动关闭连接释放内存

二进制帧

http2将1的文本格式改为二进制格式传输,极大提高效率

http2将响应报文划分为两类帧,首部header和消息负载data是帧的类型,一条http响应划分成两类帧传输,采用二进制编码

例如200,在http1中分成2,0,0,3个字节,而在http2中只用1字节就能表示

image-20250813110721753

帧的类型

image-20250813110741717

标志位携带控制信息,如头数据结束标志,数据发送结束表示,流的优先级等

最后4字节是流标识符,最高位保留不用,标识frame属于哪个stream

并发传输

多个stream复用一条tcp连接,达到并发的效果

stream中包含多个message

message包含多个frame

不同stream的帧可以乱序发送,会根据stream id组成http消息,而同一个stream的帧必须严格有序

服务器主动推送

单纯就是服务器可以主动向客户端发送http消息,例如访问html,可以主动返回css

posted on 2025-08-13 11:29  chycal  阅读(18)  评论(0)    收藏  举报