源码面前出真相,我们看看tcp_tw_reuse的作用是什么。这个过程很简单。...tcp_tw_reuse设置的是内核变量sysctl_tcp_tw_reuse,而这个变量仅在tcp_twsk_unique函数中使用。...也就是说tcp_tw_reuse仅在TCP套接字作为客户端,调用connect时起作用。绝大部分的TCP服务器,应该不会有大量主动连接的动作(或许会连接DB等,但一般也是长连接)。...本文重点就是为了纠正各种资料的“以讹传讹”,大家都没有认真看过tcp_tw_reuse是如何工作的,就建议服务端打开这个选项,这种传播知识的方式,窃以为不可取。
. - tcp_tw_reuse 和 SO_REUSEADDR 是两个完全不同的东西 SO_REUSEADDR 允许同时绑定 127.0.0.1 和 0.0.0.0 同一个端口; SO_RESUSEPORT...TIME-WAITstate on busy Linux servers tcp短连接TIME_WAIT问题解决方法大全(3)——tcp_tw_recycle tcp短连接TIME_WAIT问题解决方法大全(4)——tcp_tw_reuse
关于 TIME_WAIT 情况的配置指令 开启 tcp_tw_reuse echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 进行测试 ?...此结论证明, 当本地端口将耗尽时, 可以尝试开启 tcp_tw_reuse 进行端口重用. It's not SO_REUSEADDR socket option....但是似乎跟 tcp_tw_reuse 哪里不太一样? 对比开启 tcp_tw_reuse 的netstat检测结果, 看看有什么差异....默认开启, 他是记录标记时间戳 tcp_tw_reuse 是怎么工作的 如果开启了 tcp_tw_reuse, 如果客户端发来的时间戳大于先前连接内核记录的最新时间戳, 则 Linux 将重新使用状态中的现有连接以...所以最终建议可以开启 tcp_tw_reuse, 禁用 tcp_tw_recycle. 7. 附TCP状态图 ?
. - tcp_tw_reuse 和SO_REUSEADDR 是两个完全不同的东西 1. tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开) 2....TIME-WAITstate on busy Linux servers tcp短连接TIME_WAIT问题解决方法大全(3)——tcp_tw_recycle tcp短连接TIME_WAIT问题解决方法大全(4)——tcp_tw_reuse
TCP_TW_REUSE This allows reusing sockets in TIME_WAIT state for new connections when it is safe from...It is generally a safer alternative to tcp_tw_recycle Note: The tcp_tw_reuse setting is particularly...tcp_tw_reuse vs tcp_tw_recycle : Which to use (or both)?...tcp_tw_reuse 参考 tcp_tw_reuse只在连接时起作用 被抛弃的tcp_recycle tcp_tw_reuse设置的是内核变量sysctl_tcp_tw_reuse,而这个变量仅在...SO_REUSEADDR对应tcp_tw_reuse 总结 tcp_tw_reuse和tcp_tw_recycle都需要通信双方开启net.ipv4.tcp_timestamps(默认开启的
Reuse) [root@skycloud1 ipv4]# cd /proc/sys/net/ipv4 [root@skycloud1 ipv4]# more /proc/sys/net/ipv4/tcp_tw_reuse...0 [root@skycloud1 ipv4]# echo 1 > tcp_tw_reuse [root@skycloud1 ipv4]# more /proc/sys/net/ipv4/tcp_tw_reuse
因为开启 tcp_tw_reuse 参数可以快速复用处于 TIME_WAIT 状态的 TCP 连接时,相当于缩短了 TIME_WAIT 状态的持续时间。...为什么 tcp_tw_reuse 默认是关闭的? 通过前面这么多铺垫,终于可以说这个问题了。 开启 tcp_tw_reuse 会有什么风险呢?我觉得会有 2 个问题。...第一个问题 我们知道开启 tcp_tw_reuse 的同时,也需要开启 tcp_timestamps,意味着可以用时间戳的方式有效的判断回绕序列号的历史报文。...因为客户端开启了 tcp_tw_reuse,于是快速复用 TIME_WAIT 状态的端口,又与服务端建立了一个与刚才相同的四元组的连接。...第二个问题 开启 tcp_tw_reuse 来快速复用 TIME_WAIT 状态的连接,如果第四次挥手的 ACK 报文丢失了,有可能会导致被动关闭连接的一方不能被正常的关闭,如下图: 总结 tcp_tw_reuse
tcp_tw_reuse:顾名思义就是复用TIME_WAIT连接。当创建新连接的时候,如果可能的话会考虑复用相应的TIME_WAIT连接。...通常认为「tcp_tw_reuse」比「tcp_tw_recycle」安全一些,这是因为一来TIME_WAIT创建时间必须超过一秒才可能会被复用;二来只有连接的时间戳是递增的时候才会被复用。...举例来说:客户端向服务端发起HTTP请求,服务端响应后主动关闭连接,于是TIME_WAIT便留在了服务端,此类情况使用「tcp_tw_reuse」是无效的,因为服务端是被连接方,所以不存在复用连接一说。...让我们延伸一点来看,比如说服务端是PHP,它查询另一个MySQL服务端,然后主动断开连接,于是TIME_WAIT就落在了PHP一侧,此类情况下使用「tcp_tw_reuse」是有效的,因为此时PHP相对于...说明:如果使用tcp_tw_reuse,请激活tcp_timestamps,否则无效。 tcp_max_tw_buckets:顾名思义就是控制TIME_WAIT总数。
tcp_tw_recycle时会导致部分通过NAT上网client无法正确连接服务器,故障表现为client发出SYN后无法收到server返回 的SYN+ACK,推荐的解决方法是关闭tcp_tw_recycle,打开tcp_tw_reuse...lvs处于NAT模式(咱们是DR); 2.客户端处于NAT模式; 3.IDC处于NAT模式;有人对国内的节点做了一个可视化分析,发现有2.61%的概率出口存在NAT的这种情况; 在服务器上最好打开tcp_tw_reuse...tcp_tw_reuse和tcp_tw_recycle区别: 1. tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开) 2. tw_reuse
proc/sys/net/ipv4/ip_local_port_range 22768 61000 cat /proc/sys/net/ipv4/tcp_max_tw_buckets 20000 开启tcp_tw_reuse...这个问题Linux其实早就有了解决方案,那就是tcp_tw_reuse这个参数。...echo '1' > /proc/sys/net/ipv4/tcp_tw_reuse 事实上TIME_WAIT过多的原因是其回收时间竟然需要1min,这个1min其实是TCP协议中规定的2MSL时间,而...return 1; } return 0; } 上面这段代码逻辑如下所示: 在开启了tcp_timestamp以及tcp_tw_reuse的情况下,在Connect搜索port时只要比之前用这个...多配几台Backend/开启tcp_tw_reuse或许是不错的选择。 总结 应用再强大也还是承载在内核之上,始终逃不出Linux内核的樊笼。所以对于Linux内核本身参数的调优还是非常有意义的。
proc/sys/net/ipv4/ip_local_port_range 22768 61000 cat /proc/sys/net/ipv4/tcp_max_tw_buckets 20000 开启tcp_tw_reuse...这个问题Linux其实早就有了解决方案,那就是tcp_tw_reuse这个参数。...echo '1' > /proc/sys/net/ipv4/tcp_tw_reuse 事实上TIME_WAIT过多的原因是其回收时间竟然需要1min,这个1min其实是TCP协议中规定的2MSL时间,而...在开启了tcp_timestamp以及tcp_tw_reuse的情况下,在Connect搜索port时只要比之前用这个port的TIME_WAIT状态的Socket记录的最近时间戳>1s,就可以重用此port...多配几台Backend/开启tcp_tw_reuse或许是不错的选择。 总结 应用再强大也还是承载在内核之上,始终逃不出Linux内核的樊笼。所以对于Linux内核本身参数的调优还是非常有意义的。
不少文章提到同时开启tcp_tw_recycle和tcp_tw_reuse,会带来C/S在NAT方面的异常。...个人接受的做法是,开启tcp_tw_reuse,增加ip_local_port_range的范围,减小tcp_max_tw_buckets和tcp_fin_timeout的值(参考这里和这里) ----...1 net.ipv4.tcp_tw_reuse=1 查询命令: 1 cat /proc/sys/net/ipv4/tcp_tw_reuse 默认值:0 作用:针对TIME-WAIT,做为客户端可以启用...sys/fs/file-max 默认值:804894 作用:文件描述符的最大值 ---- 参考资料 ---- [1]Linux内核高性能优化【生产环境实例】 [2]linux内核参数解释说明 [3]tcp_tw_reuse
ipv4/tcp_tw_recycle echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle 打开空的tcp连接允许回收利用 cat /proc/sys/net/ipv4/tcp_tw_reuse...echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 不做洪水抵御 cat /proc/sys/net/ipv4/tcp_syncookies echo 0 > /proc.../proc/sys/net/core/somaxconn echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
从抓包图可以看出,服务端主动发起的 FIN 报文,所以是服务端处于 TIME_WAIT 状态,所以 tcp_tw_reuse 这个参数不会是导致 TIME_WAIT 状态被快速回收的原因,因为这个参数是用于连接发起方...然后,想到了 Linux 两个快速回收 TIME_WAIT 状态的参数 tcp_tw_reuse 和 tcp_tw_recycle,其中 tcp_tw_reuse 参数是用于连接放起方,而本次的案例
/* how long to wait to destroy TIME-WAIT * state, about 60 seconds */ Linux自然也考虑到了这种情况,所以提供了一个tcp_tw_reuse...return 1; } return 0; } 上面这段代码逻辑如下所示: 在开启了tcp_timestamp以及tcp_tw_reuse的情况下,在Connect搜索port时只要比之前用这个...我们可以通过下面命令开始tcp_tw_reuse: echo '1' > /proc/sys/net/ipv4/tcp_tw_reuse ESTABLISHED状态端口号搜索 ESTABLISHED的端口号搜索就简单了许多
有一种方式可以在建立新连接时,复用处于 TIME_WAIT 状态的连接,那就是打开 tcp_tw_reuse 参数。...tcp_tw_reuse 从协议角度理解是安全可控的,可以复用处于 TIME_WAIT 的端口为新的连接所用。 什么是协议角度理解的安全可控呢?...我们来看看开启了 tcp_tw_reuse 功能,如果四次挥手中的最后一次 ACK 在网络中丢失了,会发生什么?...上图的流程: 四次挥手中的最后一次 ACK 在网络中丢失了,服务端一直处于 LAST_ACK 状态; 客户端由于开启了 tcp_tw_reuse 功能,客户端再次发起新连接的时候,会复用超过 1 秒后的...所以大家都会说开启了 tcp_tw_reuse,可以在复用了 time_wait 状态的 1 秒过后成功建立连接,这 1 秒主要是花费在 SYN 包重传。
但只能缓解问题,不能根本解决问题; 3)客户端程序中设置socket的SO_LINGER选项; 4)客户端机器打开tcp_tw_recycle和tcp_timestamps选项; 5)客户端机器打开tcp_tw_reuse...p=416 方法5: tcp_tw_reuse选项的含义如下(http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt): tcp_tw_reuse...we fall back to VJ’s scheme and use initial timestamp retrieved from peer table. */ //从代码来看,tcp_tw_reuse...选项和tcp_timestamps选项也必须同时打开;否则tcp_tw_reuse就不起作用 //另外,所谓的“协议安全”,从代码来看应该是收到最后一个包后超过1s if (tcptw->tw_ts_recent_stamp...rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp; sock_hold(sktw); return 1; } return 0; } 总结一下: 1)tcp_tw_reuse
oracle数据库,需要对kernel.shmmax shmmni shmall sem fs.file-max优化 web应用服务器,需要net.ipv4.ip_local_port_range tcp_tw_reuse
/* how long to wait to destroy TIME-WAIT * state, about 60 seconds */ Linux自然也考虑到了这种情况,所以提供了一个tcp_tw_reuse...在开启了tcp_timestamp以及tcp_tw_reuse的情况下,在Connect搜索port时只要比之前用这个port的TIME_WAIT状态的Socket记录的最近时间戳>1s,就可以重用此port...我们可以通过下面命令开始tcp_tw_reuse: echo '1' > /proc/sys/net/ipv4/tcp_tw_reuse ESTABLISHED状态端口号搜索 ESTABLISHED的端口号搜索就简单了许多
只要搜一下,你就会发现,十有八九的处理方式都是教你设置两个参数,一个叫tcp_tw_reuse,另一个叫tcp_tw_recycle的参数,这两个参数默认值都是被关闭的,后者recyle比前者resue...另外,如果使用tcp_tw_reuse,必需设置tcp_timestamps=1,否则无效。...关于tcp_tw_reuse。...官方文档上说tcp_tw_reuse 加上tcp_timestamps(又叫PAWS, for Protection Against Wrapped Sequence Numbers)可以保证协议的角度上的安全...Again,使用tcp_tw_reuse和tcp_tw_recycle来解决TIME_WAIT的问题是非常非常危险的,因为这两个参数违反了TCP协议(RFC 1122) 其实,TIME_WAIT表示的是你主动断连接
领取专属 10元无门槛券
手把手带您无忧上云