什么是连接超时时间
linux curl 访问 ip:80,假设 ip 机器 并没有开机,超时时间设置为 120s
第 10s 的时候,开机了,webserver 启动了成功了。此时能成功建立连接吗
前提:没有内核的 tcp syn retry
原因: 如果我有个需求,访问某个接口获取数据,不在乎任何客观因素无所谓用多长时间。 是否意味着我 curl 无视超时时间,最终是一定能拿到结果的
1
hxndg 2021-04-15 16:06:40 +08:00
我记得如果没有 tcp retry 的话,unix 总共是实验 7 次? TCP/IP 卷 1 里面写了我忘记了。
10s 我记得应该是 OK 的吧 无视超时时间的话你得从 linux 协议栈和防火墙下手吧,curl 应该没有用? 好久没看 TLS 下层的东西了,记得不是很清楚。 |
2
monsterxx03 2021-04-15 16:48:36 +08:00
没有 tcp syn retry 不行, connect timeout 就是在规定时间内重复发 syn 包罢了, 没 syn 包不可能握手成功.
你想要的效果理论上通过同时增大 curl --connect-timeout 和 net.ipv4.tcp_syn_retries 实现, 但这么干很傻 1. 对面防火墙可能给你回 RST 2. tcp_syn_retries 最大 255, 理论最长超时时间大概几个小时吧. 3. tcp syn retry 的间隔时间类似 exponential backoff 的方式计算的, 上限好像是 2min? 不确定. 所以你可能对面 server 起来后过了 2 min 钟你才连上. 只能在业务层面轮询. |
3
hxndg 2021-04-15 17:01:57 +08:00
@monsterxx03
刚才重新翻了一下 tcp/ip 详解,七次 syn 重试,总共时间是两分钟多一点, 但是内核会除了这七次意外,尝试 syn 重传 所以楼主的 kernel syn retry 我不知道具体是指那七次还是七次之外的了。 说白了,lz 的问题还是在业务层问 kernel 层 |
4
monsterxx03 2021-04-15 17:12:46 +08:00
@hxndg 他大概是想依靠一个内核机制来解决一个业务层的问题. tcp_syn_retries 是可以设置的, 不同发行版默认值不一样, 一般默认是 6 次
|