HTTP长轮询保持活动连接和握手

3
我正在进行一项测试,比较HTTP长轮询和Websockets对我的iPhone电池性能的影响。基本上我有一个Node.js和express服务器,每0.5秒或10秒向iPhone发送随机字符串。我在Chrome中检查了消息,可以看到保持活动头部存在。我知道自从HTTP/1.1以来,保持活动是一个默认功能。据我所知,TCP连接将保持开放状态,并可用于管线化,当我每0.5秒从服务器发送ping时,这肯定是情况。但当我每10秒发送一次时,在此期间连接是否会关闭呢?
  1. 如何知道连接打开的时间?这似乎是做测试时必须考虑的关键部分。

  2. 当TCP连接处于打开状态时,HTTP握手仍然会进行吗?

1个回答

6
据我所知,在HTTP 1中,如果客户端没有先发送请求,服务器将无法向客户端发送响应。这可能与您的问题不相关,但请耐心等待。 Connection: keep-alive头告诉客户端它可以重用连接,而不是必须这样做。客户端可以随时决定关闭连接,这取决于客户端库的实现,您无法保证其行为。
唯一强制客户端不关闭连接的方法是不完成响应。唯一的方法是发送一个带有Transfer-Encoding: chunked的响应,并且永远不发送最终块(这会有一些严重的缺陷,比如客户端的缓冲区溢出...)。
因此,针对您的两个问题:
1.您不能,这种低级别的详细信息对客户端来说完全是隐藏的(出于良好的原因)。
2.没有HTTP握手,只有TCP握手,当客户端套接字连接到服务器套接字时进行握手。在TCP连接之后,进行TLS握手,在任何请求之前进行。一旦连接打开,HTTP请求由客户端发送,服务器则响应资源。

谢谢您的回应,但是我该如何确定长轮询机制是否利用了开放的TCP连接?我需要知道这一点,因为我相信这对性能有很大的影响。这仅取决于我在服务器和客户端上实现长轮询的方式吗? - JuliusvM
我发现在Node中创建的HTTP服务器的标准超时时间为2分钟。我猜这意味着我的长轮询请求将使用在第一个请求期间打开的TCP连接。 - JuliusvM
是的,这取决于您如何实现长轮询请求。理论上,一个开放的空闲连接对服务器应该有最小的影响。Node使用libUV,它内部使用epoll/k-queue轻松处理10K+并发连接。 - sitifensys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接