TIME_WAIT与tcp_tw_reuse /tcp_tw_recycle, 开还是不开?

对于这个问题找到的一些资料, 仅供参考:

------------------------------------------------------

  • 关于TIME_WAIT数量太多。从上面的描述我们可以知道,TIME_WAIT是个很重要的状态,但是如果在大并发的短链接下,TIME_WAIT 就会太多,这也会消耗很多系统资源。只要搜一下,你就会发现,十有八九的处理方式都是教你设置两个参数,一个叫tcp_tw_reuse,另一个叫tcp_tw_recycle的参数,这两个参数默认值都是被关闭的,后者recyle比前者resue更为激进,resue要温柔一些。另外,如果使用tcp_tw_reuse,必需设置tcp_timestamps=1,否则无效。这里,你一定要注意,打开这两个参数会有比较大的坑——可能会让TCP连接出一些诡异的问题(因为如上述一样,如果不等待超时重用连接的话,新的连接可能会建不上。正如官方文档上说的一样“It should not be changed without advice/request of technical experts”)。
    • 关于tcp_tw_reuse。官方文档上说tcp_tw_reuse 加上tcp_timestamps(又叫PAWS, for Protection Against Wrapped Sequence Numbers)可以保证协议的角度上的安全,但是你需要tcp_timestamps在两边都被打开(你可以读一下tcp_twsk_unique的源码 )。我个人估计还是有一些场景会有问题。
    • 关于tcp_tw_recycle。如果是tcp_tw_recycle被打开了话,会假设对端开启了tcp_timestamps,然后会去比较时间戳,如果时间戳变大了,就可以重用。但是,如果对端是一个NAT网络的话(如:一个公司只用一个IP出公网)或是对端的IP被另一台重用了,这个事就复杂了。建链接的SYN可能就被直接丢掉了(你可能会看到connection time out的错误)(如果你想观摩一下Linux的内核代码,请参看源码tcp_timewait_state_process)。
    • 关于tcp_max_tw_buckets。这个是控制并发的TIME_WAIT的数量,默认值是180000,如果超限,那么,系统会把多的给destory掉,然后在日志里打一个警告(如:time wait bucket table overflow),官网文档说这个参数是用来对抗DDoS攻击的。也说的默认值180000并不小。这个还是需要根据实际情况考虑。

Again,使用tcp_tw_reuse和tcp_tw_recycle来解决TIME_WAIT的问题是非常非常危险的,因为这两个参数违反了TCP协议(RFC 1122) 

其实,TIME_WAIT表示的是你主动断连接,所以,这就是所谓的“不作死不会死”。试想,如果让对端断连接,那么这个破问题就是对方的了,呵呵。另外,如果你的服务器是于HTTP服务器,那么设置一个HTTP的KeepAlive有多重要(浏览器会重用一个TCP连接来处理多个HTTP请求),然后让客户端去断链接(你要小心,浏览器可能会非常贪婪,他们不到万不得已不会主动断连接)。

来源:TCP 的那些事儿(上)

------------------------------------------------------

By default, when both tcp_tw_reuse and tcp_tw_recycle are disabled, the kernel will make sure that sockets in TIME_WAIT state will remain in that state long enough -- long enough to be sure that packets belonging to future connections will not be mistaken for late packets of the old connection.

When you enable tcp_tw_reuse, sockets in TIME_WAIT state can be used before they expire, and the kernel will try to make sure that there is no collision regarding TCP sequence numbers. If you enable tcp_timestamps (a.k.a. PAWS, for Protection Against Wrapped Sequence Numbers), it will make sure that those collisions cannot happen. However, you need TCP timestamps to be enabled on both ends (at least, that‘s my understanding). See the definition of tcp_twsk_unique for the gory details.

When you enable tcp_tw_recycle, the kernel becomes much more aggressive, and will make assumptions on the timestamps used by remote hosts. It will track the last timestamp used by each remote host having a connection in TIME_WAIT state), and allow to re-use a socket if the timestamp has correctly increased. However, if the timestamp used by the host changes (i.e. warps back in time), the SYN packet will be silently dropped, and the connection won‘t establish (you will see an error similar to "connect timeout"). If you want to dive into kernel code, the definition of tcp_timewait_state_process might be a good starting point.

Now, timestamps should never go back in time; unless:

  • the host is rebooted (but then, by the time it comes back up, TIME_WAIT socket will probably have expired, so it will be a non issue);
  • the IP address is quickly reused by something else (TIME_WAIT connections will stay a bit, but other connections will probably be struck by TCP RST and that will free up some space);
  • network address translation (or a smarty-pants firewall) is involved in the middle of the connection.

In the latter case, you can have multiple hosts behind the same IP address, and therefore, different sequences of timestamps (or, said timestamps are randomized at each connection by the firewall). In that case, some hosts will be randomly unable to connect, because they are mapped to a port for which the TIME_WAIT bucket of the server has a newer timestamp. That‘s why the docs tell you that "NAT devices or load balancers may start drop frames because of the setting".

Some people recommend to leave tcp_tw_recycle alone, but enable tcp_tw_reuse and lower tcp_timewait_len. I concur :-)

来源:Dropping of connections with tcp_tw_recycle

------------------------------------------------------

未看滴:

http://serverfault.com/questions/329845/how-to-forcibly-close-a-socket-in-time-wait

http://www.fromdual.com/huge-amount-of-time-wait-connections

http://stackoverflow.com/questions/26019164/too-many-time-wait-connections-getting-cannot-assign-requested-address

时间: 2024-10-06 09:30:18

TIME_WAIT与tcp_tw_reuse /tcp_tw_recycle, 开还是不开?的相关文章

android开发之-Android 开发之4.0界面设计原则-整理

设计原则: 一.让人着迷: 1.给人惊喜:使用漂亮的界面.精心的动画.适时的音乐. 2.真实的对象比按钮和菜单更有趣 这句话的意思是:使用描述描述性的图标作为快捷方式,界面美观 当然这个快捷方式是描述一个实体的,像一个人,不是扁平化的 3.个性化设计 提供个性化设计,提高亲切感和控制感.多设计几套个性化方案 4.记住人们的使用习惯,不要重复问 记住人们的使用习惯,不要重复问.多使用可以自动记住的控件,Autocomplete控件,不要每次询问操作 二.简单我的生活 1.使用简单词.短句子. 人们

tcp_timestamps,tcp_tw_reuse,tcp_tw_recycle,tcp_fin

解决这类问题,方法很重要,最好的做法其实是阅读官方的RFC,源码,然后进行实际测试验证. tcp_timestamps,tcp_tw_reuse,tcp_tw_recycle 几篇比较好的解释这三个参数的文章: https://serverfault.com/questions/502305/linux-networking-port-exhaustionhttp://perthcharles.github.io/2015/08/27/timestamp-intro/http://perthch

电脑开不开机 且开且珍惜

电脑开不开机了?这个确实有点棘手~不过大多数的时候都不会有太大问题~我在哈工大电脑110俱乐部做电脑义诊的时候也经常遇到这种情况,今天就和大家谈一谈经验. [按电源键,灯不亮,没反应]  这种情况 ,遇见过!这种情况多半是电脑拆机清灰之后或是电脑受到了重创. 有些不细心的志愿者拆机之后忘了把电源排线插上是时有发生的,这个不打紧,把键盘拆下,检查一下电源的排线是否正常,大多数都是没有插上. 还有一些时候,拆下键盘发现,“咦?!电源线插上了啊”,这是心里不免一阵惊悚,我当年拆自己电脑的时候就发现了这

phpstudy的apache端口没有被占用,也有vc9,防火墙也没开,也开杀毒软件,就是无法启动apache

我电脑装了一个独立的apche和一个phpstudy的apache,我学习是教学视频是php5.2而phpstudy刚好支持. 但是我在选取phpstudy的php版本5.3n以上就无法启动apache.若是安装vc9,v11等,这个我都安装了.还是只能支持低版本的php 我后来干脆就把phpstudy卸载重装,发现了好 也就是php高版本的需要用安装vc,在安装phpstudy

风格的发神经宫东风了开搞的开了房

http://blog.tianya.cn/post-5285480-80807520-1.shtmlhttp://blog.tianya.cn/post-5305168-80807532-1.shtmlhttp://blog.tianya.cn/post-5308827-80807541-1.shtmlhttp://blog.tianya.cn/post-5308828-80807554-1.shtmlhttp://blog.tianya.cn/post-5308829-80807564-1.

最新海南七星彩-重庆时时彩开奖网站开发源码

网站采用php+MySQL开发,独立开发,不开源. 网站级别模式:分公司-股东-总代理-代理-会员 七星彩加时时彩玩法只是其中一种,更多玩法可咨询,Q 156-349-8476 扣:一五六三四九八四七六,微信:funy9527. 总管理员页面: 管理员页面: 会员页面:

.NET 高级架构师 架构师之路(5)---开闭原则

2 开闭原则(Open-Closed Principle,OCP) 2.1 什么是开闭原则     开闭原则是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 1988年,Bertrand Meyer在他的著作<Object Oriented Software Construction>中提出了开闭原则,它的原文是这样:"Software entities should be open for e

槐花开

槐花开,槐花开 槐花香气扑鼻来 小羊咩咩叫 你怎么不摘下一朵来 槐花香,槐花香 槐花开过槐树壮 小羊咩咩叫 你怎么不摘下一把来 摘下来,摘下来 摘下一串槐花来 小羊咩咩叫 这是我最喜欢吃的菜 原创儿歌一首,送给所有程序员的孩子们.

windows开关机时间记录

1. 开机时间记录批处理文件,kai.bat 1 @echo off 2 3 echo %date% %time% 开机 >>D:\开关机记录\开关机时间.txt 2. 关机时间记录批处理文件,guan.bat @echo off echo %date% %time% 关机 >>D:\开关机记录\开关机时间.txt 3. 打开“运行”对话框(Win+R组合键或者在win7系统的搜索框中)输入gpedit.msc,打开“组策略编辑器”,依次展开“计算机配置→windows设置→脚本(