一些描述http / 2的文章称赞它是双向的还是全双工的。
AFAIK双向意味着双向通信,因此双工本质上是双向的,是吗?
双工可以由一个在某些特定点反转的单工流(半双工)创建,也可以作为两个相对的单工流(全双工)创建。
也许双向有关如何发起消息交换?在http / 1中,只有客户端可以通过向服务器发送请求来发起初始化,服务器在该服务器中返回响应。在http / 2中,服务器可以发送(推送)某些资源,而无需明确要求。但是我们可以在http / 1.1中使用Server-sent events
(即服务器可以在客户端和服务器上都进行一些配置后,如果需要的话可以推送消息,但是仍然使用http / 1.1协议)。>
考虑这一点时,您可能会注意到http / 1也是双向和全双工的(因为在半双工中无法进行流水线化)。因此,从http / 2的角度来看,这里没有任何变化。
已更改的是,http / 1要求响应以准确的顺序到达。 http / 2通过流和多路复用提升了这一点。
答案 0 :(得分: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可以将资源“推”到客户端,但只能在先前请求的上下文中。 / p>
例如,一个HTTP / 2客户端与服务器建立了连接,但随后它不发送任何请求。在这种情况下,服务器将无法向客户端推送任何内容(甚至没有欢迎页面),因为它需要事先请求。
这就是为什么HTTP / 2不能完全替代WebSocket协议的原因,WebSocket协议是唯一可用于服务器与客户端之间完全未经请求的通信的Web协议。