Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP/2.0多路复用如何与TCP一起工作?_Tcp_Http2_Packet_Frames_Multiplexing - Fatal编程技术网

HTTP/2.0多路复用如何与TCP一起工作?

HTTP/2.0多路复用如何与TCP一起工作?,tcp,http2,packet,frames,multiplexing,Tcp,Http2,Packet,Frames,Multiplexing,我不是一个专业的网络工程师,所以我希望我的问题不要显得模糊或幼稚 HTTP/2.0中的多路复用似乎将单个TCP连接同时用于多个/不同的请求,以避免线路阻塞问题。我想知道在数据重组的意义上,它是如何工作的/与底层TCP连接重叠的 TCP还确保在接收端接收到的数据D被重建,即使构成D的数据包被无序接收或丢失,也会在接收端重新建立D,然后将其移交给应用程序 我的问题是:HTTP/2.0中的帧概念如何能够通过TCP数据包重组在接收端组成一个完整的消息?哪一个先发生?或者,帧和数据包之间存在什么样的一对一

我不是一个专业的网络工程师,所以我希望我的问题不要显得模糊或幼稚

HTTP/2.0中的多路复用似乎将单个TCP连接同时用于多个/不同的请求,以避免线路阻塞问题。我想知道在数据重组的意义上,它是如何工作的/与底层TCP连接重叠的

TCP还确保在接收端接收到的数据D被重建,即使构成D的数据包被无序接收或丢失,也会在接收端重新建立D,然后将其移交给应用程序


我的问题是:HTTP/2.0中的帧概念如何能够通过TCP数据包重组在接收端组成一个完整的消息?哪一个先发生?或者,帧和数据包之间存在什么样的一对一、一对多等映射。?简而言之,它们是如何协同工作的?

一系列属于同一流或不同流的HTTP/2帧并不重要,它只是一系列字节

TCP不解释这些字节。 TCP发送方只需将字节打包到TCP帧中并发送它们。 TCP接收器接收TCP帧并重新组合恰好形成一系列HTTP/2帧的字节

TCP和HTTP/2并不能真正协同工作,因为TCP不知道它在传输什么——它只是一系列不透明的字节

因此,TCP帧和HTTP/2帧之间没有映射


考虑到在大多数情况下,HTTP/2是加密的,因此TCP传输的不透明字节恰好是TLS帧字节,可能是碎片-即,一个TCP帧可能包含1.5个TLS帧,其余的TLS帧字节位于后续TCP帧中;每个TLS帧包含不透明字节,这些字节恰好是HTTP/2帧字节,也可能是碎片字节。

HTTP/2数据包作为一个或多个TCP数据包发送。与TCP数据包最终作为IP数据包或数据报发送的方式相同

这确实意味着,即使HTTP/2在应用层HTTP上有多路复用,但在传输层TCP上也没有真正独立的流。HTTP/2的一个问题是,我们刚刚将行首HOL阻塞问题从HTTP层转移到了TCP层

让我们看一个示例:一个示例网页需要下载10个图像才能显示

在HTTP/1.1下,浏览器将打开一个TCP连接,发出第一个请求,然后被卡住,因为它无法使用该TCP连接发出后续请求。尽管TCP连接在得到响应之前什么也不做,但在TCP层没有任何东西可以阻止它。这纯粹是一个HTTP限制,主要是因为HTTP/1是基于文本的,所以不可能混合请求位。HTTP/1.1确实有HTTP管道的概念,允许发送后续请求,但它们仍然必须按顺序返回。而且支持率很低。相反,作为一种解决方法,浏览器打开了多个连接(通常为6个),但这有许多缺点,即创建速度太慢,无法跟上速度,而且不可能在它们之间划分优先级

HTTP/2允许在同一TCP连接上发送这些后续请求,然后以任何顺序接收所有请求的位,并将它们组合在一起进行处理。因此,请求的第一个图像实际上可能是最后一个接收到的图像。这对于慢速连接尤其有用,因为在慢速连接中,发送延迟占总时间的很大一部分,或者服务器在处理某些请求时可能需要较长的时间(与其他请求相比),例如,如果必须从磁盘提取第一个映像,但第二个映像已在缓存中可用,那么为什么不使用连接发送第二个图像呢。这就是为什么HTTP/2通常比HTTP/1.1更快、更好的原因,因为它更好地使用TCP连接,而且不会造成浪费

但是,由于TCP是一种有保证的顺序协议,它不知道更高级别的应用程序HTTP使用它做什么,因此如果TCP数据包丢失,这确实会给HTTP/2带来一些问题

假设这10张图片都是按顺序排列的。但是来自第一个映像的数据包丢失了。理论上,如果HTTP/2确实由独立的流组成,浏览器可以显示最后9个图像,然后重新请求丢失的TCP数据包,然后显示第一个图像。相反,所有10个图像都被挂起,等待丢失的TCP数据包重新发送,然后TCP让上层HTTP知道收到了哪些消息

因此,在有损环境中,HTTP/2的性能比HTTP/1.1的6个连接要差得多

这在创建HTTP/2时是众所周知的,但在大多数情况下,HTTP/2速度更快,所以他们无论如何都会发布它,直到他们能够解决这个问题为止

HTTP/3试图解决这个剩余的问题。它通过移开f来实现这一点
从TCP到一种称为QUIC的新协议,QUIC采用内置多路复用的思想,与TCP不同。QUIC是建立在UDP之上的,而不是试图创建一个全新的低层协议,因为它得到了很好的支持。但是QUIC非常复杂,需要一段时间才能到达这里,这就是为什么他们没有支持HTTP/2,而是一步一步地发布它们的内容。

所以每个层负责跟踪每个请求自己的TCP/HTTP帧,以便能够在接收端重新组装它们?正确,每一层打包它的帧,下层只是将上层打包的帧解释为一个不透明的字节流。我认为10个请求彼此完全独立,这意味着每个请求都有自己的子tcp连接,tcp可以逐个识别它们。但显然,这将伴随HTTP/3.Correct而来。它们在HTTP层是相互独立的,但在TCP层不是。虽然这并不是100%正确,因为服务器可以跨流排列优先级以决定发送数据包的顺序,但这是依赖关系的好方面。默认情况下,HTTP/2连接保持活动状态。规范在这方面有点含糊,说HTTP/2连接是持久的。为了获得最佳性能,在确定不需要与服务器进行进一步通信之前(例如,当用户离开特定网页或服务器关闭连接时),客户机不会关闭连接。只要接收到TCP数据包,TCP堆栈就可以将它们释放到应用程序中。在这种情况下,浏览器会将它们视为字节流。因此,浏览器将流视为独立的,即使它们不是100%独立的。在接收完整文件之前,可以处理许多资源,例如HTML、渐进式JPEG。这在HTTP/1和HTTP/2下是正确的。其他资源(例如JavaScript、CSS、非渐进式JPEG)不能以这种方式进行处理,浏览器只是读取并缓冲字节,直到它拥有完整的文件。我可以推荐一本关于此主题的好书:-