XMLHttpRequest 中的 TCP 握手究竟何时发生?

When exactly does the TCP handshake occur in a XMLHttpRequest?

XMLHttpRequest 接口同时提供了 open()send() 方法。

在下面的示例代码中:

var xhr = new XMLHttpRequest();
xhr.open('GET', '/server', true);

xhr.onload = function () {
  // Request finished. Do processing here.
};

xhr.send('string');

TCP 握手是在调用 send() 时发生,还是在 open() 时发生?

tcpdump 的一些简短测试验证了评论中的怀疑。调用 open() 时根本不会进行任何网络调用。调用 send() 时传输所有网络信息。

此外,也不能保证send()执行握手。 XMLHttpRequests 有时会重用以前请求的持久连接,因此不需要新的握手。

只有低于 1.1 的 HTTP 版本才与请求的生命周期及其底层连接直接相关。

自 HTTP 1.1 起,HTTP 请求的生命周期与其基础连接的生命周期无关。许多请求可以通过单个连接进行流水线处理。

XMLHttpRequest.open是一种方便用户的抽象,但是under-the-hood,如果浏览器已经有连接到主机的可用套接字,它们可以被重用,这意味着TCP握手发生了前一段时间,独立于通过连接传递的第一个请求之外的所有请求。