在HTTP/2中,请求/响应、帧和TCP数据包之间有什么关系?

5

这里是图片描述

图片来自 https://hpbn.co/http2/#streams-messages-and-frames

为确保我真正理解正在发生的事情,以下是我的理解:

  • TCP数据包可以包含多个帧,它们可以属于不同的流。
  • 请求或响应由属于同一流的一个或多个帧组成。
  • 物理上并没有“流”,它只是一个逻辑概念(每个帧都包含一个流ID)。

我的理解正确吗?


HTTP/2是一种应用层协议,而TCP是一种传输层流媒体协议。TCP数据包与应用层的特定部分之间没有具体关系,即单个TCP数据包中可能存在多个应用层实体、部分实体等。 - Steffen Ullrich
看起来差不多正确。 - Mark Nottingham
帧和流是建立在TCP之上的抽象。考虑到单个浏览器请求是建立在7层抽象之上的:https://en.wikipedia.org/wiki/OSI_model#Description_of_OSI_layers - B Seven
@BSeven 是的,你说得对。 - laike9m
1个回答

5
我认为你所说的一切都是正确的,但我想澄清以下几点:
  • 主要问题在于单个TCP 连接 可能包含来自许多不同HTTP/2流的帧,交错排列。TCP 数据包 与此无关--TCP数据包由TCP协议栈重新组装成TCP流,不应影响您对HTTP/2的理解。
  • 第一个要点之所以重要是它是从HTTP/1迈出的重要一步,因为TCP流会被任何给定的请求/响应对"阻塞",而当前请求的响应必须在其他请求之前发送。这是使HTTP/1中巨大瓶颈解除的多路复用功能。
  • 请求或响应称为消息,是由一个或多个帧组成的。
  • 没有物理HTTP/2 ,就像没有物理TCP流一样-这是一个更高级别的概念/抽象,由相应的层处理,将单个数据包或帧重新组装成流,这使处理变得非常容易。

希望这有所帮助。


我询问TCP数据包的原因是我正在使用WireShark调试http2,而Wireshark中的每个“行”都是一个TCP数据包(我猜?)。我看到每行包含多个帧,这就是我在问的原因。顺便说一句,我不太明白你所说的“TCP数据包由TCP堆栈重新组装成TCP流,并且不应该有任何影响”的意思。 - laike9m
1
@laike9m:每个TCP“数据包”仅包含TCP流的一部分。这些数据包与任何消息类型都没有关系,因为TCP是单个流而不是消息序列。因此,应用层帧可能会被分成多个TCP数据包,单个数据包可能包含多个应用层帧等。从应用层帧到TCP数据包的映射没有定义。 - Steffen Ullrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接