HTTP-Long 投票 keep-alive 和握手

HTTP-Long Polling keep-alive and handshakes

我正在做一个测试,检查与 Websockets 相比,HTTP-long 轮询对我 iPhone 电池性能的影响程度。基本上我所拥有的是一个 Node.js 和 express 服务器,每 0.5 或 10 秒向 iPhone 发送一个随机字符串。我检查了 Chrome 中的消息,我可以看到 keep-alive header 存在。我知道 keep-alive 是自 HTTP/1.1 以来的默认功能。据我了解,TCP-connection 将保持打开状态并可用于流水线操作,当我每 0.5 秒从服务器发送一次 ping 时,情况确实如此。但是当我每10秒发送一次时,连接会在这段时间内关闭吗?

  1. 我如何知道连接打开了多长时间?这似乎是进行测试时要牢记的关键部分。

  2. TCP-connection打开后HTTP-handshake还会制作吗?

据我所知,在 HTTP 1 中,如果客户端没有先发送请求,服务器无法将响应发送回客户端。这听起来可能与您的问题无关,但请耐心等待。

Connection: keep-alive header 告诉客户端如果他想 can 重用连接,而不是 must。客户端可以随时决定关闭它,这完全取决于客户端库的实现,你没有任何保证。

强制客户端不关闭连接的唯一方法是不完成响应。做到这一点的唯一方法是发送带有 Transfer-Encoding: chunked 的响应,并且永远不要发送最后一个块(这有一些严重的警告,比如客户端缓冲区溢出......)。

所以回答你的 2 点:

  1. 你不能,这个 low-level 细节对客户完全隐藏(有充分的理由)。
  2. 没有 HTTP 握手,有一个 TCP 握手,这是在客户端套接字连接到服务器套接字时进行的。 TLS 握手是在 TCP 连接之后和发出任何请求之前进行的。连接打开后,客户端发送 http 请求,服务器响应资源。