请教node http/https模块中怎么配置CONNECTION_TIMEOUT和SO_TIMEOUT?
发布于 7 年前 作者 zhaochy1990 3211 次浏览 来自 问答

在http/https的文档中, timeout是这样描述的:

timeout <number>: A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.

但是假如我想要设置如下两个timeout的话,需要怎么配置呢? CONNECTION_TIMEOUT:连接超时 SO_TIMEOUT:socket operation超时,socket已经连接上了,但是没有接收到数据的超时时间

我注意到http可以配置createConnection选项,node的net模块有setTimeout方法, 请问各位大神,http模块的request方法的timeout是不是就是CONNECTION_TIMEOUT? net模块的setTimeout方法的timeout是不是就是SO_TIMEOUT?

3 回复

如果没记错的话,应该是下面这样

问题一:net模块的setTimeout方法的timeout是不是就是SO_TIMEOUT? 答:socket连接上,以下两种情况都会触发timeout: 1、超过 timeout 时长,从来没有收到数据,触发timeout。 2、已经收到数据,但是收到数据后,timeout 时长后,没有收到数据,触发timeout。

问题二:http模块的request方法的timeout是不是就是CONNECTION_TIMEOUT? 答:其实就是net模块的timeout,只不过封装了一层而已。

@chyingp 那请问connection-timeout(socket连接不上导致的timeout)在哪里配置呢?

@zhaochy1990 目前node.js(9.11.1)并没有提供设置connection timeout的配置,需要自己人肉 setTimeout() 来判断连接超时。(如有请告知我)

可以测试如下的场景。在server所在的主机,将 ack 包丢弃,client 会一直重新发包,直到超时触发 error 事件

(这个超时时间跟 net.connect(xx).setTimeout(time) 里的time没有关系)

client -------> SYN -------> server client <------- ACK <—x--- server

回到顶部