有关http / 2的文章中关于双向和全双工的混淆

问题描述 投票:0回答:1

一些描述http / 2的文章称其为双向和全双工。

AFAIK双向意味着通信是双向的,所以双工是双向的,是吗?

可以通过在某些特定点(半双工)处反转的单个流来创建双工,或者可以将其创建为两个相反的单工流(全双工)。

也许双向是关于如何发起消息交换?在http / 1中,只有客户端可以通过向服务器返回响应的服务器发送请求来启动。在http / 2中,服务器可以发送(推送)某些资源而无需明确要求它。但我们可以在http / 1.1中使用Server-sent events(即服务器可以在客户端和服务器上进行一些配置之后推送消息,但它仍然通过http / 1.1协议)。

当你考虑它时,你可能会注意到http / 1也是双向和全双工的(因为在半双工中不可能进行流水线操作)。所以从http / 2的角度来看,这里没有变化。

改变的是,http / 1要求的响应按照请求的确切顺序到达。 http / 2通过流和多路复用提升。

http2 bidirectional duplex
1个回答
4
投票

双向意味着您可以双向发送数据。

全双工意味着您可以同时向两个方向发送数据 - 您可以同时执行两个线程,一个写入数据和一个读取数据。

如果我们将端点“客户端”和“服务器”(无论两者之间有多少TCP连接),那么显然HTTP / 1.1和HTTP / 2都是全双工的。

如果我们将端点作为客户端和服务器之间单个TCP连接的两端,则HTTP / 1.1和HTTP / 2通常都是全双工的。

这对于HTTP / 2来说是显而易见的,但对HTTP / 1.1来说却鲜为人知,因为它通常被认为是“首先是请求,然后是响应”协议 - 然而,事实并非如此。完全可能,例如对于回送客户端发送的内容字节的服务器,让客户端进行大量上载,并且在上载仍在进行时,服务器已经开始响应回显字节 - 上传和下载同时发生。

我们现在可以输入从服务器到客户端的未经请求的通信问题。

这在HTTP / 1.1中是不可能的。即使使用服务器发送事件(SSE),客户端发出请求,服务器也会响应“无限响应” - 但客户端必须首先发出请求。

在HTTP / 1.1中,从单个TCP连接的角度来看,SSE不是全双工:客户端首先发出请求,然后服务器以“无限响应”响应。从那时起,客户端只能通过发出另一个请求与服务器通信,这意味着打开一个新连接。

在HTTP / 2中,SSE是全双工的,因为通过HTTP / 2多路复用,客户端可以通过在同一TCP连接上发出另一个请求来与服务器通信。

SSE“无限响应”可以被视为“服务器写入可被解释为推送消息的数据块”,但SSE协议太简单,不允许从服务器到客户端的通用消息(例如,数据不能是二进制)。你不会考虑下载,因为服务器将数据推送到客户端:)

在HTTP / 2中也无法从服务器到客户端进行未经请求的通信,因为HTTP / 2可以将资源“推送”到客户端,但仅限于先前请求的上下文中。

例如,HTTP / 2客户端与服务器建立连接,但之后它不发送任何请求;在这种情况下,服务器将无法向客户端推送任何内容(甚至不是欢迎页面),因为它需要先前的请求。

这就是为什么HTTP / 2不能完全替代WebSocket协议的原因,WebSocket协议是唯一可用于从服务器到客户端的完全未经请求的通信的Web协议。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.