我正在观察这种奇怪的情况。我有一个页面,我想从中向本地服务器做一些AJAX请求以进行测试。我注意到第一次请求时TTFB存在巨大滞后,大约10-15秒。服务器什么也没做,Curl在100ms内得到响应。经过一番挖掘后,我感觉浏览器启动了一些隐藏的"连接。为了证明这一点,我运行了Wireshark,结果证明我的假设是正确的。但它只会变得怪异。
浏览器启动到服务器的裸TCP连接,不发送任何内容并在10秒后关闭它们。 “网络”选项卡中的调试工具中未显示这些连接。最奇怪的部分是那些连接是在我触发AJAX请求之前启动的,实际上即使我没有在页面上做任何事情,也没有任何AJAX,连接就会启动。我似乎能够为任何服务器重现,这里有JSFiddle示例。目前我打开或刷新此页面时,我的浏览器会拍摄到服务器的TCP连接:
这是来自jsfiddle的页面,
<button id='l'>list</button>
$('#l').click(function () {
$.get(
'http://63.245.215.53/test/'
)
.done(function (data) {});
});
我的机器,Mac OS 10.10.3,Chrome版本43.0.2357.130(64位)
所以问题:
为什么浏览器会启动此类连接?它们似乎没有被重用,当我实际启动AJAX请求浏览器打开新的TCP连接时。 浏览器如何知道要连接的IP地址是什么?显然,浏览器会因某种原因记住我从页面请求的服务器。
答案 0 :(得分:0)
我找到了答案。 Chrome会根据以往的经验启动所谓的推测或预测连接。有很好的解释here。
要点:
投机连接出现的第二种方式是基于 &#34;以前的经验&#34;访问一个网站。例如,如果你是vistit www.cnn.com,你(今天)看到你需要得到48左右 i.cdn.turner.com的资源(和/或连接)。此列表使用a 平滑启发式,试图记住有多少其他连接 过去需要的。然后,铬最多可以连接6个 推测到子资源网站(例如,i.cdn.turner.com)时 连接到包含的资源(例如,www.cnn.com)。
因此,Chrome会记住该页面中的AJAX请求,并预测该页面可能会再次发送请求。有趣的是,如果我停止本地服务器和AJAX请求导致错误,下次Chrome将无法打开预测连接。如果我再次启动服务器,只有在刷新页面几次后,Chrome才会开始打开预测连接,显然这样做是为了防止浪费不可靠的资源。
阻止Chrome创建此类连接的一种方法是使用以下命令行键运行:
--disable-preconnect