首先,一些更正。
令牌h2c
引用明文HTTP/2(因此c
在h2c
)。在你的第二個項目符號中,你說大多數網站都使用它,但實際上很少有這樣做,因爲瀏覽器沒有實現它。絕大多數網站使用h2
。
令牌h2
是指經過TLS加密的h2c
或等效的h2c
。
當客戶端和服務器協商發言h2
時,客戶端發送的字節將被加密,並會一路傳輸到服務器。這意味着中介機構沒有機會解密流量(謝謝)。
在這種情況下,HTTP/2規範所指的「跳躍」是位於客戶端和服務器之間的整個網段。
但是,HTTP/2規範需要是通用的,而不必擔心瀏覽器和Web服務器在定義諸如HTTP/2之類的有線協議時如何進行交互。
想象其中客戶端執行的HTTP/2請求使用h2
的情況,並需要調用server2
使用h2c
以完成該請求,這一次。例如,可能是一個前端「代理」,根據某些邏輯將請求轉發到「右側」後端服務器。
在這種情況下,您有2跳:client-server1和server1-server2。
每一跳都應用自己的流量控制。
例如,想象客戶端將大文件上載到服務器。 通常,客戶端流量控制發送窗口很小,比如默認的65535個八位字節。在停止上傳之前,客戶端最多隻能發送65535個八位字節。
這些65535個八比特組是由收到的。現在成爲客戶端以便與server2
進行通信。假設的客戶端在與server2
進行通信時配置了更小的流量控制窗口,例如16384個八比特組。
在這個例子中,檔上載至server2
後16384個八位位組,而且必須設法保持周圍的剩餘八位位組65535-16384等待server2
通知(經由WINDOW_UPDATE幀),其上載的數據已經被消耗掉。
當的客戶端收到從server2
的WINDOW_UPDATE時,它可以發送更多的數據到server2
;還需要決定是否向客戶端發送一個WINDOW_UPDATE消息(因爲其流量控制窗口與客戶端現在有額外的16384個八比特組的空間)或者稍微等一會兒。例如,它可以發送另外的16384個八位字節到server2
,並且只有在從server2
接收到第二個WINDOW_UPDATE時纔可以決定向客戶端發送WINDOW_UPDATE(具有16384 + 16384個八比特組的更新)。
從上面的示例中可以看出,客戶端和之間的流量控制與和server2
之間的流量控制有關但獨立。
您可能還想閱讀this answer,以獲得有關流量控制策略實施的討論。
對不起,這是一個錯字,我知道'h2'比'h2c'多。 – laike9m
很好的答案。 RFC7540或其他RFC中是否存在「中間人」的定義? – laike9m
不是我所知道的,但是爲了處理流量控制,「中介」必須對HTTP/2幀進行解碼和重新編碼。因此,排除了使用'h2'的客戶端和服務器之間的網絡元素(交換機,代理等),因爲它們只是傳遞加密字節,而不是HTTP/2幀。 – sbordet