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

如果在Node.js服务器中使用socket.setKeepAlive,会发生什么,node.js,Node.js,我只是想在Node.js的net模块中提问,因为我在文档中没有完全理解。如果我实现setKeepAlive(),会发生什么?。此setKeepAlive()的行为是什么 提前感谢。使用.setKeepAlive()方法启用/禁用TCP保持活动状态。这是在操作系统的TCP级别完成的,因此它由node.js套接字库启用,但保持活动功能实际上是在主机操作系统的TCP堆栈中实现的 这里有一个关于keep alive功能的非常好的总结: 下面是这篇文章的一部分,可以为您提供一个概述: keepalive的

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

提前感谢。

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

这里有一个关于keep alive功能的非常好的总结:

下面是这篇文章的一部分,可以为您提供一个概述:

keepalive的概念非常简单:当您设置TCP时 连接时,关联一组计时器。这些计时器中有一些是交易的 用keepalive程序。当keepalive计时器达到零时, 您向您的对等方发送一个没有数据的keepalive probe数据包,并且 确认标志已打开。由于TCP/IP协议,您可以这样做 规范,作为一种重复的ACK,以及远程端点 将没有参数,因为TCP是面向流的协议。上 另一方面,您将收到来自远程主机(它 根本不需要支持keepalive,只需要TCP/IP),不需要数据 和ACK设置

如果您收到对keepalive探测器的回复,您可以断言 连接仍处于启动和运行状态,无需担心故障 用户级实现。事实上,TCP允许您处理 流,而不是数据包,因此零长度数据包并不危险 对于用户程序

此过程非常有用,因为如果其他对等方丢失了 连接(例如通过重新启动)您将注意到 即使没有流量,连接也会断开。如果 keepalive探测不会被您的对等方回复,您可以断言 连接不能被认为是有效的,然后采取正确的 行动

由于您正在对服务器的传入连接设置keep alive,因此keep alive设置的效果将完全取决于这些传入套接字的情况。如果它们的寿命很短(例如,它们连接在一起,交换一些数据,然后像典型的HTTP连接一样断开连接,而没有长时间处于非活动状态),则“保持活动”设置甚至不会发挥作用


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

因此,1分钟后,套接字服务器将发送探测数据包到客户端?探测数据包是什么?我尝试使用
setKeepAlive
但我看不出有什么区别。我该如何测试?@jemz-如果你想测试这种行为,你可以设置一个客户端连接,然后在套接字空闲一段时间后,将客户端从网络中拔出,看看你的服务器多久能看到套接字关闭。如果没有保持活动状态,服务器可能永远不会注意到。有了keep alive,它应该很快就会注意到。有关更多说明,请参阅上述链接文档的“2.3.检查死掉的对等点”部分。当keep alive probe发现连接中断时,NodeJS中会发生什么情况?所有事件都没有表明这一点,经过测试,没有发生任何有趣的事情(MacOSX)。
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!");
});