mar*_*lin 2 duplex bidirectional http2
一些描述 http/2 的文章称赞它是双向和全双工的。
AFAIK 双向意味着通信是双向的,所以双工本质上是双向的,是吗?
双工可以由一个在某些特定点反转的单工流创建(半双工),也可以创建为两个相反的单工流(全双工)。
也许双向是关于如何发起消息交换?在 http/1 中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在 http/2 中,服务器可以发送(推送)一些资源而无需明确要求它。但是我们可以Server-sent events在http/1.1中使用(也就是说,在客户端和服务器上都做了一些配置后,如果它愿意,服务器可以推送消息,但它仍然是通过http/1.1协议)。
当您考虑它时,您可能会注意到 http/1 也是双向和全双工的(因为在半双工中流水线是不可能的)。所以从 http/2 的角度来看这里没有变化。
发生变化的是 http/1 要求响应按照请求的确切顺序到达。http/2 通过流和多路复用提升了这一点。
sbo*_*det 16
双向意味着您可以双向发送数据。
全双工意味着你可以在两个方向上发送数据在同一时间-你可以有两个线程,一个写入数据,一个读取数据,同时执行。
如果我们将“客户端”和“服务器”作为端点(无论两者之间有多少个 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 协议。