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()
执行握手。 XMLHttpRequest
s 有时会重用以前请求的持久连接,因此不需要新的握手。
只有低于 1.1 的 HTTP 版本才与请求的生命周期及其底层连接直接相关。
自 HTTP 1.1 起,HTTP 请求的生命周期与其基础连接的生命周期无关。许多请求可以通过单个连接进行流水线处理。
XMLHttpRequest.open
是一种方便用户的抽象,但是under-the-hood,如果浏览器已经有连接到主机的可用套接字,它们可以被重用,这意味着TCP握手发生了前一段时间,独立于通过连接传递的第一个请求之外的所有请求。
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()
执行握手。 XMLHttpRequest
s 有时会重用以前请求的持久连接,因此不需要新的握手。
只有低于 1.1 的 HTTP 版本才与请求的生命周期及其底层连接直接相关。
自 HTTP 1.1 起,HTTP 请求的生命周期与其基础连接的生命周期无关。许多请求可以通过单个连接进行流水线处理。
XMLHttpRequest.open
是一种方便用户的抽象,但是under-the-hood,如果浏览器已经有连接到主机的可用套接字,它们可以被重用,这意味着TCP握手发生了前一段时间,独立于通过连接传递的第一个请求之外的所有请求。