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

jem*_*emz 8 node.js

我只是想在netNode.js的模块中询问,因为我在文档中没有完全理解.如果我实现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!");
});
Run Code Online (Sandbox Code Playgroud)

先感谢您.

jfr*_*d00 16

.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连接断开而不会在任何大量时间内无效),那么保持活动设置甚至不会发挥作用.

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