javascript - 对在 HTTP1 和 HTTP2 中发送请求感到困惑

标签 javascript html http http2

我了解到,在 HTTP1.1 下,每个主机名(来源?)的默认同时持续连接的最大数量将是 6,至少对于 chrome。我不是在询问限制的确切数量,因为我知道它因浏览器而异。我更好奇我们什么时候会为新请求打开一个新连接——浏览器是否会以某种方式重用相同的 TCP 连接,或者它总是启动一个新的 TCP 连接,除非它没有达到并发请求的限制?
假设我们使用的是 HTTP1.1,我们有 Connection: Keep-Alive如果在 html 中我们有

<script src="https://foo/foo1.js"></script>
<script src="https://foo/foo2.js"></script>
<script src="https://foo/foo3.js"></script>
<script src="https://foo/foo4.js"></script>
<script src="https://foo/foo5.js"></script>
<script src="https://foo/foo6.js"></script>
<script src="https://foo/foo7.js"></script>
每个脚本都会导致建立一个新的 TCP 连接,还是所有后续请求都将重用第一个脚本选项卡建立的第一个 TCP 连接?如果这些脚本中的每一个都导致建立一个新的 TCP 连接,鉴于浏览器对并发请求的限制为 6,第 7 个请求是否必须等到第 6 个请求完成才能建立连接?
上面的例子是关于从 HTML 标签发起请求的。使用 JavaScript 进行的 api 调用呢?让我们在我们的javascript中
const result1 = apiCall1()
const result2 = apiCall2()
const result3 = apiCall3()
const result4 = apiCall4()
const result5 = apiCall5()
const result6 = apiCall6()
const result7 = apiCall7()
并假设这些 API 调用命中的端点都是 api.foo.com/v1/tasks ,我的问题再次是:每个 api 调用会导致建立一个新的 TCP 连接,还是所有后续请求将重用第一个 api 调用建立的第一个 TCP 连接?如果这些 api 调用中的每一个都导致建立一个新的 TCP 连接,鉴于浏览器的并发请求限制为 6,第 7 个请求是否必须等到第 6 个请求完成才能建立连接?
我的最后一个问题是,与 http1.1 相比,http2 是否允许通过一个 TCP 连接同时发送多个请求来解决这个问题?

最佳答案

will each one of the scripts result in a new TCP connection established or all the subsequent requests will reuse the first TCP connection established by the first script tab?


是的,它会一个一个地下载它们,并开始打开更多的 TCP 连接来做到这一点,最多 6 个。第 7 个请求必须等待其中一个连接释放,然后才能下载。
但现实情况是,第一个请求可能在后来的 TCP 连接打开时已经完成,因此它可能还没有完全达到 6 个限制,只有 6 个或 7 个请求。

What about api calls made from JavaScript? Let's in our javascript


完全相同的事情。每个来源限制为 6 个。尽管需要注意的一件事是某些没有凭据发送的 CORS 请求实际上被视为另一个来源(即使它是相同的实际来源),因此会获得另外 6 个连接。

My last question is, compared to http1.1, does http2 address this problem by allowing sending many requests at the same time over one single TCP connection?


基本上是的。由于 TCP 的工作方式,不完全同时,但尽可能接近。在这里查看我的答案:What does multiplexing mean in HTTP/2

关于javascript - 对在 HTTP1 和 HTTP2 中发送请求感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70238247/

相关文章:

javascript - 多个纹理重叠 webGL

javascript - 三.js 中 Canvas 上的 IP 摄像机流

php - 选中时从表中插入多个数组项

javascript - 需要在没有 jQuery UI 的情况下弹出图标/按钮

javascript - 当文本框留空时,要求不能在 HTML 中的表单内工作

html - 将 label 标记用于具有多行表格单元格的表格中的多行

javascript - 单击按钮时的 jQuery 正斜杠

android - 从字节流在 Android 中播放视频

node.js - Node Express - Http post 返回一个文件

java - HttpURLConnection 读取响应内容时出现 403 错误