什么超时types是由net.connect.setTimeout – 连接或套接字?

我正在读一本书,那里有一段话:

默认情况下,套接字没有超时。 这可能是不好的,因为如果networking或远程主机发生故障,连接将无限期地闲置。 但是,您可以使用setTimeout()方法在套接字上定义一个超时值。 setTimeout()的这个版本以毫秒为单位超时作为第一个参数。 如果套接字空闲了这段时间,就会发出超时事件。

以下是我在网上阅读的内容:

连接超时仅在启动TCP连接时发生。 这通常发生在远程机器没有应答的情况下。 这意味着服务器已closures,您使用错误的IP / DNS名称或服务器的networking连接已closures。

套接字超时专用于监视连续传入的数据stream。 如果数据stream在指定的超时时间内中断,连接将被视为停止/中断。 等待单个数据包时是超时。 这是一个常见的误解,套接字超时是接收完整响应的超时。 所以,如果套接字超时为1秒,响应包含3个IP数据包,每个响应数据包需要0.9秒才能到达,总响应时间为2.7秒,则不会有超时。

所以我们正确地假设在Node.js net.connect.setTimeout使用的net.Socket实际上是一个套接字超时

快速看Node.js GitHub回购显示以下内容:

Socket.prototype.setTimeout使用内部的lib/timers.js模块来处理超时:

 Socket.prototype.setTimeout = function(msecs, callback) { ... timers.enroll(this, msecs); timers._unrefActive(this); ... return this; }; 

enroll创build一个计时器没有激活它和_unrefActive大概启动计时器(哇,它真的启动计时器现在,而不是一些networkingIO开始?我没有安装Node.js,但你可能想试试看)。

lib/timer.js是一个基于链表的定时器pipe理器,与套接字设置无关,所以我同意Socket.prototype.setTimeout就是你所说的“套接字超时”。

关于连接超时,你可以看看Socket.prototype.setKeepAlive 。 Keepalive定时器是TCP的一个众所周知的function,您可以使用它来使长时间空闲的连接失效。