在Node.js TCP套接字中测试keepalive的功能

时间:2013-05-15 19:30:26

标签: node.js sockets tcp keep-alive

我一直在Node.js TCP套接字中测试keepalive的功能。看来我在这里错过了一些东西!

这是我的服务器代码:

var net = require('net');
function accept(socket) {
    socket.setKeepAlive(false);
    socket.on('data', function(data) {
        console.log("DATA");
        console.log(data);
    });
    socket.on('error', function (e) {
        console.log("ERROR");
        console.log(e);
    });
    socket.on('close', function () {
        console.log("CLOSE");
    });
    socket.on('end', function () {
        console.log("END");
    });
    socket.write("Hi");
}
var server = net.createServer(accept);
server.listen(8011);

这是我的客户代码:

var net = require('net');
var socket = new net.Socket();
socket.setKeepAlive(false);
socket.on('data', function(data) {
    console.log("DATA");
    socket.write(data);
});
socket.on('error', function (e) {
    console.log("ERROR");
    console.log(e);
});
socket.on('close', function () {
    console.log("CLOSE");
});
socket.on('end', function () {
    console.log("END");
});
socket.connect(8011, '127.0.0.1');

为什么即使长时间(120秒)没有发送或接收数据,服务器(或客户端)也不会关闭连接?

我正在使用Node.js版本0.10.5!

1 个答案:

答案 0 :(得分:2)

因为keep-alive工作在较低级别。它发送一个没有任何数据有效负载的检查数据包,如果没有应答,则认为连接已断开。

尝试相同操作,但从其中一台机器上拔下以太网电缆。

编辑0:

抱歉,误读了你的代码。

TCP保持活动功能通常称为“死对等检测”。阅读其机制,例如here。在禁用keep-alive的情况下,TCP本身没有任何内容可以强制在任何不活动超时后关闭连接。它是像NAT-ing路由器这样的中间设备可能会使状态失效并断开你的连接,而不是通信自身结束。