为什么说HTTP2是二进制协议?

Chr*_*ola 15 https http http-1.1 web-development-server http2

我刚刚阅读了一篇关于http1和http2之间差异的文章,但我的主要问题是当它说http2 是二进制协议而http1 是文本协议时。

也许我错了,但我知道任何数据是文本或任何格式,它可以在内存中具有二进制表示形式,即使通过 TCP/IP 网络传输时,数据也会按照层(OSI 模型)的格式进行拆分或 TCP/IP 模型表示),这意味着在通过网络传输数据的上下文中不存在技术上的文本格式。

所以我不能真正理解 http2 和 http1 之间的这种不同,你能帮我更好的解释吗?

Bar*_*ard 31

二进制可能是一个令人困惑的术语 - 在计算机中的某个时刻,一切最终都是二进制的!

HTTP/2 具有高度结构化的格式,其中 HTTP 消息被格式化为数据包(称为帧),并且每个帧都分配给一个流。HTTP/2 帧具有特定格式,包括在每个帧开头声明的长度和帧头中的各种其他字段。在许多方面,它就像一个 TCP 数据包。读取 HTTP/2 帧可以遵循一个定义的过程(前 24 位是这个数据包的长度,后面的 8 位定义了帧类型……等等)。在帧头之后是有效载荷(例如 HTTP 标头或正文有效载荷),这些也将采用事先已知的特定格式。HTTP/2 消息可以在一帧或多帧中发送。

相比之下,HTTP/1.1 是一种由 ASCII 编码的文本行组成的非结构化格式 - 所以是的,这最终作为二进制传输,但它基本上是一个字符流,而不是被专门分解成单独的片段/帧(除了行) . HTTP/1.1 消息(或至少第一个 HTTP 请求/响应行和 HTTP 标头)通过一次读入一个字符来解析,直到到达换行符为止。这有点混乱,因为您事先不知道每行有多长,因此您必须逐个字符地处理它。在 HTTP/1.1 中,HTTP 主体的长度处理略有不同,因为通常事先已知的内容长度 HTTP 标头将对此进行定义。一个 HTTP/1。

HTTP/2 带来的好处是,通过将消息打包到特定的帧中,我们可以混合消息:这里有一点请求 1,这里有一点请求 2,这里还有一些请求 1……等等。在 HTTP/ 1.1 这是不可能的,因为 HTTP 消息没有被包装到数据包/帧中,这些数据包/帧标记有关于它属于哪个请求的 id。

我在这里有一个图表和一个动画版本,可以帮助更好地概念化。


dec*_*eze 6

HTTP 基本上将所有相关指令编码为 ASCII 代码点,例如:

GET /foo HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

是的,这在实际传输层上表示为字节,但命令基于 ASCII 字节,因此可以作为文本读取。

HTTP/2 使用实际的二进制命令,即单独的位和字节,除了它们本身的位和字节之外没有其他表示,因此没有可读的表示。(请注意,HTTP/2 本质上将 HTTP/1 包装在这样的二进制协议中,但仍然可以GET /foo在其中找到“”。)