我在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
提前感谢:)
答案 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设置“使用预测服务更快地加载页面”引起的。
因此,只需转到设置->高级->隐私和安全->使用预测服务可以更快地加载页面并将其关闭。