TIME_WAIT相关知识

四次挥手

这是TCP四次握手的过程图。

TCP 连接终止时,主机 1 先发送 FIN 报文,主机 2 进入 CLOSE_WAIT 状态,并发送一个 ACK 应答,同时,主机 2 通过 read 调用获得 EOF,并将此结果通知应用程序进行主动关闭操作,发送 FIN 报文。主机 1 在接收到 FIN 报文后发送 ACK 应答,此时主机 1 进入 TIME_WAIT 状态。

主机 1 在 TIME_WAIT 停留持续时间是固定的,是最长分节生命期 MSL(maximum segment lifetime)的两倍,一般称之为 2MSL。和大多数 BSD 派生的系统一样,Linux 系统里有一个硬编码的字段,名称为TCP_TIMEWAIT_LEN,在CentOS 7中可以通过cat /proc/sys/net/ipv4/tcp_fin_timeout看到是60

也就是说,Linux 系统停留在 TIME_WAIT 的时间为固定的 60 秒

请记住只有发起连接终止的一方会进入 TIME_WAIT 状态

TIME_WAIT 的作用

1.为了确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。

如果主机 1 没有维护TIME_WAIT状态,而直接进入CLOSED状态,它就失去了当前状态的上下文,只能回复一个RST操作,从而导致被动关闭方出现错误。

现在主机 1 知道自己处于TIME_WAIT的状态,就可以在接收到FIN报文之后,重新发出一个 ACK报文,使得主机 2 可以进入正常的CLOSED状态。

  1. 防止上一次连接中的包,迷路后重新出现,影响新连接

我们知道,在网络中,经常会发生报文经过一段时间才能到达目的地的情况,产生的原因是多种多样的,如路由器重启,链路突然出现故障等。如果迷走报文到达时,发现 TCP 连接四元组(源 IP,源端口,目的 IP,目的端口)所代表的连接不复存在,那么很简单,这个报文自然丢弃。

允许老的重复分节在网络中消逝 TCP分节可能由于路由器异常而"迷途",在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个原来的迷途分节就称为lost duplicate。 在关闭一个TCP连接后,马上又重新建立起一个相同的IP地址和端口之间的TCP连接,后一个连接被称为前一个连接的化身(incarnation)。那么有可能出现这种情况,前一个连接的迷途重复分组在前一个连接终止后出现,从而被误解成从属于新的化身,那么这个报文会被误认为是连接"化身"的一个 TCP 分节,这样就会对 TCP 通信产生影响------有可能把原连接的"化身"(新连接)给关闭。

经过 2MSL 这个时间,足以让两个方向上的分组都被丢弃,使得原来连接的分组在网络中都自然消失,再出现的分组一定都是新化身所产生的。

2MSL 的时间是从主机 1 接收到 FIN 后发送 ACK 开始计时的;如果在 TIME_WAIT 时间内,因为主机 1 的 ACK 没有传输到主机 2,主机 1 又接收到了主机 2 重发的 FIN 报文,那么 2MSL 时间将重新计时。道理很简单,因为 2MSL 的时间,目的是为了让旧连接的所有报文都能自然消亡,现在主机 1 重新发送了 ACK 报文,自然需要重新计时,以便防止这个 ACK 报文对新可能的连接化身造成干扰。

TIME_WAIT 的危害

过多的 TIME_WAIT 的主要危害有两种:

第一是内存资源占用,这个目前看来不是太严重,基本可以忽略。

第二是对端口资源的占用,一个 TCP 连接至少消耗一个本地端口。要知道,端口资源也是有限的,一般可以开启的端口为 32768~61000 ,也可以通过net.ipv4.ip_local_port_range指定,如果 TIME_WAIT 状态过多,会导致无法创建新连接。

TIME_WAIT过多的解决方法

解决方法有以下几种:

1.一个暴力的方法是通过 sysctl 命令,将系统值net.ipv4.tcp_max_tw_buckets调小。

2.调低 TCP_TIMEWAIT_LEN,重新编译系统

3.我们可以通过设置套接字选项,来设置调用 close 或者 shutdown 关闭连接时的行为,使用使用到的函数是int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen),具体的设置方法可以看一下《网络编程实战》

4.使用net.ipv4.tcp_tw_reuse选项。

此文章为11月Day 2学习笔记,内容来源于极客时间《网络编程实战》

相关推荐
roman_日积跬步-终至千里4 分钟前
【Starrocks】StarRocks 排错:`Invalid method name: ‘heartbeat‘`(BE 心跳端口/协议错误)
服务器·网络·php
松涛和鸣37 分钟前
34、 Linux IPC进程间通信:无名管道(Pipe) 和有名管道(FIFO)
linux·服务器·c语言·网络·数据结构·数据库
叽里咕噜怪42 分钟前
Ansible Playbook 从入门到精通:零基础玩转自动化部署与配置管理
网络·自动化·ansible
小虾米vivian1 小时前
dmetl5 web管理平台 监控-流程监控 看不到运行信息
linux·服务器·网络·数据库·达梦数据库
老蒋新思维1 小时前
创客匠人:从个人IP到知识变现,如何构建可持续的内容生态?
大数据·网络·人工智能·网络协议·tcp/ip·创客匠人·知识变现
老蒋新思维1 小时前
创客匠人洞察:从“个人品牌”到“系统物种”——知识IP的终极进化之路
网络·人工智能·网络协议·tcp/ip·重构·创客匠人·知识变现
lin张1 小时前
Ansible学习总结:从基础命令到Playbook实战
网络·学习·ansible
我是小邵1 小时前
“域名托管”和“SSL 证书缺失”是什么关系?
网络·网络协议·ssl
Henry Zhu1231 小时前
VPP中ACL源码详解第六篇:多核和性能优化实现以及调试与观测
运维·网络·网络协议·计算机网络·性能优化
qq_150841991 小时前
搭建一个基于星空组网的免费虚拟局域网
网络