服务器套接字从chrome发送时收到2个http请求,当我从firefox发送时收到一个http请求

Dur*_*rin 28 sockets http

我在Linux下使用C语言编写了一个简单的服务器,它在localhost上侦听端口80.现在,当我从浏览器google chrome向程序发送请求时,它收到2个请求,而当我从firefox发送时只收到一个请求.

我在浏览器中输入的URL是:http://localhost/xyz.html

当我在CHROME中输入URL时输出

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# ./DCMTOL_RUN 

Inside HTTP server Handler

Inside HTTP request Handler 

**Detected request: clientsocket_fd = 6 clientportnumber = 38027**

GET /xyz.html HTTP/1.1

Host: localhost

Connection: keep-alive

Cache-Control: max-age=0

Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10

Accept-Encoding: gzip,deflate,sdch

Accept-Language: en-US,en;q=0.8

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3


Inside HTTP request Handler

**Detected request: clientsocket_fd = 7 clientportnumber = 38029**

^C

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# 
Run Code Online (Sandbox Code Playgroud)

第二个请求不发送任何数据,所以我的代码在读取调用时等待,所以我必须终止它'^ C'.

我在FIREFOX中输入URL时的输出

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# ./DCMTOL_RUN 
Inside HTTP server Handler
Inside HTTP request Handler

**Detected request: clientsocket_fd = 6 clientportnumber = 45567**

GET /xyz.html HTTP/1.1

Host: localhost

User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 115

Connection: keep-alive


^C

root@anirudh-Aspire-5920:/home/anirudh/workspace/DCMTOL# 
Run Code Online (Sandbox Code Playgroud)

问题:当我只输入一次URL时,Chrome浏览器如何发送2个请求(一个为空).如您所见,我检测到2个请求.我尝试在从chrome发送URL的情况下执行netstat,我发现这两个请求都是由浏览器发送的.当我从firefox发送URL时,你可以看到上面只收到1个请求.

这是我从chrome发送请求时net stat的输出

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

tcp        0      0 117.195.110.186:48701   74.125.77.102:80        TIME_WAIT   -

tcp        0      0 117.195.110.186:48700   74.125.77.102:80        ESTABLISHED 5699/google-chrome

tcp        0      0 117.195.110.186:55815   209.85.175.138:80       ESTABLISHED 5699/google-chrome

tcp        0      0 127.0.0.1:80            127.0.0.1:38029         ESTABLISHED -

tcp        0      0 127.0.0.1:38029         127.0.0.1:80            ESTABLISHED 5699/google-chrome

tcp        0      0 127.0.0.1:38027         127.0.0.1:80            ESTABLISHED 5699/google-chrome

tcp        0      0 127.0.0.1:80            127.0.0.1:38027         ESTABLISHED -

tcp        0      0 117.195.110.186:35402   74.125.153.125:5222     ESTABLISHED 4430/pidgin
Run Code Online (Sandbox Code Playgroud)

提前致谢 :)

Mat*_*att 50

我的节点服务器遇到了类似的问题.这是由于Chrome中存在以下错误.总之,Chrome会根据每个请求发送一个favicon请求.因为,很可能,你没有发回一个favicon,它会在每个合法请求后请求一个.

Firefox和大多数其他浏览器在首次连接时也会发送一个favicon请求,但是缓存结果,即如果第一次没有返回favicon,他们就不会继续尝试 - 这就是为什么你只是看到来自Firefox的单个请求.不幸的是,Chrome有点过于持久以及它的favicon请求.

  • 我发现:**第二个套接字不适用于favicon**,在该套接字中不会发送任何内容,如davidlt的回答中所述. (4认同)
  • 对我来说,提供favicon并没有帮助,我有一个空请求的问题,因为它在超时时间段(10s)内阻止了流的读取。 (2认同)
  • 我发现完全一样。没有 HTTP 标头。尝试读取甚至单个字符块,这意味着套接字没有传入数据。 (2认同)
  • 可能值得在此处查看已接受的答案。我当时的调查表明它与网站图标有关,但我要么错了,要么自第一次回答以来 Chrome 的行为发生了变化——两者都是完全可能的。要么是这样,要么有更多的东西比眼睛看到的要多。 (2认同)
  • 我在Chrome浏览器中遇到了相同的问题(*版本* 52.0.2743.116,32位)。因此,如果是favicon请求,则服务器应至少获取请求行`GET /favicon.ico HTTP / 1.1`以及可选的标头。但是它确实有任何作用。客户端没有**通过此连接发送的数据**。 (2认同)

dav*_*dlt 17

我目前正在Mono/.NET 4.0上编写小型异步Web服务器并注意到了同样的事情.Chrome会打开两个 TCP连接,但只有一个用于通信.使用该套接字没有数据发送.即使您停止从浏览器加载网页,Chrome仍然会保持连接活动很长一段时间.

我必须同意@RomanK,因为它可能是为了优化或者它是一个错误,但它不适用于favicon,因为没有数据传输抛出该连接.

  • 我最近偶然发现了这种行为.显然,Chrome会打开一个"推测性套接字",以便在需要新请求时能够立即发出请求.具有讽刺意味的是,在呈现页面时,似乎只会降低Chrome的速度. (5认同)
  • 我弄清楚为什么Chrome会这样做.第二个插槽由Chrome保持打开状态,以满足未来的请求,例如下载页面的图像和其他二进制文件.一旦浏览器确实需要来自此服务器的内容,Chrome就会在已打开的套接字上发送其请求标头.这是偷偷摸摸的,因为它使Chrome优先于其他浏览器.这就像让您的孩子在购物时在收银台占据一席之地.也就是说,它可能会加快页面渲染速度. (2认同)