在 HTTP2 协议中,数据是使用二进制传输。
对于这个二进制传输,我不太理解。
假设我给服务器发送的是文本消息:你好
在 HTTP1.1 中会在 head 中标注上:content-type: text/html; charset=UTF-8
然后 body 中把 "你好" 按 utf-8 编码表转成0x4F60(你) 0x597D(好)
对应的一长串的二进制形式传输
"你好" 在网络上传输就是二进制传输,为啥不算二进制流?
是因为使用的是文本编码格式吗?
那在 HTTP2 中不使用文本格式编码,怎么处理 "你好" 呢?
是新制定一种编码格式吗?
比如我自定义一种 newCoding 编码:
你 ---> 01
好 ---> 10
在 head 中声明content-type: application/binary; newCoding
然后 body 中就直接发送01 10
我可以这样理解吗?
1
monkeyWie 2021-12-13 10:07:56 +08:00
没错,http2 用了哈夫曼编码和你理解的这个意思差不多
|
2
monkeyWie 2021-12-13 10:10:50 +08:00
再补充下,body 是不会做编码映射的,因为 body 里的内容没有规则,只是 http 头之类的
|
3
coolzjy 2021-12-13 10:45:52 +08:00
header 中会使用霍夫曼编码或静态 /动态字典来压缩,但 body 中仍然与 http 一样,使用的是 text/gzip/brotli 编码 /压缩的内容。
所谓二进制,指的是二进制分帧。可以理解为 HTTP/1.x 中一个 HTTP 请求 /响应是不可再分的原子结构,一个请求没有结束时,UA 不可能再发起第二个请求(同一个连接上)。而 HTTP/2 中请求 /响应则可以被进一步拆解为二进制帧,不同请求的二进制帧可以交错传输,解决了队首阻塞的问题。 |