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

Joj*_*oji 6 html javascript http http2

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

假设我们正在使用 HTTP1.1 并且我们Connection: Keep-Alive 在 html 中有 if

<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>
Run Code Online (Sandbox Code Playgroud)

每个脚本都会导致建立一个新的 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()
Run Code Online (Sandbox Code Playgroud)

假设这些 API 调用所命中的端点是 all api.foo.com/v1/tasks,我的问题又是:每个 api 调用都会导致建立一个新的 TCP 连接,还是所有后续请求将重用第一个 api 调用建立的第一个 TCP 连接?如果这些 api 调用中的每一个都会建立一个新的 TCP 连接,考虑到浏览器的并发请求限制为 6,第 7 个请求是否必须等到第 6 个请求完成才能建立连接?

我的最后一个问题是,与http1.1相比,http2是否通过允许通过一个TCP连接同时发送多个请求来解决这个问题?

Bar*_*ard 4

\n

每个脚本都会导致建立一个新的 TCP 连接,还是所有后续请求都将重用第一个脚本选项卡建立的第一个 TCP 连接?

\n
\n

是的,它会一一下载它们,并开始打开更多 TCP 连接来执行此操作,最多 6 个。第 7 个请求必须等待其中一个连接释放才能下载。

\n

但实际情况是,第一个请求可能会在稍后打开 TCP 连接时完成,因此可能不会完全达到仅 6 或 7 个请求的 6 个限制。

\n
\n

从 JavaScript 进行的 api 调用怎么样?让我们在 javascript 中

\n
\n

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

\n
\n

我的最后一个问题是,与http1.1相比,http2是否通过允许通过一个TCP连接同时发送多个请求来解决这个问题?

\n
\n

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

\n