2014-04-23 19 views
0

我想衡量開口(閉)TCP連接到服務器的延遲。 我不想發送/接收任何數據,因爲我想盡可能少的開銷來消除服務器端的任何事情,從而增加請求時間。使用Javascript - 測量時間來打開一個TCP連接到服務器

認爲它像一個TCP ping。記錄當前時間,連接到主機:端口,斷開連接,計算增量時間。

相信的Javascript不允許打開直接插口,但我希望給它能做什麼(例如AJAX請求),它可以在一定形狀使用或者形成以適合我的要求。

編輯:

有關服務器的一些信息:

  • 這是一個遠程服務器,所以我需要能夠處理有關同源錯誤
  • 這不是一個標準的Web服務器,它不支持HEAD(這就是爲什麼我只想打開連接而不發送數據)
  • 如果我嘗試GET請求,它會重置連接

即使我可以嘗試連接,然後得到一個拒絕由於以上幾點,如果我能趕上例外,我仍然可以使用它連接到確定延遲的事實。

回答

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 

UPDATE: 即使發生異常試試這個代碼,用於測量延遲:

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"); 
} 

請注意,我也有在URL的末尾添加一個隨機數以防止瀏覽器緩存。

+0

這幾乎是理想的,不幸的是這是一個遠程服務器,並且不支持HEAD(儘管如果我能趕上這個錯誤,我不會有事的太)。我會更新我的帖子,提供有關服務器的更多信息。 – AndyC

+0

我更新了答案。 – advncd

+0

請求/定時捕獲工作正常,但似乎沒有辦法阻止/捕獲由於相同原始策略導致的'XMLHttpRequest無法加載..'錯誤。 – AndyC

相關問題