【问题标题】:Where does the '{tcp_error, Socket, etimedout}' message of an active socket come from?活动套接字的“{tcp_error, Socket, etimedout}”消息从何而来?
【发布时间】:2013-11-20 10:14:48
【问题描述】:

我们的 (Linux) 服务器使用选项 {active, once} 和它的套接字,并且弹出了 {tcp_error, Socket, etimedout} 消息。我知道这可能是由于网络状况不佳造成的,但有一些奇怪的地方。

在我们的机器上启用了系统范围的 TCP keepalive,实际的选项值为:

net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75

这意味着套接字将在至少 20 分钟内超时,我相信。但奇怪的是,我们的进程在不到 10 秒的时间内收到了{tcp_error, Socket, etimedout}

我想知道,会不会是由gen_tcp:send(...) 操作触发的?然后我发现这是不可能的,因为发送操作都是同步的,它们会立即失败。

那么,我的问题是,etimedout 消息是从哪里来的?或者是什么触发了它?我在 Erlang VM 的 C 源代码上搞砸了,尤其是 inet_drv.c,但还没有结论。

谢谢。

【问题讨论】:

    标签: linux sockets networking erlang


    【解决方案1】:

    tcpdump 捕获表明这是 TCP 重新传输的超时事件。

    我们的服务器机器将 /proc/sys/net/ipv4/tcp_retries2 设置为 5,这将导致 5 次重新传输时断开连接,而该值在开发人员机器上默认为 15,因此我们无法在本地重现问题。

    gen_tcp:send(...)(或其他语言的等效API)返回仅意味着数据包被TCP堆栈接受,但不能保证它可以到达对等方,并且当您被阻止时可能会出现错误其他操作。

    找到一些关于 TCP 重传的简要说明here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多