如果我在Node.js服务器中使用socket.setKeepAlive会发生什么

时间:2015-05-21 05:27:59

标签: node.js

我只想在Node.js的net模块中询问,因为我在文档中没有完全理解。如果我实现setKeepAlive()会发生什么?这个setKeepAlive()的行为是什么?

var net  = require('net');

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

    socket.setKeepAlive(true,60000); //1 min = 60000 milliseconds.

    socket.on('data',function(data){
        ///receiving data here

    });
    socket.on('end',function(data){

    });

});

server.listen(1333,'127.0.0.1', function () {
      console.log("server is listening in port 1333!");
});

提前谢谢。

1 个答案:

答案 0 :(得分:13)

.setKeepAlive()方法启用/禁用TCP保持活动状态。这是在OS中的TCP级别完成的,因此它由node.js套接字库启用,但保持活动功能实际上是在主机操作系统的TCP堆栈中实现的。

以下是保持活动功能的完整摘要:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

这篇文章的一部分应该给你一个概述:

  

keepalive概念非常简单:设置TCP时   连接,您关联一组计时器。其中一些计时器处理   与keepalive程序。当keepalive计时器达到零时,   你向对等体发送一个keepalive探测包,其中没有数据和   ACK标志已打开。您可以通过TCP / IP执行此操作   规范,作为一种重复的ACK,以及远程端点   将没有参数,因为TCP是面向流的协议。在   另一方面,您将收到远程主机的回复(其中   根本不需要支持keepalive,只需要支持TCP / IP),没有数据   和ACK集。

     

如果您收到对keepalive探测的回复,则可以断言   连接仍然正常运行而不用担心   用户级实现。事实上,TCP允许您处理   流,而不是数据包,因此零长度数据包并不危险   用户程序。

     

这个程序很有用,因为如果其他同伴失去他们的   连接(例如通过重新启动)你会注意到   连接断开,即使你没有流量。如果   keepalive探针不会被您的对等方回复,您可以断言   连接不能被视为有效,然后采取正确的   动作。

由于您在服务器的传入连接上设置保持活动状态,因此保持活动设置的效果将完全取决于这些传入套接字的情况。如果它们是短暂的(例如它们已连接,交换一些数据然后像典型的HTTP连接一样断开而不会在任何大量时间内无效),那么保持活动设置甚至不起作用。

另一方面,如果客户端连接到服务器并保持该连接打开很长时间,那么保持活动设置将起作用,您将看到上面提到的不同行为参考文章。此外,如果客户端是电池供电的设备(手机,平板电脑等......)并且它具有长时间运行的连接,那么它可能会消耗更多的电池电量和更多的带宽响应常规保持活动数据包,因为设备必须唤醒以接收传入的数据包,然后必须发送以发送响应。