ag娱乐平台
你好,游客 登录 注册
背景:
阅读新闻

谈谈 TCP 的 TIME_WAIT

[日期:2019-04-01] 来源:zhenbianshu.github.io  作者:zhenbianshu [字体: ]

由来

ag娱乐平台,  再看佳能EOS-1D X Mark II,这款相机有第二代61点AF系统、36万像素 RGB+红外 测光感应器、全像素双核CMOS AF(全画幅)、DIGIC 6+处理器、CFast2.0存储卡、DCI 4K 60p等。这当中第二代61点AF系统、36万像素 RGB+红外 测光感应器、DIGIC 6+处理器等配置很有可能会下放给5D系列新机,而全像素双核CMOS AF(全画幅)和4K 60p也是备选项。未来如果佳能注重产品的性能,全像素双核CMOS AF技术会在全画幅生根发芽,只要像素不太高的产品都有可能采用该技术。比如未来EOS 6D的后续机。此外,EOS 80D上的7560像素 RGB+红外 测光感应器、Wi-Fi/NFC功能、云存储功能(百度云)、翻转触摸屏也会在中低端全画幅产品上出现。至于65点对焦和45点对焦未来几年将成为 APS-C中低端新品的下放资源。

  相同的命运促成了弱势三方在中国的合作。巨大的手机给英特尔和微软带来了希望,而与PC一样,通用的英特尔和微软软硬件平台也给国产手机厂商进入更高的设计生产层次创造了可能。粤媒:恒大低调好事 外援落差太大别说古德利不行  Alienware在高端PC机,笔记本,多媒体中心等方面推出了不少产品,旨在进一步推动消费者在家中、工作和出行途中新的数字生活方式。近日他们推出了基于英特尔欢跃技术平台的多媒体PC机——Area-51 3550和Area-51 5400。而在3月9日在德国汉诺威开幕CeBTI展会上,我们到了Area-51 3550多媒体PC机的身影。

最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O、机器性能外,还考虑到了网络协议的问题。

当然本文的主角并不是压测,后来分析证明同事果然还是想多了,瓶颈是在服务端。

分析起压机瓶颈的过程中,对于 TCP TIME_WAIT 状态的一个猜想引起了我的兴趣。由于之前排查问题时,简单地接触过这个状态,但并未深入了解,于是决定抽时间分析一下,拆解一下我的猜想。

TCP 的状态转换

我们都知道 TCP 的三次握手,四次挥手,说来简单,但在不稳定的物理网络中,每一个动作都有可能失败,为了保证数据被有效传输,TCP 的具体实现中也加入了很多对这些异常状况的处理。

状态分析

先用一张图来回想一下 TCP 的状态转换。

谈谈 TCP 的 TIME_WAIT

一眼看上去,这么多种状态,各个方向的连线,让人感觉有点懵。但细细分析下来,还是有理可循的。

首先,整个图可以被划分为三个部分,即上半部分建连过程,左下部分主动关闭连接过程和右下部分被动关闭连接过程。

再来看各个部分:建连过程就是我们熟悉的三次握手,只是这张图上多了一个服务端会存在的 LISTEN 状态;而主动关闭连接和被动关闭连接,都是四次挥手的过程。

查看连接状态

在 Linux 上,我们常用 netstat 来查看网络连接的状态。当然我们还可以使用更快捷高效的 ss (Socket Statistics) 来替代 netstat。

这两个工具都会列出此时机器上的 socket 连接的状态,通过简单的统计就可以分析出此时服务器的网络状态。

TIME_WAIT

定义

我们从上面的图中可以看出来,当 TCP 连接主动关闭时,都会经过 TIME_WAIT 状态。而且我们在机器上 curl 一个 url 创建一个 TCP 连接后,使用 ss 等工具可以在一定时长内持续观察到这个连续处于 TIME_WAIT 状态。

所以TIME_WAIT 是这么一种状态:TCP 四次握手结束后,连接双方都不再交换消息,但主动关闭的一方保持这个连接在一段时间内不可用。

那么,保持这么一个状态有什么用呢?

原因

上文中提到过,对于复杂的网络状态,TCP 的实现提出了多种应对措施,TIME_WAIT 状态的提出就是为了应对其中一种异常状况。

为了理解 TIME_WAIT 状态的必要性,我们先来假设没有这么一种状态会导致的问题。暂以 A、B 来代指 TCP 连接的两端,A 为主动关闭的一端。

  • 四次挥手中,A 发 FIN, B 响应 ACK,B 再发 FIN,A 响应 ACK 实现连接的关闭。而如果 A 响应的 ACK 包丢失,B 会以为 A 没有收到自己的关闭请求,然后会重试向 A 再发 FIN 包。

    如果没有 TIME_WAIT 状态,A 不再保存这个连接的信息,收到一个不存在的连接的包,A 会响应 RST 包,导致 B 端异常响应。

    此时, TIME_WAIT 是为了保证全双工的 TCP 连接正常终止。

  • 我们还知道,TCP 下的 IP 层协议是无法保证包传输的先后顺序的。如果双方挥手之后,一个网络四元组(src/dst ip/port)被回收,而此时网络中还有一个迟到的数据包没有被 B 接收,A 应用程序又立刻使用了同样的四元组再创建了一个新的连接后,这个迟到的数据包才到达 B,那么这个数据包就会让 B 以为是 A 刚发过来的。

    此时, TIME_WAIT 的存在是为了保证网络中迷失的数据包正常过期。

由以上两个原因,TIME_WAIT 状态的存在是非常有意义的。

时长的确定

由原因来推实现,TIME_WAIT 状态的保持时长也就可以理解了。确定 TIME_WAIT 的时长主要考虑上文的第二种情况,保证关闭连接后这个连接在网络中的所有数据包都过期。

说到过期时间,不得不提另一个概念: 最大分段寿命(MSL, Maximum Segment Lifetime),它表示一个 TCP 分段可以存在于互联网系统中的最大时间,由 TCP 的实现,超出这个寿命的分片都会被丢弃。

TIME_WAIT 状态由主动关闭的 A 来保持,那么我们来考虑对于 A 来说,可能接到上一个连接的数据包的最大时长:A 刚发出的数据包,能保持 MSL 时长的寿命,它到了 B 端后,B 端由于关闭连接了,会响应 RST 包,这个 RST 包最长也会在 MSL 时长后到达 A,那么 A 端只要保持 TIME_WAIT 到达 2MS 就能保证网络中这个连接的包都会消失。

MSL 的时长被 RFC 定义为 2分钟,但在不同的 unix 实现上,这个值不并确定,我们常用的 CentOS 上,它被定义为 30s,我们可以通过 /proc/sys/net/ipv4/tcp_fin_timeout 这个文件查看和修改这个值。

ab 的”奇怪”表现

猜想

由上文,我们知道由于 TIME_WAIT 的存在,每个连接被主动关闭后,这个连接就要保留 2MSL(60s) 时长,一个网络四元组也要被冻结 60s。而我们机器默认可被分配的端口号约有 30000 个(可通过 /proc/sys/net/ipv4/ip_local_port_range文件查看)。

那么如果我们使用 curl 对服务器请求时,作为客户端,都要使用本机的一个端口号,所有的端口号分配到 60s 内,每秒就要控制在 500 QPS,再多了,系统就无法再分配端口号了。

可是在使用 ab 进行压测时时,以每秒 4000 的 QPS 运行几分钟,起压机照样正常工作,使用 ss 查看连接详情时,发现一个 TIME_WAIT 状态的连接都没有。

分析

一开始我以为是 ab 使用了连接复用等技术,仔细查看了 ss 的输出发现本地端口号一直在变,到底是怎么回事呢?

于是,我在一台测试机启动了一个简单的服务,端口号 8090,然后在另一台机器上起压,并同时用 tcpdump 抓包。

结果发现,第一个 FIN 包都是由服务器发送的,即 ab 不会主动关闭连接。

谈谈 TCP 的 TIME_WAIT

登上服务器一看,果然,有大量的 TIME_WAIT 状态的连接。

但是由于服务器监听的端口会复用,这些 TIME_WAIT 状态的连接并不会对服务器造成太大影响,只是会占用一些系统资源。

小结


当然,高并发情况下,太多的 TIME_WAIT 也会给服务器造成很大的压力,毕竟维护这么多 socket 也是要消耗资源的,关于如何解决 TIME_WAIT 过多的问题,可以看 tcp短连接TIME_WAIT问题解决方法大全。

tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短连接”,
长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接的TIME_WAIT问题。


短连接最大的优点是方便,特别是脚本语言,由于执行完毕后脚本语言的进程就结束了,基本上都是用短连接。
但短连接最大的缺点是将占用大量的系统资源,例如:本地端口、socket句柄。
导致这个问题的原因其实很简单:tcp协议层并没有长短连接的概念,因此不管长连接还是短连接,连接建立->数据传输->连接关闭的流程和处理都是一样的。


正常的TCP客户端连接在关闭后,会进入一个TIME_WAIT的状态,持续的时间一般在1~4分钟,对于连接数不高的场景,1~4分钟其实并不长,对系统也不会有什么影响,
但如果短时间内(例如1s内)进行大量的短连接,则可能出现这样一种情况:客户端所在的操作系统的socket端口和句柄被用尽,系统无法再发起新的连接!


举例来说:假设每秒建立了1000个短连接(Web场景下是很常见的,例如每个请求都去访问memcached),假设TIME_WAIT的时间是1分钟,则1分钟内需要建立6W个短连接,
由于TIME_WAIT时间是1分钟,这些短连接1分钟内都处于TIME_WAIT状态,都不会释放,而Linux默认的本地端口范围配置是:net.ipv4.ip_local_port_range = 32768    61000
不到3W,因此这种情况下新的请求由于没有本地端口就不能建立了。


可以通过如下方式来解决这个问题:
1)可以改为长连接,但代价较大,长连接太多会导致服务器性能问题,而且PHP等脚本语言,需要通过proxy之类的软件才能实现长连接;
2)修改ipv4.ip_local_port_range,增大可用端口范围,但只能缓解问题,不能根本解决问题;
3)客户端程序中设置socket的SO_LINGER选项;
4)客户端机器打开tcp_tw_recycle和tcp_timestamps选项;
5)客户端机器打开tcp_tw_reuse和tcp_timestamps选项;
6)客户端机器设置tcp_max_tw_buckets为一个很小的值;



在解决php连接Memcached的短连接问题过程中,我们主要验证了3)4)5)6)几种方法,采取的是基本功能验证和代码验证,并没有进行性能压力测试验证,
因此实际应用的时候需要注意观察业务运行情况,发现丢包、断连、无法连接等现象时,需要关注是否是因为这些选项导致的


虽然这几种方法都可以通过google查询到相关信息,但这些信息大部分都是泛泛而谈,而且绝大部分都是人云亦云,没有很大参考价值。
我们在定位和处理这些问题过程中,遇到一些疑惑和困难,也花费了一些时间去定位和解决,以下就是相关的经验总结。

多了解原理遇到问题才能更快地找到根源解决,网络相关的知识还要继续巩固啊。

Linux公社的RSS地址ag娱乐平台/wwwc0b7linuxidcc0b7com/rssFeed.aspx

本文永久更新链接地址ag娱乐平台/wwwc0b7linuxidcc0b7com/Linux/2019-04/157874.htm

linux
相关资讯       TIME_WAIT  TCP TIME_WAIT 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
公安机关追回长春长生丢弃并意图损毁的60块硬盘 向老拳王广州恒大致敬!这是足球场上的红海行动 联合国官员称杜特尔特需“精神鉴定”中方回应 甘肃广东湖南三名厅级官员被提起公诉 均涉受贿罪 若输保级战曼萨诺前途仍未知 在大连解散进入休假 网贷行业重构新秩序:问题平台正退出历史舞台 曝皇马正忙着筹钱修球场 花4亿欧元改造伯纳乌 去年住房按揭贷款增幅放缓 外媒:难以接受美现有要求 朝鲜或谋求分阶段回报 英超官方宣布赛季最佳主帅 瓜迪奥拉压克洛普加冕 钱不能衡量一切,但手机可以 “北京八分钟”侧记:激情冬奥 相约北京
白宫:人事变动是因特朗普想在朝美谈判前组新团队 前外援贺辽篮夺冠 曾助辽宁终结八一48场连胜 棉花远期供应偏紧 网约车新政实施两年:执法趋严 打车难依旧突出 韩国统一副部长将访问朝鲜 查看离散家属会面场所 津沪大战金李两将谁主沉浮 数据狂人是最强武器 暗访北京一日游:三进店购物 不买被讽“铁公鸡” 234人年赚3.6亿,比特币矿机第一股背后秘密还很多 打假!真朴侵权聂卫平一案 正式进入司法流程 前辈:科维亚特的工作是半数车手的梦想 山东与兄弟省份存在哪些差距?省委书记这么回应 孙政才委托辩护人发表辩护意见(图)
马化腾:腾讯目标是成为各行各业的“数字化助手” 小米交一季度海外市场成绩单 欧洲地区增长率超999% 特朗普政府考虑削减千亿美元资本利得税 让富人更富 B站:App下架整顿时间从7月26日持续到8月25日 以色列总理:沙特同意向印往返以色列航班开放空域 卡佩罗:换下吴曦因为肌肉疲劳 比赛结果比较遗憾 大变化!下赛季CBA将没有球队使用三外援 马德里赛科维托娃力克普娃 进决赛与荷兰黑马争冠 日媒:香港探讨11月前部分解除日本食品进口限制 患精神病男子为看上海世博会出走 7年后找回家人 北京高颜值组合填补外援空缺 方硕:要感谢团队 上海安监局原局长齐峻涉受贿私分国有资产被公诉 中国南海完成超高温高压探井作业 技术跻身世界前列 ag娱乐平台