来自RFC7540:
虽然HTTP/1.x使用消息起始行(参见RFC7230,第3.1节)来传递目标URI、请求方法和响应的状态代码,但HTTP/2使用了以':‘字符(ASCI0x3a)开头的特殊伪头字段。
那么为什么HTTP/2使用伪头字段呢?HTTP/1.x中的消息起始行有什么问题吗?
发布于 2021-10-14 03:52:49
从Google对HTTP/2的介绍借出一个图像

在这张图片中,您可以看到,在第一个请求中,前两个标题行通常如下:
GET /resoure HTTP/1.1
Host: https://example.com
...现在被分割成这样的标题框架
:method: GET
:scheme: https
:host: example.com
:path: /resource
...而其余的标题或多或少是相同的,除了是所有小写字符。
HTTP/2尽量减少有效负载大小。它还将压缩与前一个请求中发送的标头相等的标头和带头,如链接图像的右侧所示。
在HTTP/1.1中,一个连续的请求看起来像第一个初始请求,只是针对不同的资源:
GET /otherResource HTTP/1.1
Host: https://example.org
...在HTTP/2中,对同一服务器的连续请求只需要
:path: /otherResource由于所有其他标头都已可用,因此可以从以前缓存的和索引的标头中恢复。
因此,这是一个进一步减少连续请求的有效负载的优化。
发布于 2021-10-14 04:30:17
HTTP/2是一种新的协议,采用二进制编码。
HTTP/2中没有状态行,就像单个标头没有“行”一样。必须发明一种全新的方法来对HTTP请求的每个部分进行编码。
标题实际上是一种键->值结构。它没有为HTTP/1.1请求的第一行中出现的内容发明不同的编码,而是使协议更简单,如果使用相同的编码方法。
毕竟,像'path‘和'http方法’这样的东西已经在标题中了,为什么不采用与常规标头相同的编码方法呢?前面的:确保与现有的HTTP/1.1头没有冲突,因为头的名称永远不能包含:。
因此tl;dr是:通过将来自HTTP请求和响应的第一行信息编码为特殊的HTTP报头,协议可能会更简单。
https://stackoverflow.com/questions/69564548
复制相似问题