AJAX 查询在 Chrome 上的 DNS 查找和初始连接之间出现奇怪的延迟,但不是 FF,这是啥?

Posted

技术标签:

【中文标题】AJAX 查询在 Chrome 上的 DNS 查找和初始连接之间出现奇怪的延迟,但不是 FF,这是啥?【英文标题】:AJAX query weird delay between DNS lookup and initial connection on Chrome but not FF, what is it?AJAX 查询在 Chrome 上的 DNS 查找和初始连接之间出现奇怪的延迟,但不是 FF,这是什么? 【发布时间】:2015-04-30 00:10:58 【问题描述】:

我的客户端上有一个 AJAX 查询,它将两个参数传递给服务器:

var url = window.location.origin + "/instanceStats"            
$.getJSON(url,  'unit' : unit, "stat" : stat , function(data) 
    instanceData[key] = data;
    var count = showInstanceStats(targetElement, unit, stat, limiter);
);

服务器本身是一个非常简单的 Python Flask 应用程序。在该特定 URL 上,它从查询中获取“unit”和“stat”参数以确定 CSV 文件的名称和该文件中的行,获取该行,然后将数据以 JSON 格式发送回客户端(大致1KB)。

有趣的是:当我测量数据返回所需的时间时,我观察到有些查询很快(在 20 到 40 毫秒之间),而有些查询很慢(在 320 到 350 毫秒之间) .改变“stat”参数(即在 CSV 中选择不同的行)似乎没有任何影响。快速和慢速查询通常来回切换(即所有偶数查询都快,所有奇数查询都很慢)。 Python 服务器本身为每个查询报告大致相同的时间。

AJAX 本身似乎也没有任何影响,因为我可以将 JS 中构造的 url 自己粘贴到浏览器中并获得相同的行为。以下是来自两个后续查询的一些测量结果:

快速:http://i.imgur.com/VQ7qopd.png

慢:http://i.imgur.com/YuG0ROM.png

这似乎是特定于 Chrome 的,因为我已经在 Firefox 上进行了尝试,并且相同的实验每次都会产生大致相同的查询时间(在 30 到 50 毫秒之间)。这很不幸,因为我想同时部署在 Chrome 和 Firefox 上。

是什么导致了这种行为,我该如何解决?

【问题讨论】:

【参考方案1】:

我也有,而且完全一样:我的 Node.js 应用程序服务于 Ajax 请求,无论我请求哪个 /url,它要么是 30ms 要么是 300ms,它来回切换:奇怪请求很长,甚至请求都很短。

我在 Chrome Web Inspector(又名 Chrome DevTools)中看到的是,“DNS 查找”和“初始连接”之间存在很长的差距。

他们说这与OCSP 相关: http://www.webpagetest.org/forums/showthread.php?tid=12357

OCSP 是某种证书验证协议: https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol

localhost 移动到127.0.0.1 似乎可以解决这个问题:响应时间现在是30ms

【讨论】:

【参考方案2】:

我也遇到过这种情况。它似乎只在使用 localhost 时发生。如果你使用 127.0.0.1(甚至是计算机名),它不会有额外的延迟。

【讨论】:

已确认。多么奇怪!无论如何,自从提出问题后我已经部署了我的服务器并且问题已经消失了(因为没有人再通过 localhost 访问它了)。 我相信这是 Windows 对单词“localhost”执行 DNS 查找,但不确定。尽管如此,我发现虽然使用数字 IP 127.0.0.1 有很大帮助,但它并不能真正解决问题。某处有帖子暗示它可能是 OCSP,但 127.0.0.1 不是 https 并且没有证书。如果我弄清楚了,我可能会在此处添加更多信息。

以上是关于AJAX 查询在 Chrome 上的 DNS 查找和初始连接之间出现奇怪的延迟,但不是 FF,这是啥?的主要内容,如果未能解决你的问题,请参考以下文章

地址栏输入www.baidu.com之后...

某些 Chrome VPN 扩展被指泄露 DNS 查询

你在chrome浏览器地址栏中输入baidu.com回车后发生了什么

大数据库表和繁忙站点上的ajax自动完成查询的有效方法

Chrome浏览器的使用技巧

ajax 请求被终止 chrome查询发现请求状态status为canceled