首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >活动套接字的“{tcp_error,套接字,etimedout}”消息来自何处?

活动套接字的“{tcp_error,套接字,etimedout}”消息来自何处?
EN

Stack Overflow用户
提问于 2013-11-20 10:14:48
回答 1查看 1.3K关注 0票数 6

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

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

代码语言:javascript
复制
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的C源代码,尤其是inet_drv.c,但还没有得出结论。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-21 08:44:24

tcpdump捕获显示它是来自TCP重传的超时事件。

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

gen_tcp:send(...)返回(或其他语言中的等效API)只意味着数据包被TCP堆栈接受,但不能保证它能够到达对等端,而且当您在其他操作中被阻塞时,错误可能会被抛出。

找到一些关于TCP重传here的简要描述。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20093028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档