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

Http2 关于http/2的文章中关于双向和全双工的混淆,http2,bidirectional,duplex,Http2,Bidirectional,Duplex,一些描述http/2的文章称赞它是双向和全双工的 AFAIK双向意味着通信是双向的,所以双工本质上是双向的,是吗 双工可以由一个在某些特定点反转的单工流(半双工)创建,也可以创建为两个相反的单工流(全双工) 也许双向是关于如何启动消息交换?在http/1中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在http/2中,服务器可以发送(推送)某些资源,而无需显式请求。但是,我们可以在http/1.1中使用服务器发送事件(也就是说,服务器可以在客户端和服务器上进行少量配置后,根据

一些描述http/2的文章称赞它是双向和全双工的

AFAIK双向意味着通信是双向的,所以双工本质上是双向的,是吗

双工可以由一个在某些特定点反转的单工流(半双工)创建,也可以创建为两个相反的单工流(全双工)

也许双向是关于如何启动消息交换?在http/1中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在http/2中,服务器可以发送(推送)某些资源,而无需显式请求。但是,我们可以在http/1.1中使用
服务器发送事件
(也就是说,服务器可以在客户端和服务器上进行少量配置后,根据需要推送消息,但仍然是通过http/1.1协议)

当您考虑它时,您可能会注意到http/1也是双向的和全双工的(因为在半双工中不可能实现流水线)。因此,从http/2的角度来看,这里没有任何变化


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

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

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

如果我们将“客户机”和“服务器”作为端点(无论两者之间有多少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协议。

回答得很好。但有一件事是:我不认为WebSoCube是100%个非主动通信,因为它只能由客户端用HTTP升级请求建立。如果建立了连接,我们会进行未经请求的通信,但对于http/2和SSE(一个TCP连接,双方可以随意发送消息)也是如此。@marzelin我们讨论的所有协议都有一个“客户端”建立连接。我不认为连接建立是双向、双工或非请求的定义的一部分,因为某些方必须开始通信。WebSocket通过发送HTTP/1.1请求来建立连接(因此此时还不是WebSocket)。在该请求之后,服务器用HTTP 101进行回复,然后我们进入WebSocket领域,在那里,“客户端”可以是被动的,从不向服务器发送任何内容,只接收来自服务器的未经请求的消息。1/2在任何其他协议中,您都无法建立连接,然后从服务器获取未经请求的消息-客户端必须首先发送请求。2/2是的,我们讨论的所有技术都是客户机-服务器技术。为了完整起见,我想提一提的是,还有一种WebRTC,它是对等的,不需要客户端的明确许可来发送或接收消息。