据我所知,TCP将消息细分为段。那么,为什么在HTTP2上再次多路复用呢?多路复用两次有什么好处?
答案 0 :(得分:4)
TCP未进行多路复用。 TCP只是一个有保证的消息流(即重新请求丢失的数据包,并且在发生这种情况时TCP流基本上暂时被阻止)。
TCP,作为基于数据包的协议,如果更高级别的应用程序协议(例如HTTP)允许发送多个消息,可以用于多路复用连接。遗憾的是HTTP / 1.1不允许这样做:一旦发送HTTP / 1.1消息,在该连接上不能发送其他消息,直到完全返回该消息(忽略支持不当的流水线概念)。这意味着HTTP / 1.1基本上是同步的,如果不使用全带宽而其他HTTP消息排队,则会浪费任何可用于底层TCP连接的额外容量。
为了解决这个问题,可以打开更多的TCP连接,这基本上允许HTTP / 1.1 act 像(有限的)多路复用协议。如果网络带宽被充分利用,那么这些额外的连接将不会增加任何好处 - 事实上有容量,而其他TCP连接没有得到充分利用,这意味着这是有道理的。
因此,HTTP / 2为协议添加了多路复用,允许单个TCP连接用于多个飞行中的HTTP请求。
它通过将基于文本的HTTP / 1.1协议更改为基于数据包的二进制协议来实现。这些可能看起来像TCP数据包,但这并不是真正相关的(就像说TCP类似于IP一样,因为它基于数据包是不相关的)。将消息拆分成数据包实际上是允许多条消息同时处于飞行状态的唯一方法。
HTTP / 2还添加了流的概念,以便数据包可以属于不同的请求 - TCP没有这样的概念 - 这就是真正使HTTP / 2多路复用的原因。
事实上,因为TCP不允许单独的独立流(即多路复用),并且因为它是有保证的,所以这实际上引入了一个新问题,其中单个丢弃的TCP数据包保持全部该连接上的HTTP / 2流,尽管事实上只有一个流应该受到影响,而其他流应该能够继续进行,尽管如此。这甚至可以使HTTP / 2在某些条件下变慢。谷歌正在尝试从TCP迁移到QUIC来解决这个问题。
我在这里的回答中详细介绍了HTTP / 2下多路复用的含义(以及为什么这是一个很好的改进!)What does multiplexing mean in HTTP/2
答案 1 :(得分:0)
TCP不进行多路复用。 TCP段仅意味着(单个)流数据被切割成可以在IP分组中发送的片段。每个TCP段仅用流偏移(序列号)标识,而不是用于识别单独流的任何有用方法。 (我们将忽略极少用的紧急指针。)
因此要进行多路复用,需要在TCP之上放置一些东西。哪个HTTP / 2可以。
答案 2 :(得分:0)
HTTP& HTTP / 2都是应用程序级协议,必须利用像TCP这样的低级协议来实际在Internet上进行通信。互联网协议通常是基于IP的TCP over Ethernet。
看起来像这样:
正如您所见,HTTP位于TCP之上。 TCP下面是IP。互联网的主要协议之一。 IP本身处理切换/多路复用的数据包。我认为你可能会认为TCP是多路复用的,但事实并非如此。可以认为TCP连接就像没有人可以通过的单车道公路隧道。可以说它在每个方向都有一条单行道。这就是TCP连接的样子。一个隧道,你将数据放在一端,然后它以与它进入的顺序相同的方式出现。这就是TCP。你可以看到没有多路复用。但是,TCP确实提供了一种可靠的连接协议,其他协议可以在HTTP之上构建。可靠性对于HTTP至关重要。
HTTP 1.1只是一个请求响应协议。但是如你所知,它不是多路复用的。因此,一次只允许一个未完成的请求,并且必须一次向每个请求发送整个响应。以前,浏览器通过创建多个到服务器的TCP连接(隧道)来解决这个限制,以便发出更多请求。
HTTP 2实际上再次分割数据并允许在一个连接上进行多路复用,因此不需要创建更多连接。这意味着服务器可以开始为多个请求提供服务并多路复用响应,以便浏览器可以同时开始接收图像,页面和其他资源,而不是一次一个。
希望能说清楚。