Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TCP TIME_WAIT

TCP TIME_WAIT

原创
作者头像
用户1638080
修改于 2018-12-07 03:20:53
修改于 2018-12-07 03:20:53
2.2K0
举报
文章被收录于专栏:网络 后台网络 后台

TCP TIME_WAIT状态理解:

下面是tcp状态图(来自下面的参考文章):

从图中可以看出,若服务器主动关闭连接,在四次挥手的最后一个ACK后连接端口会变为TIME_WAIT状态, 状态停留时长为两个MSL(最大分段寿命),这个状态只有在主动关闭连接方会出现, 另一端可以在连接断开后立刻投入后续使用。

MSL是一个TCP分段可以存在于互联网系统中的最大时长,RFC 793指出MSL为2分钟, 但在LINUX系统中一般为30s,通过下面这个命令可以确定一些LINUX系统上的MSL数值:

sysctl net.ipv4.tcp_fin_timeout

当TCP连接处于TIME_WAIT这个状态时,标准中定义这个连接的插口(源Ip, 源端口,目的Ip,目的端口)不能再被使用,任何迟到的报文段都会被丢弃。 而大多数的TCP实现强加了更严格的限制, 在TIME_WAIT状态下,处于这个连接的本地端口默认情况下都不能再被使用,同时为了防止处于TIME_WAIT端口的主机出现故障,重启后马上建立新连接, RFC793有规定, TCP在重启动后的MSL秒内不能建立任何连接。

TIME_WAIT状态限制是比较严格的,设置TIME_WAIT状态主要有两个目的:

1、为了防止一个连接的延迟分段被后面新建的连接接收。连接是通过四元组(源Ip, 源端口,目的Ip,目的端口)来确定的, 虽然延迟包的序列号要满足新建连接的要求才能被接受,但是如果没有TIME_WAIT状态,新的连接还是有可以接收到上一个连接的延迟包,这个在RFC1337中有定义。

2、为了确保远程端已关闭连接。关闭端口的最后一个ACK有可能会丢失, 另一端可能会超时并重发最后的FIN, 保持TIME_WAIT状态可以让TCP再次发送最后的ACK。另外如果没有TIME_WAIT状态的话, 可以重新打开连接, 远程端可能会认为这个连接仍然是有效果的, 但它收到序列号匹配的SYN时, 它会回RST终止新连接并显示错误。

从上述两点原因来看, 有TIME_WAIT状态是比较保险的。


TCP TIME_WAIT可能出现问题以及参数调整:

当服务器上存在大量连接的时候,TIME_WAIT状态就会变得比较麻烦,连接表里有大量处于TIME_WAIT状态的连接,会导致新的连接不能够建立,同时它还会占用系统资源,这个就会限制服务器能处理的连接数目。

对于两个服务器之间处理数据, 它们的目标地址和目标端口可能是不变的, 在Linux上,默认情况下动态端口范围是49152~65535, 这也就意味着每分钟服务器之间能建立的连接是很有限的, 一旦被占用就不能投入使用了。

最好的解决办法还是增加更多的四元组组合(源IP,源端口, 目的IP,目的端口), 不过按照之前提到的,在更严格的限制下, 处于TIME_WAIT状态下的本地端口都不能再使用了。所以最好的不出错的解决方案是:

1、 通过修改net.ipv4.ip_local_port_range来增加客户端端口数目

2、 部署更多的客户端程序,能有更多的客户端IP。

有些时候可能会通过调整net.ipv4.tcp_tw_reusenet.ipv4.tcp_tw_recycle来尝试解决这个问题,但是这个都是有风险的,接下来会对这几个参数进行介绍。

和这方面相关的参数有以下几个:

l net.ipv4.tcp_fin_timeout

这个参数指定了在套接字强行关闭之前,等待最终FIN数据包的秒数, 对应的是主动关闭端FIN_WAIT-2的状态, 默认值是60s。通过修改这个值也可以缩短连接关闭时间,这个和TIME_WAIT的持续时间无关。FIN_WAIT-2套接字最多需要1.5k的内存,如果调长这个值,有可能的风险是大量套接字处于这个状态导致内存溢出,虽然单位占用内存少, 但是持续的时间长。

l net.ipv4.tcp_timestamps

这个参数可以被用于保障TCP传输的可靠性即用于PAWS机制,防范在高带宽下,TCP序列号在较短时间内就被重复使用,同一条TCP流在短时间内出现序号一样的两个合法数据包及其确认包。服务也可以通过包里带的时间戳,更加准确的计算RTT。

tcp_timestamp参数的默认取值为1, 表示收发包使用时间戳。 它的取值在Linux 4.10后的版本里做了些修改, 0表示关闭时间戳功能, 1 表示在收发包时不仅利用当前时间戳,还会利用每个连接生成的随机偏移量,2 表示只使用当前时间戳。

如果要使用后面两个参数,这个值需要置为非0。

*** 当tcp连接发起方处于NAT网络中, 向同一服务器发起请求时, 每个设备的时间戳不一定会递增, 有可能会导致有些连接一直被rst, 连接不上, 所以在NAT网络中的服务器开启timestamp有风险。

l net.ipv4.tcp_tw_reuse

为了提高高带宽下tcp的性能, RFC1323中定义了一个新的TCP选项, 包含了两个4字节时间戳字段, 第一个字段存储的是tcp发送选项时的当前时钟时间戳, 另一个字段存储的是从远端接收到的最新时间戳。

通过启用tcp_tw_reuse,如果新时间戳严格大于先前连接记录的时间戳, linux可以重复使用在TIME_WAIT状态的已有连接作为传出连接,发送数据, 这个传出连接在连接变为TIME_WAIT状态的1s之后就可以重用。

因为使用了时间戳, 重复的延迟包会带有过期的时间戳, 就会被丢弃, 因此避免了延迟包被新连接接收。此外也可以避免远程端丢失最后一个关闭连接的ACK,处于LASK-ACK状态而一直重发FIN,因为新建立的连接会发送一个SYN包, 它收到FIN包以后可以发送RST, 让远程端结束LASK-ACK状态。

这种方式对于传入连接没有什么帮助。

*** tcp_tw_reuse开启同样也有风险,正因为使用了时间戳,带着过期时间戳的包会被丢弃,因此同样会有上述所说问题, 在NAT网络中的客户端,有可能由于有些机器的时间戳远小于其他机器,导致tcp服务异常。

l net.ipv4.tcp_tw_recycle

启用这个选项,能够更快速的回收TIME_WAIT套接字,这种机制也依赖时间戳选项,它将会在超时重传(RTO)间隔后移除TIME_WAIT状态。

为了保证开启选项后, 也能达到TIME_WAIT状态同样的效果,它会记录远程端发来数据的最新时间戳,在TIME_WAIT状态生效期内,放弃所有时间戳小于记录时间戳的包。

*** 如果远端服务器处于NAT网络中, NAT网络中设备的机器时间戳可能不是统一的, 有可能会造成一些机器无法正常和远端通信,所有包都被丢弃,因此最好不要开启这个选项。

目前这个选项已经在Linux4.12以后的版本里被移除了。

参考文章:

https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Gitlab][docker]自托管代码平台Gitlab | 搭建/使用教程
GIT(必装):Git – Downloading Package (git-scm.com)。装完以后在目标文件夹右键会有Git Bash Here和Git GUI Here两个选项
夜梦星尘
2024/08/20
7960
[Gitlab][docker]自托管代码平台Gitlab | 搭建/使用教程
CI/CD Pipeline之Gitlab部署
GitLab是一个开源版本管理系统,是集代码托管,测试,部署于一体的开源git仓库管理软件,可通过web界面来进行访问公开的或私人项目。与Github类似,GitLab能够浏览代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本,并提供一个文件历史库。是目前非常流行好用的研发版本控制系统。
Power
2025/03/03
1130
ubuntu 安装和配置 GitLab
GitLab 是一个基于 Web 的开源 Git 软件仓库管理器,用 Ruby 编写,包括 wiki,问题管理,代码审查,监控以及持续集成和部署。它使开发人员能够创建,审查和部署他们的项目。
py3study
2020/03/03
12.8K1
Linux运维架构师-企业应用持续集成CICD-09
3、配置 Gitlab 1、查看Gitlab版本 [root@localhost ~]# head -1 /opt/gitlab/version-manifest.txt gitlab-ce 10.1.1 2、Gitlab 配置文登录链接 #设置登录链接 [root@localhost ~]# vim /etc/gitlab/gitlab.rb *** ## GitLab URL ##! URL on which GitLab will be reachable. ##! For more details
用户8639654
2021/07/07
4760
Gitlab安装使用及汉化配置
一、GitLab简介 GitHub是2008年由Ruby on Rails编写而成,与业界闻名的Github类似;但要将代码上传到GitHub上面,而且将项目设为私有还要收费。GitLab 是一个用于
shaonbean
2018/01/02
6.5K0
GitLab的安装部
以centos7为例,准备一台至少内存为4G的机器。 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:Gitlab-ce-11.10.1 硬件要求:最低2核4GB,建议4核8GB
没有故事的陈师傅
2020/06/17
1.3K0
gitlab部署
GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。
星哥玩云
2022/09/15
6680
gitlab部署
gitlab版本升级
day2,从12.10.6升级到12.10.14,然后从12.10.14升级到13.0.14【操作前备份一次】
保持热爱奔赴山海
2022/01/11
2K0
gitlab版本升级
Gitlab安装部署及基础操作
环境说明 系统版本 CentOS 7.2 x86_64(较新版本的gitlab集成了更多功能,顺利运行起来的硬件要求较高,这里给了3G内存) 软件版本 gitlab-ce-10.8.4
仙人技术
2020/04/29
5.5K0
Gitlab环境搭建小计
Gitlab 开源仓库软件包官方地址: https://about.gitlab.com/
owent
2018/08/01
1.2K0
docker gitlab构建镜像
最近在研究流水线,对于我来说,自动构建并上传镜像是非常有必要的,一方面每次都需要执行代码,一方面每次都需要找到版本号,非常的麻烦。 在此,我顺便编写文章,记录gitlab快速搭建以及ci/cd部署。
诺依阁
2025/03/16
1071
docker gitlab构建镜像
如何在 Alma Linux 8 上安装 GitLab?
GitLab 是一款免费的开源 DevOps 软件,它附带多种工具,可在单个应用程序中开发、保护和操作软件。它提供免费的无限存储库和无限的协作者。它主要用于托管 Git 存储库,并具有其他与开发相关的功能,例如问题跟踪。它与 Github 和 Bitbucket 非常相似,允许个人和团队与他人远程共享代码。
网络技术联盟站
2022/04/07
1.5K0
如何在 Alma Linux 8 上安装 GitLab?
私有仓库Gitlab的安装与汉化
清华大学源(gitlab-ce社区版 centos7下载):https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
非著名运维
2022/06/22
8310
私有仓库Gitlab的安装与汉化
试用 GitLab 14 以及中国发行版:极狐
时值 GitLab 14 大版本更新,官方对于这个版本给出了非常高的评价,让我非常好奇,所以为了探究新版本到底有哪些变化,我对 GitLab 社区版、极狐版做了试用对比。
soulteary
2021/07/08
1.5K1
试用 GitLab 14 以及中国发行版:极狐
Docker Compose部署Gitlab
一、配置 gitlab gitlab-ce 开启https # 参考: https://docs.gitlab.com/omnibus/settings/nginx.html#manually-configuring-https external_url 'https://gitlab.example.com' nginx['enable'] = true nginx['redirect_http_to_https'] = true # http重定向到https nginx['redirect_h
YP小站
2020/06/04
1.8K0
用GitLab搭建自己的私有GitHub
Gitlab是一个用Ruby on Rails开发的开源项目管理程序,可以通过WEB界面进行访问公开的或者私人项目。它和Github有类似的功能,能够浏览源代码,管理缺陷和注释。
知忆
2021/06/08
1.3K0
自建代码托管平台-GitLab
GitLab 是由 GitLabInc.开发,使用 MIT 许可证的基于网络的 Git 仓库管理工具,且具有wiki 和 issue 跟踪功能。使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。GitLab 由乌克兰程序员 DmitriyZaporozhets 和 ValerySizov 开发,它使用 Ruby 语言写成。后来,一些部分用 Go 语言重写。截止 2018 年 5 月,该公司约有 290 名团队成员,以及 2000 多名开源贡献者。GitLab 被 IBM,Sony,JülichResearchCenter,NASA,Alibaba,Invincea,O’ReillyMedia,Leibniz-Rechenzentrum(LRZ),CERN,SpaceX 等组织使用。
用户9615083
2022/12/25
1.7K0
Gitlab备份和恢复操作记录
前面已经介绍了Gitlab环境部署记录,这里简单说下Gitlab的备份和恢复操作记录: 1)Gitlab的备份目录路径设置 [root@code-server ~]# vim /etc/gitlab/gitlab.rb gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = "/data/gitlab/backups" //gitlab备份目录 gitlab_rails['backup_archive_permis
洗尽了浮华
2018/01/23
1.8K0
在Rocky Linux 8.3 RC1上安装GitLab实现代码仓库同步容灾
生产环境:Rocky Linux release 8.3, gitlab-ce-13.9.4-ce
欧巴云
2021/05/17
1.1K0
在Rocky Linux 8.3 RC1上安装GitLab实现代码仓库同步容灾
GitLab安装及使用
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
踏歌行
2020/10/15
7090
GitLab安装及使用
相关推荐
[Gitlab][docker]自托管代码平台Gitlab | 搭建/使用教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档