簡體   English   中英

關於HTTP / 2 RFC實現的流控制問題

[英]Flow Control questions about HTTP/2 RFC Implementation

我正在構建一個http / 2客戶端,我對rfc以及如何處理實現有疑問,特別是在流量控制方面。

我知道流量控制使用基於信用的窗口大小系統,但我對如何處理耗盡窗口的情況有點不確定。

  1. 我是否只是無限期地阻塞,直到WINDOW_UPDATE幀釋放了什么? 或者合理的超時是什么?

  2. 當窗口耗盡時,我暫停發送所有幀嗎? RFC規定流中幀的順序是重要的,特別是對於報頭和數據幀,但它沒有明確聲明在窗口耗盡時應暫停所有幀。 這對我來說有點模棱兩可,因為數據幀是唯一可以計算窗口大小的數據幀。 那么我應該阻止發送所有幀或只是標題/數據? 這個答案對於連接流控制上下文與流流控制上下文有什么不同?

連接中的所有數據幀都有一個流控制窗口,然后每個流都有一個流控制窗口。

1.-如果連接窗口耗盡,則暫停發送任何流的DATA幀,直到獲得WINDOWS_UPDATE。 您可以實現超時。 如果超時到期,您唯一的補救措施是關閉連接並重試。

2.-如果流連接窗口耗盡,則僅暫停該流。

在所有情況下,您只暫停DATA幀。 其他類型的幀不受流量控制的影響。

如果您正在實現客戶端而不是服務器,則您更關心自己發送WINDOW_UPDATE幀。 除非你做了很多POST和PUT,即將數據發送到服務器。

根據我作為HTTP / 2服務器開發人員的經驗,我發現在我稱之為“train”的組中管理HTTP / 2幀非常方便。 對於除HEADERS,PUSH_PROMISE和CONTINUATION之外的所有幀,列車僅由幀組成。 對於HEADERS和PUSH_PROMISE,列車由該幀和任何后續的CONTINUATION幀組成。 然后將列車置於具有以下級別的優先級隊列中(首先具有最高優先級):

  1. PING幀:您希望對等體准確地確定延遲,因此您可以在收到這些幀時盡快處理這些幀,並盡快發送答案。
  2. SETTINGS,WINDOW_UPDATE,RST_STREAM,GO_AWAY
  3. PUSH_PROMISE和HEADERS列車。 HTTP / 2規范允許兩種(實際上是三種)HEADERS幀類型:作為HTTP頭部發送的幀和預告片。 我在這里談論的是第一個。
  4. 數據幀。 如果要實現優先級,則可能需要在此處進一步確定框架的優先級。

每當通道可用於發送時,您將在優先級隊列中發送優先級最高的列車。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM