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

16

我只是想在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个回答

26
.setKeepAlive() 方法可启用/禁用 TCP keep alive 功能。该功能是在操作系统的 TCP 层实现的,因此 node.js 套接字库启用了它,但实际上 keep-alive 功能是在主机操作系统的 TCP 栈中实现的。
以下是关于 keep alive 功能的很好的摘要:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
以下是该文章的一部分,应该可以给您一个概述:
保持活动的概念非常简单:当您建立 TCP 连接时,您会关联一组计时器。其中一些计时器处理 keepalive 过程。当 keepalive 计时器达到零时,您将发送一个没有数据且 ACK 标志打开的 keepalive 探测包给您的对等方。由于 TCP/IP 规范,您可以这样做,作为一种重复 ACK,并且远程端点将没有参数,因为 TCP 是面向流的协议。另一方面,您将收到来自远程主机的回复(它不需要支持 keepalive,只需支持 TCP/IP),没有数据且设置了 ACK。
如果您收到了 keepalive 探测的回复,您可以断言连接仍然正常运行,而不用担心用户级别的实现。实际上,TCP 允许您处理流而不是数据包,因此零长度数据包对用户程序并不危险。
此过程很有用,因为如果其他对等方失去了连接(例如重新启动),即使没有流量,您也会注意到连接已断开。如果您的对等方未回复 keepalive 探测,则可以断言连接无效,并采取正确的操作。

如果您在服务器上设置了保持连接功能,那么保持连接设置的效果完全取决于这些传入套接字的情况。如果它们是短暂的(例如,它们连接,交换一些数据,然后断开连接,就像典型的HTTP连接一样,没有变为非活动状态,时间不会太长),那么保持连接设置甚至不会发挥作用。

另一方面,如果客户端连接到服务器并保持该连接长时间,则保持连接设置将发挥作用,并且您将看到上述文章中提到的不同行为。此外,如果客户端是电池供电设备(手机、平板等)并且保持长时间运行的连接,则可能会消耗更多的电池电力和略微更多的带宽来响应常规保持连接数据包,因为设备必须唤醒以接收传入的数据包,然后必须传输以发送响应。


那么,1分钟后套接字服务器会向客户端发送探测数据包吗? - jemz
探测数据包是什么? - jemz
我试过使用setKeepAlive但是没有看到任何不同,我该如何测试? - jemz
@jemz - 我在链接的文章中描述了探测数据包。它是一个空数据包,在TCP协议中需要接收端的ACK来验证传输。如果您阅读我提供的文章,我认为所有内容都已经被描述清楚了。正常情况下,您不会看到任何行为上的差异,因为保持活动状态只有在出现问题时才会触发不同的行为(例如客户端重新启动或从网络中断开而没有关闭套接字)。如果您想看到发送的保持活动状态数据包,可以使用网络嗅探器查看原始数据包。 - jfriend00
1
@jemz - 如果您想测试行为,可以建立客户端连接,然后在套接字空闲一段时间后,将客户端从网络中拔出,看看服务器多快发现套接字已关闭。如果没有保持活动状态,服务器可能永远不会注意到。有了保持活动状态,它应该很快就会注意到。有关更多描述,请参见上面链接文档的“2.3.检查死对等体”部分。 - jfriend00
1
当NodeJS中的keep-alive探测发现连接中断时会发生什么?没有任何事件表明这一点,经过测试,没有发生任何有趣的事情(Mac OSX)。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接