我刚刚读了一篇有关 http 和 http2 差异的文章,但是我主要的问题是当山雀说 http2是一个二进制协议,但 http 1是文本协议。
也许我错了,但是我知道任何数据,文本或任何可能的格式在内存中都具有binray表示形式,即使通过tcp / ip网络进行传输,数据也会按照层的格式进行拆分(OSI模型或TCP / IP模型表示形式),这意味着从技术上讲,文本形式在通过网络进行数据传输时不存在。
所以我不能真正理解http2和http1之间的区别,请您帮我更好的解释吗?
答案 0 :(得分:1)
二进制可能是一个令人困惑的术语-在计算机的某个点上,一切最终都是二进制的!
HTTP / 2具有高度结构化的格式,其中HTTP消息被格式化为数据包(称为帧),并且每个帧都分配给一个流。 HTTP/2 frames have a specific format,包括在每个帧的开始处声明的长度以及帧头中的各个其他字段。在许多方面,它就像一个TCP数据包。可以按照定义的过程读取HTTP / 2帧(前24位是该数据包的长度,后跟8位用于定义帧类型...等)。帧标头到来后,有效载荷(例如HTTP标头或主体有效载荷)将以事先已知的特定格式出现。可以在一个或多个帧中发送HTTP / 2消息。
相比之下,HTTP / 1.1是一种非结构化格式,由ASCII编码的文本行组成-因此,是的,它最终以二进制形式传输,但是它基本上是字符流,而不是专门分成单独的片段/帧(其他比线)。通过一次读取一个字符来解析HTTP / 1.1消息(或至少是HTTP请求和HTTP标头),直到到达换行符为止。这有点麻烦,因为您事先不知道每行多长时间,因此您必须逐个字符地对其进行处理。在HTTP / 1.1中,HTTP正文的长度处理方式略有不同,这通常是事先已知的,因为内容长度HTTP标头将对此进行定义。 HTTP / 1.1消息必须作为一个连续的数据流完整地发送,并且该连接只能用于传输该消息,直到完成为止。
HTTP / 2带来的优点是,通过将消息打包到特定的帧中,我们可以将消息混合:这是请求1,这是请求2,这里是请求1等等……等等。在HTTP / 1.1中,这是不可能的,因为HTTP消息没有被包装到带有ID的数据包/帧中,该ID属于该请求属于哪个请求。
答案 1 :(得分:0)
HTTP基本上将所有相关指令编码为ASCII码点,例如:
GET /foo HTTP/1.1
是的,在实际的传输层上以字节表示,但是命令基于ASCII字节,因此可作为文本读取。
HTTP / 2使用实际的二进制命令,即单个位和字节,除了它们本身的位和字节外没有其他表示形式,因此没有可读的表示形式。 (请注意,HTTP / 2本质上是以这种二进制协议包装HTTP / 1的,仍然在其中找到“ GET /foo
”。)
答案 2 :(得分:0)
我认为原因是http2中的每个请求数据都可以按字节分隔,然后在发送之前组合成新的二进制协议层。相比之下,http1.1请求数据是一个完整的整体,不能分开,必须从头到尾进行传输。
答案 3 :(得分:-2)
我相信HTTP / 2使用二进制编码的主要原因是将有效载荷打包到固定大小的帧中。 纯文本不能完全适合框架。因此,对数据进行二进制编码并分成多个帧会更有意义。