【问题标题】:What timeout type is meant by net.connect.setTimeout - connection or socket?net.connect.setTimeout 是什么超时类型 - 连接或套接字?
【发布时间】:2017-05-05 16:16:30
【问题描述】:

我正在看一本书,里面有以下段落:

默认情况下,套接字没有超时。这可能很糟糕,因为如果 网络或远程主机出现故障,连接处于空闲状态 无限期地。但是,您可以使用在套接字上定义超时 它的 setTimeout() 方法。这个版本的 setTimeout() 需要一个 以毫秒为单位的超时作为它的第一个参数。如果套接字空闲 在这段时间内,会发出一个超时事件。

这是我从网上阅读得到的:

连接超时仅在启动 TCP 连接时发生。 如果远程机器没有应答,通常会发生这种情况。这意味着 服务器已关闭,您使用了错误的 IP/DNS 名称或 与服务器的网络连接已断开。

socket timeout专门用来监控连续传入的数据 流动。如果数据流在指定的超时时间内中断,则 连接被视为停止/断开。 这是等待单个数据包时的超时。 一个常见的误解是套接字超时是 收到完整的回复。因此,如果您的套接字超时为 1 第二个,一个由 3 个 IP 数据包组成的响应,其中每个响应 数据包需要 0.9 秒才能到达,总响应时间为 2.7 秒,则不会有超时。

所以假设Node.jsnet.Socket 上使用的net.connect.setTimeout 实际上是套接字超时 是正确的吗?

【问题讨论】:

    标签: javascript node.js sockets tcp


    【解决方案1】:

    快速查看Node.js GitHub repo 显示以下内容:

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

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

    enroll 在没有激活它的情况下创建了一个计时器,而_unrefActive 大概启动了计时器(哇,它真的现在启动计时器而不是在某些网络 IO 开始时启动计时器吗?我没有安装 Node.js,但你可能想试一试)。

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

    关于连接超时,可以看Socket.prototype.setKeepAlive。 Keepalive 计时器是 TCP 的一个众所周知的功能,您可以使用它来使长空闲连接无效。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2011-04-22
      • 1970-01-01
      • 2012-11-17
      • 2011-02-05
      • 2018-11-26
      • 2020-06-02
      • 2016-10-02
      相关资源
      最近更新 更多