为什么http要加一个binary frame来实现复用?
why http should add a binary frame to achieve multiplexing?
这篇文章声称二进制帧层成为 TCP 连接的 http 多路复用的基础,这让我感到困惑。
https://developers.google.com/web/fundamentals/performance/http2#design_and_technical_goals
令人困惑的部分是 HTTP 客户端可以在一个 TCP 连接中发送更多请求而无需等待响应并接收相应请求的响应。也就是说“框架”是请求和响应。那么为什么要添加二进制帧呢?
让我们看看您的建议:
the HTTP client can just send more requests in one TCP connection without waiting for the response
到目前为止一切顺利:我可以在同一连接上发送“GET /foo”,然后立即发送“GET /bar”。
and receive the response for the corresponding request
那么,服务器用一些 HTML 内容回复“200 OK”,然后......等等,是“/foo”还是“/bar”?您自己描述中的关键词是“对应”——我们需要某种方式来表达“此响应对应于请求 #1”。
然后,在发送第一个响应的中途,服务器完成处理另一个请求,并准备发送 不同 响应的一部分;但如果它以“200 OK”跳入,那似乎是它已经发送的响应的一部分。所以我们还需要能够说“这是一个新响应的开始”,以及“这个内容是响应#2 的延续”。
为此,我们需要一个新的抽象:一个 帧 ,一个 header 可以编码细节,例如“接下来的 100 个字节是响应的开始#2,对应于请求 #1”。 (我不确定这是否 完全 HTTP/2 框架是如何工作的,但我认为这大致是 原则 。)
我们可以做到这一点并且仍然保持协议的可读性(这就是我们所说的“text-based”与“二进制”的真正意思)但是会有很多这样的框架headers,所以我们可以把它们做得越短越好。所以如果我们对性能感兴趣,我们可以放弃“人类可读”作为要求,我们最终得到一个像 HTTP/2.
这样的二进制框架协议。
这篇文章声称二进制帧层成为 TCP 连接的 http 多路复用的基础,这让我感到困惑。
https://developers.google.com/web/fundamentals/performance/http2#design_and_technical_goals
令人困惑的部分是 HTTP 客户端可以在一个 TCP 连接中发送更多请求而无需等待响应并接收相应请求的响应。也就是说“框架”是请求和响应。那么为什么要添加二进制帧呢?
让我们看看您的建议:
the HTTP client can just send more requests in one TCP connection without waiting for the response
到目前为止一切顺利:我可以在同一连接上发送“GET /foo”,然后立即发送“GET /bar”。
and receive the response for the corresponding request
那么,服务器用一些 HTML 内容回复“200 OK”,然后......等等,是“/foo”还是“/bar”?您自己描述中的关键词是“对应”——我们需要某种方式来表达“此响应对应于请求 #1”。
然后,在发送第一个响应的中途,服务器完成处理另一个请求,并准备发送 不同 响应的一部分;但如果它以“200 OK”跳入,那似乎是它已经发送的响应的一部分。所以我们还需要能够说“这是一个新响应的开始”,以及“这个内容是响应#2 的延续”。
为此,我们需要一个新的抽象:一个 帧 ,一个 header 可以编码细节,例如“接下来的 100 个字节是响应的开始#2,对应于请求 #1”。 (我不确定这是否 完全 HTTP/2 框架是如何工作的,但我认为这大致是 原则 。)
我们可以做到这一点并且仍然保持协议的可读性(这就是我们所说的“text-based”与“二进制”的真正意思)但是会有很多这样的框架headers,所以我们可以把它们做得越短越好。所以如果我们对性能感兴趣,我们可以放弃“人类可读”作为要求,我们最终得到一个像 HTTP/2.
这样的二进制框架协议。