HTTP2 协议及 websocket 协议总结
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存在的问题
随着带宽增加,延迟并没有降低(单连接上串行)
无状态导致的数据冗余(header头)
HTTP2
复用http1.1语义,基于tcp,仅在应用层变动,所以能快速推广
主要特性:
多路复用
传输的数据量大幅减少(二进制方式传输,header压缩)
服务器消息推送
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作用
实现多路复用: 同个stream里面是有先后顺序的(先传header再传dat),多个stream之间可以无序
客户端建立的流是奇数,服务器建立的流是偶数。Stream ID 为 0 的流仅用于传输控制帧
Stream ID 不能复用,长连接耗尽 ID 应创建新连接
帧头格式
type的定义:
header压缩原理
依赖HPACK压缩算法
静态字典: 61项
动态字典: 先入先出的淘汰策略
压缩算法:Huffman编码(出现概率较大的符号采用较短的编码,概率较小的符号采用较长的编码)
可以使用h2load查看header节省了多少
http2存在的问题
tcp三次握手、tls协议过多的握手次数
多路复用与tcp对头阻塞问题
虽然应用层是多路复用,但是tcp是基于一条连接,是串行发送,然后接收方又需要按照顺序组装。
http3(quic)协议
没有3次建立连接握手,可以1RTT完成握手,在之前建立连接的请求下可以达到0RTT建立连接
基于udp: 先天没有队列概念
允许客户端更换 IP 地址、端口后,仍然可以复用前连接
参考及引用: Web协议详解与抓包实战
评论