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

时间:2017-11-16 18:14:56

标签: google-chrome http tcp

我从头开始构建一个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协议中的内容?

1 个答案:

答案 0 :(得分:2)

HTTP / 1.1浏览器倾向于打开多个TCP连接。如果您的服务器一次只能处理一个连接,则可能最终陷入僵局。您应该使用线程或非阻塞IO(select)来处理每个连接请求。

Chrome可能正在打开一个额外的插座,以便在第一个插座关闭时准备就绪,但我不确定。除了关闭套接字之外,HTTP / 1.1无法取消请求/响应,并且服务器也可能在完成响应后发送Connection: close,因此浏览器正在为将来的请求做好准备。 / p>