繁体   English   中英

关于http / 2的文章中关于双向和全双工的困惑

[英]confusion regarding bidirectional and full-duplex in articles about http/2

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

AFAIK双向意味着双向通信,因此双工本质上是双向的,是吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM