2012-12-04 57 views
2

考慮對node.js的節點js - 爲什麼3連接?

var net = require ('net'); 

var server = net.createServer(function (socket) { 

    console.log("Connection detected"); 

    socket.on('end', function() { 
     console.log('server disconnected'); 
    }); 

    socket.write("Hello World"); 
    socket.end(); 
}); 

server.listen("8888"); 

這個小型的服務器當我測試與Chrome在服務器上我的MacBook Pro,我在控制檯獲得三次「連接檢測」消息。

我知道一個是很好的連接,另一個是favicon,但第三個是關於什麼的?

回答

5

我用Firefox和wget(這是一個Linux命令行程序)以及telnet來做調查。令人驚訝的是,所有這些都沒有任何額外的連接(顯然他們甚至不嘗試下載圖標)。所以我解僱了Wireshark的和捕獲的會話,並很快發現,Chorme系統使得沒用連接,也就是說,它只是connectsSYNSYN-ACKACK),然後關閉,不發送任何連接(RSTACK)。

只是一個快速googlin,我發現this bug report(節選):

我懷疑 「空」 的TCP連接是

  1. 備份TCP連接,
  2. 的IPv4/IPv6並行連接,或
  3. TCP預連接,

只有在250毫秒內沒有設置原始TCP連接 時,纔會進行備份TCP連接。僅當服務器同時具有IPv6和IPv6地址,並且在300毫秒內沒有設置IPv6連接時,纔會創建IPv4/IPv6並行連接 。由於您在測試本地服務器localhost:8080,您應該能夠 快速連接到它,所以我懷疑您看到TCP 預連接。

要驗證「空」的TCP連接是TCP預連接,打開 的「扳手」菜單>設置>高級>隱私,並清除 「預測網絡操作,以提高網頁加載速度」檢查框。 關閉並重新啓動Chrome。 「空」的TCP連接已經消失了嗎?

對於進一步參考,見the linked thread,這也解釋了更深入的東西備份,並行和預連接是,如果/爲什麼這是一個很好的優化。

+0

做得很好,有趣的鏈接呢! – mtsr

+0

非常感謝,真棒回答! – oopsi