linux 超时 tcp,Linux中TCP设置syn超时时间
无论您使用什么语言或客户端库,您都应该能够在网络套接字操作上设置超时,通常将其拆分为连接超时、读取超时和写入超时。但是,尽管您应该能够使这些超时尽可能小,但连接超时尤其具有任何给定内核的有效最大值。在此点之外,您可能请求的较高超时值将不起作用 - 连接在较短的时间后仍将超时。TCP 连接的特殊原因是,建立 TCP 连接具有以 SYN 数据包为起点的特殊数据包序列。如果没有收到对此初始 SYN 数据
无论您使用什么语言或客户端库,您都应该能够在网络套接字操作上设置超时,通常将其拆分为连接超时、读取超时和写入超时。
但是,尽管您应该能够使这些超时尽可能小,但连接超时尤其具有任何给定内核的有效最大值。在此点之外,您可能请求的较高超时值将不起作用 - 连接在较短的时间后仍将超时。
TCP 连接的特殊原因是,建立 TCP 连接具有以 SYN 数据包为起点的特殊数据包序列。如果没有收到对此初始 SYN 数据包的响应,内核需要重试,它可能需要尝试几次。我知道,所有内核在发送 SYN 重重之间等待的时间越来越多,以避免淹没慢速主机。
所有内核都对重试 SYN 的数量设置上限。在 BSD 派生内核(包括 Mac OS X)上,标准模式是第二个 SYN 将在第一个内核之后 6 秒,然后是第三个 SYN 18 秒后,然后连接时间在总共大约 75 秒后关闭。
但是,在 Linux 上,默认重试周期在 20 秒后结束。Linux 发送 SYN 的重报确实比 BSD 派生的内核快一些 - Linux 据说在这 20 秒内发送 5 个 SYN,但这包括原始数据包(重报在 3s、6s、12s、24s 之后)。
但最终的结果是,如果你的应用程序想要一个小于 20s 的连接超时,没有问题,但如果你的应用程序想要一个超过 20s 的连接超时,你会发现默认内核配置将有效地将其排回 20s。
更改此超时上限非常简单,尽管它要求您更改系统配置参数,因此您需要对框进行根访问权限(或让系统管理员同意为您更改该参数)。
相关的 sysctl 是 ,对于 IP v4 是 。tcp_syn_retriesnet.ipv4.tcp_syn_retries
在选择您更改的值时要保守。与 BSD 一样,SYN 重试延迟会及时增加(尽管增加一倍而不是三倍),因此重试数量的相对较少增加会导致最大连接超时的显著增加。在一个完美的世界中,有一个很高的超时没有问题,因为应用程序的连接超时将发挥作用。
但是,许多应用程序没有设置显式连接超时,因此,如果将内核设置为 10 分钟,当远程主机关闭时,您迟早会发现一些挂起了很久的东西!
我建议你把它设置为一个值 6, 7, 或最多 8。6 的有效连接超时上限约为 45 秒,7 提供约 90 秒,8 提供约 190 秒。
若要在正在运行的内核中更改此项,可以使用 /proc 接口:
# cat /proc/sys/net/ipv4/tcp_syn_retries
5
# echo 6 > /proc/sys/net/ipv4/tcp_syn_retries
或者使用 sysctl 命令:
# sysctl net.ipv4.tcp_syn_retries
net.ipv4.tcp_syn_retries = 5
# sysctl -w net.ipv4.tcp_syn_retries=6
net.ipv4.tcp_syn_retries = 6
若要使此值在重新启动期间粘接,但您需要将其添加到 :/etc/sysctl.conf
net.ipv4.tcp_syn_retries = 6
大多数 Linux 安装都支持从 中的文件读取系统,这通常是更好的做法,因为它更容易管理升级,所以我建议你把它放在一个文件中。/etc/sysctl.d
更多推荐
所有评论(0)