keepAliveTimeout和timeout的区别是什么?

20

阅读Node文档关于server.keepAliveTimeout

如果服务器在keep-alive超时触发之前收到新数据,则会重置常规不活动超时,即server.timeout。

这与server.timeout有何区别?

听起来它们都是关于套接字超时的,在不活动时才开始计时。

7个回答

18

Keep-Alive是Http协议的头部之一。 Keep-Alive头部将允许多个Http请求通过单个连接发送,而不是使用多个连接。

因此,设置keepAliveTimeout将决定这些Keep-Alive连接允许保持打开的时间长度。 timeout决定服务器将等待客户端请求的最长时间。

关于Keep-Alive的更多信息,请参见https://blog.stackpath.com/glossary-keep-alive/


服务器将等待客户端的响应 - 什么?我的理解一直以来都是客户端只发送请求,因为服务端何时开始发送请求并且客户端何时开始发送响应?(不要提出异常情况,因为我们在这里不讨论异常情况) - hagrawal7777
不,你是对的。在这种情况下,“响应”不是正确的术语。严格来说,在HTTP协议中,客户端发送请求,服务器发送响应。 - Software Person

8

server.timeout 是指请求被接收后允许的不活动时间(以毫秒为单位)(无需始终设置,默认值为5分钟)。

server.keepAliveTimeout 是服务器在最后一次响应后等待并保持连接打开的时间(以毫秒为单位)(无需始终设置,默认值为5秒)。


6
keepAliveTimeout 是指在销毁套接字之前的时间,而 timeout 是需要确定套接字是否已超时的时间。 keepAliveTimeout 将销毁套接字,timeout 只是“决定”它已断开连接。并且提到“如果服务器在保持活动状态的超时时间触发之前收到新数据,则会重置常规不活动超时时间”,这很明显,因为如果从此套接字接收到新数据,就意味着它仍然存活,timeout 应该被重置。

[...] 超时只是“决定”它已断开连接。似乎并不正确。在server.setTimeout方法下,文档提到,“默认情况下,服务器的超时值为2分钟,如果套接字超时,则会自动销毁”。 - Maxime Dupré

4

从nodejs的角度来看

server.timeout

超时时间,单位为毫秒。默认值:120000(2分钟)。 在一个套接字被认为已经超时之前的不活动毫秒数。

当值为0时,会禁用传入连接的超时行为。

套接字超时逻辑在连接时设置,因此更改此值仅会影响到服务器上的新连接,而不会影响任何现有连接。

要更改默认超时时间,请使用--http-server-default-timeout标志。

server.keepAliveTimeout

超时时间,单位为毫秒。默认值:5000(5秒)。 服务器需要等待额外传入数据的不活动毫秒数,即在它完成最后一次响应后,直到套接字被销毁之前。如果服务器在保持活动超时触发之前收到新数据,那么它将重置常规不活动超时,即 server.timeout

当值为0时,会禁用传入连接的保持活动超时行为。值为0将使http服务器的行为类似于Node.js 8.0.0之前的版本,这些版本没有保持活动超时。

套接字超时逻辑在连接时设置,因此更改此值仅会影响到服务器上的新连接,而不会影响任何现有连接。

换句话说:

server.timeout 可以告知客户端服务器愿意保持连接的时间。 server.keepAliveTimeout在保持活动超时触发之前收到数据会重置 server.timeout

我后来意识到@Software Person也用另一种方式表达了同样的内容,对吧!


2
每个连接在请求完成后或者服务器没有发送响应即保持空闲/不活动时终止。(例如,对于一个传入的请求,服务器没有发送回响应,在这种情况下,连接将保持打开状态直到指定的超时时间)。由于每个连接在请求服务后都会被终止,因此创建多个连接可以减少加载时间。这通过启用Keep-Alive来实现,它避免了重复打开和关闭新连接的需要。
现在,保持活动超时只让连接在两个连续请求之间保持打开状态,时间为指定的时间。(例如,如果keepalive-timeout为10毫秒,并且两个连续请求需要超过10毫秒,则连接将关闭。此外,如果每个请求的超时时间为15毫秒,则它将等待第一个请求完成,直到15秒,如果超过了这个时间,那么也会发生超时。)

0

server.keepAliveTimeout

文档

服务器在完成最后一个响应的写入后,需要等待多少毫秒的不活动时间,才会销毁套接字之前,等待其他传入数据。

解释

由于套接字被重用,它们会保持活动状态以处理另一个请求。它将从完成上一个请求的响应的最后一位的时间开始计时,如果在超时期间没有其他请求进来,则套接字将被销毁。

server.timeout

文档

在套接字被认为已超时之前的不活动毫秒数。默认情况下,服务器的超时值为2分钟,如果套接字超时,则会自动销毁。但是,如果将回调分配给服务器的“超时”事件,则必须显式处理超时。

解释

如果套接字在此期间未发送或接收信息,则套接字将被销毁。与 server.keepAliveTimeout 的区别在于,此超时不等待上一个请求完成才开始计时。如果没有发送或接收任何内容,则可以在请求期间超时。

我不理解的地方

这里的“不活动”是什么意思?如果套接字接收到数据,它是否处于不活动状态?还是只有在写入数据时套接字才处于活动状态?


0

server.timeout

在套接字被认为已超时之前的不活动毫秒数。

server.keepAliveTimeout

服务器需要等待附加传入数据的不活动毫秒数,它在完成最后的响应写入之后,在套接字被销毁之前会等待。如果服务器在 keep-alive 超时触发之前收到新数据,则会重置常规不活动超时即server.timeout.
我认为,这些定义之间的主要区别是“after it has finished writing the last response”句子。换句话说:
- server.timeout:包括上一次活动(请求或响应)。
- server.keepAliveTimeout:仅包括最后一个响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接