【问题标题】:in a tcp connection using nodejs net pacakge does socket.setTimeout() get invoked if we don't get an ack?在使用 node js net 包的 tcp 连接中,如果我们没有得到确认,是否会调用 socket.setTimeout()?
【发布时间】:2021-09-15 11:40:54
【问题描述】:

TLDR:未确认的消息是否会在 nodejs tcp 套接字中重置超时处理程序? 如果我们发送未收到的消息或调用超时监听器,socket.setTimeout(60 * 1000) 是否会重置?

加长版:

假设我们在 Nodejs 中创建了一个 tcp 服务器和一个客户端,我们想检测其中一个套接字何时失去互联网连接,并且由于 tcp 不会自动关闭,我们实现了一个 ping pong(客户端发送每分钟对服务器进行一次 ping,服务器用 pong 回复),现在要处理检查连接是否确实断开的逻辑我使用的方法是在我们存储来自客户端的最后一次 ping 时间的服务器上,每 2 分钟检查一次如果它们中的任何一个都超过 2 分钟,我们就宣布连接失效并销毁套接字。在客户端,我们设置了 10 秒的超时时间(socket.setTimeout(10000)),当收到一个 pong 时重置它,它调用超时处理程序,它声明连接断开,我的问题是:假设已经死了,所以它不会确认客户端的 ping,如果超时的计时器比 ping 间隔长,这会导致超时吗?

【问题讨论】:

    标签: javascript node.js sockets tcp


    【解决方案1】:

    套接字 API(无论是 nodejs、C、...)不知道发送的数据是实际接收到还是丢失了。在套接字上发送数据只将它们放入写入缓冲区,然后操作系统内核关心传递。如果数据成功写入写入缓冲区,则应用程序认为发送成功。

    这也意味着空闲超时不受 TCP 级别成功或失败的影响。如果在应用程序级别需要某种确认,它必须在应用程序协议中实现。如果这样的确认是由接收者发送回某种收据来实现的,那么这意味着套接字活动,因此也会导致空闲超时被重置。

    ...我们想检测其中一个套接字何时失去互联网连接

    至于仅检测断开的连接,也可以使用TCP keep-alive

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 2015-06-10
      • 2013-02-23
      • 1970-01-01
      • 2020-02-24
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多