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

时间:2011-01-21 17:33:34

标签: http sockets

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

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

我在CHROME中输入网址时的输出

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# 

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

我在FIREFOX中输入网址时的输出

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# 

问题:当我只输入一次网址时,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

提前感谢:)

7 个答案:

答案 0 :(得分:50)

我的节点服务器遇到了类似的问题。这是由Chrome中的following bug引起的。总之,Chrome会在每次请求时发送 favicon 请求。因为,很可能,你没有发回一个favicon,它会在每个合法请求之后请求一个。

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

答案 1 :(得分:17)

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

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

答案 2 :(得分:1)

您可以发布服务器的来源吗?我的猜测是,Chrome只是针对您的服务器打开一个套接字,以优化对同一页面的未来请求,但不会发送任何命令。

答案 3 :(得分:0)

它不会在秒套接字中发送任何数据。我们的Nginx网络服务器日志填满了400个错误,因为在将任何数据/ actual_HTTP_request发送到服务器之前,第二个连接已关闭。 打开第一个连接,立即打开第二个连接,然后使用第一个连接,等待第二个连接死亡。

这是关于第二个连接的非详细转储

No.     Time        Source                Destination           Protocol Length Info
20227 38.688849   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      66     1758 > 80     [SYN] Seq=0 Win=65535 Len=0 MSS=1440 WS=2 SACK_PERM=1
20228 38.688870   80.XX.YYY.186         89.ZZZ.TTT.208        TCP      66     80 > 1758 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=128
20256 38.752121   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      60     1758 > 80 [ACK] Seq=1 Ack=1 Win=65536 Len=0
26351 50.565758   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      60     1758 > 80 [FIN, ACK] Seq=1 Ack=1 Win=65536 Len=0
26352 50.565830   80.XX.YYY.186         89.ZZZ.TTT.208        TCP      54     80 > 1758 [FIN, ACK] Seq=1 Ack=2 Win=5888 Len=0
26396 50.657612   89.ZZZ.TTT.208        80.XX.YYY.186         TCP      60     1758 > 80 [ACK] Seq=2 Ack=2 Win=65536 Len=0

答案 4 :(得分:0)

似乎如果chrome无法获取favicon(从我那里收到404),它仍会打开favicon请求的第二个连接,但实际上并没有请求它。看起来像一个bug(仍然)。 '缓存'出错可能也就是缓存('我以前没有收到任何东西')检查是在conn已经打开后完成的?

答案 5 :(得分:0)

对我而言,只有在我写/粘贴到chrome url字段时才会发生。它永远不会从锚标签触发。 如果您记录请求的URL,您可以看到它被发送两次。

我是/用户。 我在代码(节点服务器)中添加了consloe.log(),您可以看到/ users出现两次。 由于我没有登录应用程序,我会收到双重通知消息。

此示例可以重现它:

脚本1名称:redirect.php

<?php

session_start();

$_SESSION['x'][] = 'This will show only once';
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0');
header('Location: /to.php');

脚本2名称:to.php

 <?php    

session_start();

if (isset($_SESSION['x']))
    foreach ($_SESSION['x'] as $x) {
        echo $x . '<br>';
}

unset($_SESSION['x']);

因此,如果您在网址字段中复制粘贴“SERVERNAME / redirect.php”,则会收到双倍的消息。

答案 6 :(得分:0)

在正常的html GET查询和/ favicon之后,Chrome发送了空的TCP数据包到我的简单服务器。 Favicon并不是问题,但是空tcp是因为我的服务器正在等待数据或连接完成。它没有数据,也不会在2分钟内释放连接。所以线程挂了2分钟。

related问题中,我找到了一个有用的link,它说这可能是由“预测网络操作以改善页面加载性能”设置引起的。我试图一一关闭预测设置,但它确实起作用。在Chrome版本73.0.3683.86(官方内部版本)(64位)中,此行为是由Chrome设置“使用预测服务更快地加载页面”引起的。

因此,只需转到设置->高级->隐私和安全->使用预测服务可以更快地加载页面并将其关闭。