为什么 Chrome 打开连接但不发送任何内容

问题描述 投票:0回答:2

我正在从头开始构建一个 Web 服务器以获取乐趣,并且我注意到 Chrome 的一些奇怪行为。我从 Chrome 收到的对

/
的 GET 请求的请求如下所示:

GET / HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

没什么特别的,但它也向我的服务器发出另一个请求,但它不发送任何内容,这导致我的服务器永远等待传入消息。

Safari 中未发现此行为。我已将服务器设置为对每个请求响应 403,但持久连接仍然存在。此连接的目的是什么以及我应该如何处理它?我是否遗漏了 HTTP 协议中的某些内容?

google-chrome http tcp
2个回答
8
投票

HTTP/1.1 浏览器倾向于打开多个 TCP 连接。如果您的服务器一次只能对一个连接进行操作,那么您可能会陷入死锁。当每个连接准备好请求时,您应该使用线程或非阻塞 IO (

select
) 来处理每个连接。

Chrome 可能会打开一个额外的套接字,以便在第一个套接字关闭时它已准备好,但我不确定。 HTTP/1.1 没有办法取消请求/响应,除了关闭套接字之外,服务器也有可能在完成响应后发送

Connection: close
,因此浏览器正在为将来的请求做好准备。


0
投票

不是答案,而是要重现的更多细节;-同样的问题,即使在第一个连接关闭后也没有 GET 请求。

设置

  • Ubuntu 22.04 LTS 上的简单但线程化的 C++ http 服务器,配置为在接受来自浏览器的 TCP 连接后等待 1 秒以接收 GET 请求。
  • Win 10 上的 Chrome 版本 121.0.6167.185
  • 通过有线 1G 以太网连接在同一交换机上的机器

Wireshark Capture

观察结果

  • 在Chrome中,使用IP地址加载页面:http://192.168.1.85/angle?angle=1301
  • 服务器接受请求并将套接字交给新线程。 Chrome 端口是 63169。
  • 服务器新线程读取 GET 请求发送响应。
  • 从 Wireshark 捕获中,您可以看到端口 63169 上的请求已完成,然后端口 63170 和 63171 上出现另一个 TCP SYN
  • 这些是服务器的 SYN、ACK(接受并移交给新线程),但线程在 1 秒后超时并关闭连接,如 FIN、ACK 所示 --(我尝试过 10 秒超时 - 没有区别)
  • Chrome开发者工具->网络显示1个请求,总时间为6.87ms
  • 在Windows机器上我使用了netstat -ano 1 |查找“10.42.1.85:80”以查找源端口为 63170 和 63171 的原始进程的 PID,即 15216
  • 使用tasklist /fi "pid eq 15216" 我发现该进程确实是Chrome

需要明确的是,这种行为并不一致,有时没有额外的请求,通常有一个,有时有两个。

所以问题依然存在;这个连接是做什么用的?我们该如何应对?

© www.soinside.com 2019 - 2024. All rights reserved.