在HTTP/2中,內容總是被「分塊」,因爲它在DATA幀中被髮送,即,包含塊長度的字節塊以及如果幀是最後一個幀的信號結束標誌。
在HTTP/2到HTTP/1.1代理中,代理有幾個選擇。
一個非常簡單的情況是重新映射每個HTTP/2收到的數據幀並將其作爲HTTP/1.1塊發送出去。 因此,代理將不得不將Transfer-Encoding: chunked
標頭添加到通信的HTTP/1.1端。 類似地,它可以將每個內容讀取重新映射到數據幀(而不是整個塊的等待/緩衝區,如果它是大的話)。
另一種情況是緩衝一些接收到的數據幀,希望其中一個具有流結束標誌設置。 如果發生這種情況,則整個內容長度是已知的,並且代理可以添加頭文件並一次發送整個內容。
同樣在前面的情況下,當緩衝區溢出時,代理服務器可以添加Transfer-Encoding: chunked
標頭併發送一個塊大小爲緩衝區的大小(而不是像第一種情況那樣的數據幀的大小)。
當代理接收到最後一個數據幀時,它將剩餘的字節組塊化,然後發送終端塊(用於表示塊的結尾的零長度塊)。在另一個方向上,HTTP/1.1到HTTP/2,當代理接收到分塊的內容時,它可以簡單地丟棄頭,從接收的塊中取出一個DATA幀,併發送該幀。 最終,它將收到終端塊(用於表示塊結尾的零長度塊),並將其轉換爲長度爲零的DATA幀,並設置流結束標誌。
當然,如果代理執行一些緩衝或其他優化,DATA幀大小可能不完全等於塊大小。
由於HTTP/2接收/發送包含流結束標誌的數據幀,代理可以很容易地轉換到/來自HTTP/1.1,將流結束數據幀映射到終端塊和終端塊到流結束DATA幀。
我發現有人也問這個問題:https://lists.w3.org/Archives/Public/ietf-http-wg/2015JanMar/0144.html#start144 – alpha