Javascript - 测量打开到服务器的tcp连接的时间

时间:2014-04-23 17:48:17

标签: javascript sockets tcp

我想衡量打开(和关闭)与服务器的tcp连接的延迟。 我不想发送/接收任何数据,因为我希望尽可能少的开销来消除服务器端的任何内容,从而增加请求时间。

将其视为TCP ping。记录当前时间,连接到主机:端口,断开连接,计算增量时间。

我相信Javascript不允许打开直接套接字,但是我希望它可以做什么(例如AJAX请求)它可以以某种形状或形式使用以满足我的要求。

编辑:

有关服务器的一些信息:

  • 它是一个远程服务器,因此我需要能够处理有关Same Origin的错误
  • 它不是标准的网络服务器,它不支持HEAD(这就是为什么我只想打开连接而不发送数据)
  • 如果我尝试GET请求,则会重置连接

即使我可以尝试连接,然后由于以上几点而拒绝,如果我能抓住异常,我仍然可以使用它连接的事实来确定延迟。

1 个答案:

答案 0 :(得分:1)

由于我们在应用层内部运行,因此我们只能通过HTTP进行延迟测试。

var xhr = new XMLHttpRequest()
xhr.open("HEAD", "/", false)
console.time("latency");
xhr.send();
console.timeEnd("latency");

代码说明:

我为当前主机创建了一个同步AJAX请求。我使用"HEAD"作为非常轻量级且不接收任何内容的方法。因此,我们可以假设“HEAD”请求的往返非常接近ICMP或TCP上的实际ping。

对于URL,使用"/"(当前主机)。由于同源政策,您不能只使用http://google.com之类的任何域名,除非您被允许这样做。

我使用console.time()console.timeEnd()来衡量持续时间,这比使用常规Date更准确。但是,您也可以使用Date来衡量持续时间:

//...
var now = (new Date()).getTime()
xhr.send();
var duration = (new Date()).getTime() - now; //ms

<强>更新 即使发生异常,也请尝试使用此代码来测量延迟:

try {
    var xhr = new XMLHttpRequest()
    xhr.open("HEAD", "http://google.com" + "/?" + Math.random(), false) 
    console.time("latency");
    xhr.send();
}
catch (e){
    //block exception
}
finally {
    console.timeEnd("latency");
}

请注意,我还在网址末尾添加了一个随机数,以防止浏览器缓存。