FIN_WAIT1 能持续多久?你知道吗

FIN_WAIT1 能持续多久?你知道吗

2016-01-12 运维帮

原文:http://blogread.cn/it/article/7215?f=wb&luicode=10000359

作者:火丁笔记

前些天,一堆人在 TCPCopy (https://github.com/session-replay-tools/tcpcopy) 社区里闲扯蛋,有人提了一个问题:FIN_WAIT1 能持续多久?引发了一场讨论,期间我得到@wangbin579和多位朋友的点化,受益良多。

让我们热热身,通过一张旧图来回忆一下 TCP 关闭连接时的情况:

TCP Close

看图可知,主动关闭的一方发出 FIN,同时进入 FIN_WAIT1 状态,被动关闭的一方响应 ACK,从而使主动关闭的一方迁移至 FIN_WAIT2 状态,接着被动关闭的一方同样会发出 FIN,主动关闭的一方响应 ACK,同时迁移至 TIME_WAIT 状态。

回到开头的问题:FIN_WAIT1 能持续多久?一般情况下,服务器间的 ACK 确认是非常快的,以至于我们凭肉眼往往观察不到 FIN_WAIT1 的存在,不过网上也有很多案例表明在某些情况下 FIN_WAIT1 会持续很长时间,从而诱发问题。

最常见的误解是认为 tcp_fin_timeout 控制 FIN_WAIT1 的过期,从名字上看也很像,但实际上它控制的是 FIN_WAIT2 的过期时间,官方文档(https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt)是这样说的:

The length of time an orphaned (no longer referenced by any application) connection will remain in the FIN_WAIT_2 state before it is aborted at the local end. While a perfectly valid “receive only” state for an un-orphaned connection, an orphaned connection in FIN_WAIT_2 state could otherwise wait forever for the remote to close its end of the connection.
Cf. tcp_max_orphans
Default: 60 seconds

让我们通过一个实验来说明问题(服务端:10.16.15.107;客户端:10.16.15.109):

  1. 在服务端监听 1234 端口:「nc -l 1234」
  2. 在客户端连接服务端:「nc 10.16.15.107 1234」
    此时客户端连接进入 ESTABLISHED 状态
  3. 在服务端拦截响应:「iptables -A OUTPUT -d 10.16.15.109 -j DROP」
  4. 在客户端开启抓包:「tcpdump -nn -i any port 1234」
  5. 在客户端通过「ctrl + c」断开连接
    此时客户端连接进入 FIN_WAIT1 状态

随时可以通过「netstat -ant | grep :1234」来观察状态,最终抓包结果如下:

TCP Fin

第一个 FIN 是我们按「ctrl + c」断开连接时触发的,因为我们在服务端通过 iptables 拦截了发送给客户端的响应,所以对应的 ACK 被丢弃,随后执行了若干次重试。

此外,通过观察时间我们还能发现,第一次重试在 200ms 左右;第二次是在 400ms 左右;第三次是在 800ms 左右;以此类推,每次的时间翻倍。

实际上,控制这一行为的关键参数是 tcp_orphan_retries,官方文档(https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt)是这样说的:

This value influences the timeout of a locally closed TCP connection, when RTO retransmissions remain unacknowledged. See tcp_retries2 for more details.
The default value is 8. If your machine is a loaded WEB server, you should think about lowering this value, such sockets may consume significant resources. Cf. tcp_max_orphans.

如果你用 sysctl 查询 tcp_orphan_retries 是 0,那么实际等同于 8,看代码:

于是乎我们可以得出结论,如果你的系统负载较重,有很多 FIN_WAIT1,那么可以考虑通过降低 tcp_orphan_retries 来解决问题,具体设置多少视网络条件而定。

问题分析到这里原本可以完美谢幕,但是因为 TCP 有缺陷,导致 FIN_WAIT1 可能被用来发起DoS 攻击,所以我们就再唠十块钱儿的,看看到底是怎么回事儿:

假设服务端上有一个大文件,攻击者连接服务端发起请求,但是却不接收数据,于是乎就造成一种现象:客户端接收队列满,导致服务端不得不通过「zero window probes」来循环检测客户端是否有可用空间,以至于 tcp_orphan_retries 也没有用,因为服务端活活被憋死了,发不出 FIN 来,从而永远卡在 FIN_WAIT1。演示代码如下:

说明:通常文件大小以 100K 为佳,具体取决于 tcp_rmem / tcp_wmem 的大小。

怎么办?病急乱投医,重启服务!可惜没用,因为 FIN_WAIT1 已经脱离的服务的管辖范围,所以重启服务是没有用的,如果一定要重启,你只能重启服务器!

好在内核已经考虑到了此类问题,它提供了 tcp_max_orphans 参数,用来控制 orphans 的最大值,需要注意的是,和用来控制 TIME_WAIT 的最大值的 tcp_max_tw_buckets 参数一样,除非你遇到了 DoS 攻击,否则最好不要降低它。

花絮:我曾经试图寻找一些工具来杀掉 FIN_WAIT1 连接,如果你要杀掉一个 TCP 连接,那么需要知道相应的 ACK 和 SEQ,然后才可以 RESET 连接。为了获取 ACK 和 SEQ,一些工具采用的是被动机制,它通过监听匹配的数据包来获取需要的数据,代表是tcpkill;另一些工具采用的是主动机制,它通过伪造请求来获取需要的数据,代表是killcx,如果有兴趣的话不妨试试它们。

最后,再次感谢 TCPCopy 社区!如果你从本文学到些许知识,那么这份荣幸属于 TCPCopy社区,如果你在本文发现谬误之处,那么全因本人笨拙,还望不吝赐教。

时间: 2024-10-14 09:03:03

FIN_WAIT1 能持续多久?你知道吗的相关文章

股市的“僵尸”行情还要持续多久?

2014年已经过半,A股市场也迎来了"期中考核". 截至昨日收盘,上证综指报2036.51点,年内累计下跌约3.76%,深圳成指则报收7312.62点,上半年的累计跌幅亦高达9.96%.由于上证综指今年上半年的区间震幅只有10.31%,创出了有史以来最窄的上半年震幅,也使得投资者交易热情大打折扣,低迷市场行情导致今年上半年A股市场的日均换手率不足1%,日均成交金额只有1800亿元. 与深证成指和上证综指上半年表现全球垫底相比,境外主要股市在今年上半年却大多表现积极,美国道琼斯.纳斯达克

有钱花花园能持续多久呢

有钱花园游戏系统开发@找陈生:135-7001-0501可微电.有钱花园复利拆分游戏 有钱花园理财游戏开发 有钱花园游戏系统开发 有钱花园渠道开发 有钱花园系统开发 有钱花园app开发 有钱花园网页开发 [有钱花园]游戏是一款新式奇特的游戏,从正式上线以来会员人数不时添加,内测期渠道将发行20万朵玫瑰供注册开户,今后将不再发行玫瑰,玫瑰的产出是由最早地主出售流转,置办花朵只能从别的会员手中置办.跟着渠道的日益壮大,渠道将向一切[有钱花园]会员招商,渠道免费供给域名空间供会员开网店.届时渠道会员账

JAVA未来前景还能持续多久

信息时代到来了,在这个时代里,每个人都在"八仙过海,各显其能", 平凡的,享受现状,风清云淡的过着每一天,有能力的,则日子过的生声水起,但有个前提,就是要有自己的特长,比如你文笔好,可以当文案:你点子多,可以做策划等等,有人擅长多项技能,如果你现在做不到,那就最好先精通一项.2018年,如果你不知道学什么技能好,不如来看看JAVA开发. 有很多人一直在说JAVA现在已经饱和了,已经没有必要学Java,程序员已经是严重过剩,行业人才竞争状况更是恶性的之类的云云.现实真是这样嘛? Java

人工智能的浪潮将持续多久?

人工智能理论虽然提出得很早,但基本停滞已接近21世纪.1997年5月,IBM的深蓝计算机击败了国际象棋巨头卡斯帕罗夫,当时计算机可以在某些领域击败人类.这是人工智能迈向大众视野的标志. 21世纪以来,人工智能的发展速度在过去的20年里迅速增长.今年,在国家政策的支持下,许多高校在人工智能领域做出了自己的努力.几天前,教育部宣布允许35所高校开设人工智能专业. 从这一系列的行动中,不难看出,大学正在关注人工智能专业的水平,这也将促使考生申请该专业的考试.今年,人工智能产业可能会成为一个"繁荣期&q

关于FIN_WAIT1

前些天,一堆人在 TCPCopy 社区里闲扯蛋,有人提了一个问题:FIN_WAIT1 能持续多久?引发了一场讨论,期间我得到斌哥和多位朋友的点化,受益良多. 让我们热热身,通过一张旧图来回忆一下 TCP 关闭连接时的情况: TCP Close 看图可知,主动关闭的一方发出 FIN,同时进入 FIN_WAIT1 状态,被动关闭的一方响应 ACK,从而使主动关闭的一方迁移至 FIN_WAIT2 状态,接着被动关闭的一方同样会发出 FIN,主动关闭的一方响应 ACK,同时迁移至 TIME_WAIT 状

科技圈风云变幻,阿里能风光多久

摘要:昨晚,阿里巴巴在纽约证券交易所正式挂牌上市,截止收盘,阿里股价暴涨近四成,市值高达2314.39亿美元成为全球第二大互联网公司,第四大科技公司.如今,阿里和马云一起到达了巅峰,但在风云变幻的科技圈,阿里能风光多久? 盛极必衰.兵败如山倒是不变的游戏规则,但在科技圈这种残酷的规则会体现的更加淋漓尽致.不去预测阿里的未来,只是想在阿里一片锦绣.辉煌夺目的当下去缅怀一下那些曾经的传奇.小编绝不是仇富,也不是莫名的杞人忧天,只想时刻保持清醒的头脑,冷眼旁观.但其实,热闹是马云的,小编什么也没有.

教你如何使用硬件检测功能

1.硬件检测有什么作用? 新增硬件检测功能,电脑硬件信息一目了然. 打开电脑扣扣管家主程序,点击扣扣电脑管家的"工具栏"中的"硬件检测",将自动为您检测硬件信息. 硬件检测包含了CPU.主板.内存.显卡.显示器.硬盘.网卡.声卡,以及所有接入的USB设备等信息,几乎包含了您电脑上的全部设备信息,可以点击左侧的各标签页查看各类设备的信息. 同时,硬件检测还会实时监控当前的各硬件状态,包括温度.风扇转速和电压等等.您可以在电脑概览的右边栏看到各种表盘. 您可以点击右上角

为什么媒体集体唱衰迪信通转型

7月8日在国内有着21年历史的移动通讯连锁迪信通将在港交所挂牌上市.此前迪信通,曾经两度谋求海内外市场上市,一次是2005年前后准备香港上市最后因特殊原因取消筹备,另一次是2011年国内A股IPO失败.虽然此次在香港因获得虚拟运营商牌照终于成挂牌上市,但国内众多媒体都对曾经号称业界"手机连锁之王" 的迪信通转型并不看好,甚至出现了集体唱衰.其关键原因就是迪信通核心业务因持续盈利能力不足.毛利依赖率高,转型不明.且不管是实体连锁还是电商业务等在业内竞争都十分激烈,摆在其眼前,不管是对内还

正益移动:不仅仅送给你软件生产线

编者按:刚挂牌上市的正益移动,其商业模式对中国B2D2B市场具有标杆意义,从而也就有了剖析的价值."从整体来说,2D必然是赚不了钱的".没错,D(开发者)们多半不会为了基本的开发工具付钱.但是,如果这些工具及其方法能够便利和强劲到改变他们的工作方式的地步,那么他们一定会以BYOX(带着自己的工具.方法.习惯)的方式进入B(企业)中,并且与企业配置的相应生产线和作业系统协同工作.而正益移动正是向D们免费提供工具和培训,为企业配置2D的生产线和作业系统的2D服务商.从而实现了从2D经由BY