【问题标题】:When exactly does the TCP handshake occur in a XMLHttpRequest?XMLHttpRequest 中的 TCP 握手究竟是什么时候发生的?
【发布时间】:2019-10-17 08:44:28
【问题描述】:

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

在以下示例代码中:

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

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

xhr.send('string');

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

【问题讨论】:

  • 你不能在同一个 XHR 上多次调用send()
  • @Barmar 谢谢,问题已更新以反映这一点
  • 为什么不直接运行数据包捕获来查看它何时发生?
  • 请注意,在您调用 send 之前,如果没有服务器正在运行,您不会收到“连接被拒绝”错误。这强烈表明这是握手发生的时候。
  • 查看协议规范后,network task 在请求正文完全解析之前不会排队。这意味着send() 是答案,因为在那之前没有正文。

标签: javascript tcp network-programming xmlhttprequest handshake


【解决方案1】:

tcpdump 的一些简短测试验证了 cmets 中的可疑情况。调用open() 时根本不进行网络调用。当调用send() 时,所有网络信息都会被传输。

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

【讨论】:

    【解决方案2】:

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

    自 HTTP 1.1 以来,HTTP 请求的生命周期独立于其底层连接的生命周期。许多请求可以通过单个连接进行管道传输。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-01
      • 2021-02-07
      • 2014-03-22
      • 2011-08-19
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多