【问题标题】:what will happen if I use socket.setKeepAlive in Node.js server如果我在 Node.js 服务器中使用 socket.setKeepAlive 会发生什么
【发布时间】:2015-08-02 14:53:03
【问题描述】:

我只想在 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!");
});

提前谢谢你。

【问题讨论】:

    标签: node.js


    【解决方案1】:

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

    这里是对保持活动功能所做的一个很好的总结:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

    这里有一篇文章应该会给你一个概述:

    keepalive 的概念很简单:当你建立一个 TCP 连接,您关联一组计时器。其中一些计时器处理 使用保活程序。当keepalive计时器达到零时, 您向对等方发送一个没有数据的 keepalive 探测数据包,并且 ACK 标志打开。您可以这样做是因为 TCP/IP 规范,作为一种重复的 ACK,以及远程端点 将没有参数,因为 TCP 是面向流的协议。在 另一方面,您将收到来自远程主机的回复(其中 根本不需要支持keepalive,只需要TCP/IP),没有数据 和 ACK 集。

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

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

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

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

    【讨论】:

    • 所以 1 分钟后套接字服务器将向客户端发送探测数据包?
    • 什么是探测包?
    • 我尝试使用setKeepAlive,但看不出有什么不同。我该如何测试?
    • @jemz - 如果你想测试行为,你可以建立一个客户端连接,然后在套接字空闲一段时间后,从网络上拔下客户端,看看你的服务器多久看到套接字已关闭。如果没有保持活动,服务器可能永远不会注意到。有了keep-alive,它应该很快就会注意到。有关详细说明,请参阅上述链接文档的“2.3. 检查死节点”部分。
    • 当 keep-alive 探测发现连接中断时,NodeJS 会发生什么?没有任何事件表明这一点,并且在测试时,没有发生任何有趣的事情(Mac OSX)。
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多