在使用 nodejs net pacakge 的 tcp 连接中,如果我们没有收到 ack,是否会调用 socket.setTimeout()?
in a tcp connection using nodejs net pacakge does socket.setTimeout() get invoked if we don't get an ack?
TLDR:未确认的消息是否会在 nodejs tcp 套接字中重置超时处理程序?
如果我们发送未收到的消息或它调用超时侦听器,socket.setTimeout(60 * 1000) 是否会重置?
长版:
假设我们在 Nodejs 中创建了一个 tcp 服务器和一个客户端,我们想要检测其中一个套接字何时失去互联网连接,并且由于 tcp 不会自动关闭,我们实现了一个 ping pong (客户端每分钟向服务器发送一个 ping,服务器用 pong 回复),现在处理检查连接是否确实死亡的逻辑我在服务器上使用了一种方法,我们存储来自客户端的最后一次 ping 时间,每 2 分钟一次我们检查它们中的任何一个是否早于 2 分钟,我们宣布连接已死并销毁套接字。在客户端上,我们设置了 10 秒的超时 (socket.setTimeout(10000)),在收到 pong 时重置,它调用超时处理程序,声明连接断开,我的问题是:让我们说已经死了,所以它不会确认客户端的 ping,如果超时计时器比 ping 间隔长,这会导致超时吗?
套接字API(无论是nodejs,C,...)不知道发送的数据是否实际收到或是否丢失。在套接字上发送数据只会将这些数据放入写缓冲区,然后 OS 内核会关心传递。如果数据成功写入写入缓冲区,则应用程序认为发送成功。
这也意味着空闲超时不受 TCP 级别成功或失败的影响。如果在应用程序级别需要某种确认,则必须在应用程序协议内实现。如果这样的确认是由接收者发回某种回执来实现的,那么这意味着套接字activity,因此也会导致空闲超时被重置。
... we want to detect when the one of the sockets has lost internet connection
至于只检测断开的连接,也可以使用 。
TLDR:未确认的消息是否会在 nodejs tcp 套接字中重置超时处理程序? 如果我们发送未收到的消息或它调用超时侦听器,socket.setTimeout(60 * 1000) 是否会重置?
长版:
假设我们在 Nodejs 中创建了一个 tcp 服务器和一个客户端,我们想要检测其中一个套接字何时失去互联网连接,并且由于 tcp 不会自动关闭,我们实现了一个 ping pong (客户端每分钟向服务器发送一个 ping,服务器用 pong 回复),现在处理检查连接是否确实死亡的逻辑我在服务器上使用了一种方法,我们存储来自客户端的最后一次 ping 时间,每 2 分钟一次我们检查它们中的任何一个是否早于 2 分钟,我们宣布连接已死并销毁套接字。在客户端上,我们设置了 10 秒的超时 (socket.setTimeout(10000)),在收到 pong 时重置,它调用超时处理程序,声明连接断开,我的问题是:让我们说已经死了,所以它不会确认客户端的 ping,如果超时计时器比 ping 间隔长,这会导致超时吗?
套接字API(无论是nodejs,C,...)不知道发送的数据是否实际收到或是否丢失。在套接字上发送数据只会将这些数据放入写缓冲区,然后 OS 内核会关心传递。如果数据成功写入写入缓冲区,则应用程序认为发送成功。
这也意味着空闲超时不受 TCP 级别成功或失败的影响。如果在应用程序级别需要某种确认,则必须在应用程序协议内实现。如果这样的确认是由接收者发回某种回执来实现的,那么这意味着套接字activity,因此也会导致空闲超时被重置。
... we want to detect when the one of the sockets has lost internet connection
至于只检测断开的连接,也可以使用