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

5

我正在从头开始构建一个网页服务器,这是为了娱乐,但我注意到Chrome浏览器有一些奇怪的行为。当我向/发送GET请求时,来自Chrome的请求看起来像这样:

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个回答

8

HTTP/1.1 浏览器往往会打开多个TCP连接。如果您的服务器一次只能处理一个连接,那么可能会陷入死锁。当每个连接准备好请求时,您应该使用线程或非阻塞IO(select)来处理每个连接。

Chrome可能会打开另一个套接字,以便在第一个套接字关闭时它已经准备好。但我不确定。HTTP/1.1 没有取消请求/响应的方法,除了关闭套接字。服务器完成响应后也可能发送Connection: close,因此浏览器正在为未来的请求做准备。


4
在先前的连接完成之前,Chrone开启另一个连接似乎是很合理的,以提高效率,但我的服务器在每个请求中都包含“Connection: close”。也许你是对的,这只是Chrome为下一个可能的请求做准备,但浪费服务器的时间只是为了让Chrome看起来更快并不太好。 - Derek 朕會功夫

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