- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
对于 TCP 客户端 connect() 调用 TCP 服务器..
理查德·史蒂文斯 (Richard Stevens) 的 UNIX® Network Programming 一书说了以下内容..
如果客户端 TCP 没有收到对其 SYN 段的响应,则返回 ETIMEDOUT。 4.4BSD,例如,在调用 connect 时发送一个 SYN,6 秒后发送另一个,然后再发送一个24 秒后(TCPv2 第 828 页)。如果在总共 75 秒后仍未收到响应,则返回错误。
在 Linux 中,我想知道什么是重试机制(多少次以及间隔多远)。询问是因为对于 TCP 客户端 connect() 调用我收到 ETIMEDOUT 错误。此套接字具有 O_NONBLOCK 选项,并由 epoll() 监视事件。
如果有人能指出我在代码中的何处实现了此重试逻辑,那也会有所帮助。我尝试从 net/ipv4/tcp_ipv4.c 中的 tcp_v4_connect() 开始,但很快就迷路了..
最佳答案
超时是根据测量的往返时间缩放的。
tcp_connect()
设置一个定时器:
/* Timer for repeating the SYN until an answer. */
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
icsk_rto
将使用每个目的地 re-transmission timeout ;如果目标的先前指标可从先前的连接中获得,则会重新使用。 (有关详细信息,请参阅 tcp(7)
中的 tcp_no_metrics_save
讨论。)如果未保存任何指标,则内核将回退到默认 RTO 值:
#define TCP_RTO_MAX ((unsigned)(120*HZ))
#define TCP_RTO_MIN ((unsigned)(HZ/5))
#define TCP_TIMEOUT_INIT ((unsigned)(1*HZ)) /* RFC2988bis initial RTO value */
#define TCP_TIMEOUT_FALLBACK ((unsigned)(3*HZ)) /* RFC 1122 initial RTO value, now
* used as a fallback RTO for the
* initial data transmission if no
* valid RTT sample has been acquired,
* most likely due to retrans in 3WHS.
*/
tcp_retransmit_timer()
在底部附近有一些代码用于重新计算延迟:
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, TCP_RTO_MAX);
if (retransmits_timed_out(sk, sysctl_tcp_retries1 + 1, 0, 0))
__sk_dst_reset(sk);
retransmits_timed_out()
将首先执行线性退避,然后是指数退避。
我认为总而言之,您可以合理地预计在从 connect(2)
返回 ETIMEDOUT
错误之前大约需要 120 秒,除非内核具有良好的有理由怀疑远程对等方应该更早回复。
关于Linux - TCP connect() 失败并出现 ETIMEDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471577/
我正在尝试使用 PHP、mySQL 和本地主机构建 Android 登录应用程序。但是它显示连接问题。我尝试了模拟器和 Android 设备。我还通过在 Wireless LAN Adapter Wi
我正在尝试在 Windows 10 上使用 heroku run bash。 我试过允许端口 5000 通过防火墙并以管理员身份重新启动命令提示符。 还有什么我缺少的连接吗? 最佳答案 可以从 her
如何使用 nock ( https://github.com/node-nock/nock ) 和 request 强制执行 ETIMEDOUT? 我尝试了以下方法,其中 nock 会延迟响应 800
我正在尝试部署或删除甚至检查我部署的应用程序的日志 homlia-cc.meteor.com 但我收到这个错误 Error deploying application: Connection erro
以下代码是一个项目,它解析 CSV 文件的目录以输入到 MySQL 数据库中。它通常有效,但是我受到 ETIMEDOUT 错误的困扰。我是一名初级开发人员,不确定如何处理这种情况,或者为什么会发生这种
我正在尝试使用 pthread_cond_timedwait 来等待超时,类似于 Java 的 wait(long timeout, int nanos)。我知道 Java 的 wait 使用相对超时
我使用omniOrb 和Python 构建了一个CORBA 事件服务客户端。我在使用 Java 客户端时遇到了同样的问题。我非常确定我遇到了与这篇文章相同的事情,因为我的 strace 看起来非常相似
我正在尝试使用 Node 和 Mysql,但在尝试连接数据库时总是遇到错误。 //For mysql server var mysql = require('mysql'); var connect
如何处理此调用的 etimedout 错误? var remotePath = "myremoteurltocopy" var localStream = fs.createWriteStream
我创建了一个 Apache Cordova 项目并尝试按原样构建它。 Visual Studio 一直在同一步骤上失败: 1>------ Build started: Project: Test,
我在 MySql 中使用 Loopback。我在运行时随机出现以下错误 nodemon . 或 node . Web server listening at: http://0.0.0.0:3000
我正在尝试获取 200 状态代码作为响应,但结果是 ETIMEDOUT。我不明白,我怎么可能通过 postman 获取成功的响应,但同样通过 node-fetch 始终以 ETIMEDOUT 响应。这
我为 iOS 编写应用程序,它使用 Socket.IO。有时我的服务器 JS 脚本会出现以下错误: events.js:85 throw er; // Unhandled 'error'
我正在尝试运行演示程序。 根据说明,我必须运行命令npm install,该命令安装所有依赖项,但面临如下问题 最佳答案 尝试以下命令,它将注册表的协议(protocol)从 https 更改为 ht
概述 在两个单独的 Azure 实例上,第一个实例上的 Node.js 服务器正在运行,它们连接到第二个实例上运行的单 Node Redis 服务器,并且 Node.js 正在尝试与 Redis 保持
当我运行 index.js. 起初我以为这是因为我在调用 onEachLimitItem 回调之前没有包含 return。所以我根据 async multiple callbacks document
对于 TCP 客户端 connect() 调用 TCP 服务器.. 理查德·史蒂文斯 (Richard Stevens) 的 UNIX® Network Programming 一书说了以下内容..
我们在 Aws Lambda 中使用 Sequelize 并且在大多数情况下一切正常,但随机出现以下错误: ETIMEDOUT {"name":"SequelizeConnectionError","
我尝试使用this Meteor 1.3.2.4 中的 NPM 包。它在函数中使用 eventemitter 并具有异步回调。我尝试使用基于 this guide article 的 Meteor.b
我开发了一个与 FTP 服务器交互的 Node.js/Express.js 应用程序,问题是如果服务器离线,应用程序就会崩溃,因为我找不到处理 ETIMEDOUT 异常的方法。顺便说一下,我用于 FT
我是一名优秀的程序员,十分优秀!