簡體   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