HTTP/2 HEADERS和DATA帧

csn*_*ewb 4 http http2

我正在尝试详细了解HTTP/2.我读了这篇关于流,消息和框架的文章:https://hpbn.co/http2/#streams-messages-and-frames.我不知道我的概念是否正确.

我得出以下结论:

  • 消息是HEADER帧和一个或多个DATA帧的组合.
  • DATA帧只能与HEADERS帧一起发送,因为我没有看到任何显示DATA帧流ID的指标(RFC 7540,6.1)
    • 如果是这样,则只能在消息中发送数据帧
  • Stream可以分块为多个Frame,而Stream可以通过Stream ID与Stream相关联

此外:规范中如何表示消息?

sbo*_*det 5

你有一些错误的东西.

消息是一个或两者的组合中HEADER的帧(携带HTTP头),零个或多个数据帧和一个可选的终端HEADER帧(携带HTTP拖车).您可以查看RFC 7540本节中的示例.100 Continue响应有一个特殊情况,可以从两个HEADERS而不是一个开始.在下文中我们可以忽略这种情况.

DATA确实有一个流ID,因为所有帧共享中定义的帧报头RFC 7540的这个部分.6.1节中描述的仅是DATA框架的主体.

消息是HTTP/2流的一半.消息表示HTTP请求或HTTP响应.

HTTP/2流是请求消息和响应消息的组合.请注意,这不应与flag_end_stream任何一个对等体发送给该特定流的最后一帧的信号相混淆.

GET然后,浏览器执行的典型请求将具有(假设流ID为13):

  • 一个HEADERS帧与ID = 13,flag_end_headers=trueflag_end_stream=true(一个GET请求通常具有不体)

对该GET请求的典型响应将具有:

  • HEADERS帧ID = 13和flag_end_headers=true
  • 一个或多个DATA帧,ID = 13; 最后一DATA帧将有flag_end_stream=true.

注意,由于多路复用,帧可以交错; 这意味着,如果您有两个并发响应(例如,对于流13和流15),您可以使用以下序列:

HEADERS(13) HEADERS(15) DATA(15) DATA(13) DATA(13] DATA(15) DATA(15]

括号]表示它是流中的最后一帧.