写点什么

HTTP2 协议及 websocket 协议总结

用户头像
江龙
关注
发布于: 2020 年 11 月 06 日

wireshark如何抓https包

配置方式参考:https://www.jianshu.com/p/40c7a42c42b0



websocket

基于TCP连接上进行全双工通信;WebSocket握手使用HTTP Upgrade头从HTTP协议更改为WebSocket协议,使之与HTTP协议兼容。





websocket消息前面两字节是帧首部,必定存在的:

帧类型(opcode):

持续帧

0:继续前一帧

非控制帧:

1:文本帧(UTF8)

2:二进制帧

3-7:为非控制帧保留

控制帧

8:关闭帧

9:心跳帧 ping

A:心跳帧 pong

B-F:为控制帧保留

一条消息可以包含多个帧,通过FIN=1来表示这个帧是否是结束帧



HTTP1.1存在的问题

  1. 随着带宽增加,延迟并没有降低(单连接上串行)

  2. 无状态导致的数据冗余(header头)



HTTP2

复用http1.1语义,基于tcp,仅在应用层变动,所以能快速推广



主要特性:

  1. 多路复用

  1. 传输的数据量大幅减少(二进制方式传输,header压缩)

  2. 服务器消息推送



http2多路复用演示: https://http2.akamai.com/demo





如何协商使用http2协议,是在TLS( ClientHello - ServerHello)中达成共识的:



核心概念(stream\message\frame)

Connection: 一个TCP连接,对应里面可以有多个stream

Stream: 双向通讯,里面可以有多个message

Message: 里面可以有多个frame,对应http1.1中的请求与响应

frame: 最小单位,以二进制压缩方式保存内容

message是不可见的,frame及stream可以抓包观察到



stream流id作用

  1. 实现多路复用: 同个stream里面是有先后顺序的(先传header再传dat),多个stream之间可以无序

  2. 客户端建立的流是奇数,服务器建立的流是偶数。Stream ID 为 0 的流仅用于传输控制帧

  3. Stream ID 不能复用,长连接耗尽 ID 应创建新连接

帧头格式

type的定义:



header压缩原理

依赖HPACK压缩算法

  1. 静态字典: 61项

  2. 动态字典: 先入先出的淘汰策略

  3. 压缩算法:Huffman编码(出现概率较大的符号采用较短的编码,概率较小的符号采用较长的编码)

可以使用h2load查看header节省了多少

http2存在的问题

  1. tcp三次握手、tls协议过多的握手次数

  2. 多路复用与tcp对头阻塞问题

虽然应用层是多路复用,但是tcp是基于一条连接,是串行发送,然后接收方又需要按照顺序组装。

http3(quic)协议

  1. 没有3次建立连接握手,可以1RTT完成握手,在之前建立连接的请求下可以达到0RTT建立连接

  2. 基于udp: 先天没有队列概念

  3. 允许客户端更换 IP 地址、端口后,仍然可以复用前连接



参考及引用: Web协议详解与抓包实战

用户头像

江龙

关注

还未添加个人签名 2017.12.16 加入

还未添加个人简介

评论

发布
暂无评论
HTTP2协议及websocket协议总结