TIME_WAIT和CLOSE_WAIT的区别

本文解析了TCP连接断开过程中的TIME_WAIT和CLOSE_WAIT状态,解释了TIME_WAIT状态的作用,以及在服务器主动关闭连接时可能出现的问题。重点讨论了被动关闭方的CLOSE_WAIT状态和如何避免TIME_WAIT导致的延迟。

TIME_WAIT

四次挥手时,先发送FIN报文就会处于TIME_WAIT状态,这个是为了处理第三次挥手时,对方没有收到第四次挥手,从而多次发送第三次挥手(FIN报文)的情况,经过2MSL之后这个状态就会结束。一般的话,是客户端先向服务器发送FIN报文,则就是客户端处于TIME_wait状态。如果是服务器先发送FIN报文,会出现问题,先发送的就会处于那个TIME_WAIT的状态。服务器断开连接后,重启,会有一段时间重启不上,也就是那个bind()函数出错,得隔一段时间才能恢复,这个情况也可以设置一个TCP的可选项来关掉这个TIME_WAIT状态。

CLOSE_WAIT

这个是被动关闭连接方才有的状态。被动方收到FIN报文会立即返回ACK报文表示已接收到断开请求。
如果被动关闭连接方还有数据要发送就会进入CLOSE_WAIT状态。

在操作系统中查看 TCP 连接状态(包括 `TIME_WAIT` `CLOSE_WAIT`)可以通过多种方式实现,具体方法取决于操作系统类型(如 Linux 或 Windows)以及是否使用命令行工具或编程接口。 ### Linux 系统中查看 TCP 连接状态 #### 1. 使用 `netstat` 命令 `netstat` 是一个常用的网络统计工具,可以显示当前的 TCP 连接状态。 - 查看所有 TCP 连接状态: ```bash netstat -ant ``` - 查看特定状态的连接(例如 `TIME_WAIT`): ```bash netstat -ant | grep TIME_WAIT ``` - 查看特定状态的连接(例如 `CLOSE_WAIT`): ```bash netstat -ant | grep CLOSE_WAIT ``` #### 2. 使用 `ss` 命令 `ss`(Socket Statistics)是一个更高效的工具,用于查看网络连接状态。 - 查看所有 TCP 连接状态: ```bash ss -ant ``` - 查看特定状态的连接(例如 `TIME_WAIT`): ```bash ss -ant 'state time-wait' ``` - 查看特定状态的连接(例如 `CLOSE_WAIT`): ```bash ss -ant 'state close-wait' ``` #### 3. 使用 `/proc/net/tcp` 文件 Linux 系统中可以通过读取 `/proc/net/tcp` 文件来获取 TCP 连接信息。 - 查看 `/proc/net/tcp` 文件内容: ```bash cat /proc/net/tcp ``` 文件中每一行代表一个 TCP 连接,其中 `st` 字段表示连接状态。例如: - `01`: `ESTABLISHED` - `05`: `CLOSE_WAIT` - `06`: `LAST_ACK` - `07`: `TIME_WAIT` #### 4. 使用 Python 脚本获取 TCP 连接状态 通过 Python 的 `psutil` 库可以编程获取 TCP 连接状态。 ```python import psutil # 获取所有 TCP 连接 connections = psutil.net_connections() # 过滤出 TIME_WAIT CLOSE_WAIT 状态的连接 for conn in connections: if conn.status == 'TIME_WAIT' or conn.status == 'CLOSE_WAIT': print(conn) ``` ### Windows 系统中查看 TCP 连接状态 #### 1. 使用 `netstat` 命令 Windows 系统也支持 `netstat` 命令。 - 查看所有 TCP 连接状态: ```cmd netstat -an ``` - 查看特定状态的连接(例如 `TIME_WAIT`): ```cmd netstat -an | findstr TIME_WAIT ``` - 查看特定状态的连接(例如 `CLOSE_WAIT`): ```cmd netstat -an | findstr CLOSE_WAIT ``` #### 2. 使用 PowerShell 脚本 PowerShell 提供了更强大的功能,可以通过脚本获取 TCP 连接状态。 - 获取所有 TCP 连接: ```powershell Get-NetTCPConnection ``` - 过滤出 `TIME_WAIT` 状态的连接: ```powershell Get-NetTCPConnection | Where-Object { $_.State -eq "TimeWait" } ``` - 过滤出 `CLOSE_WAIT` 状态的连接: ```powershell Get-NetTCPConnection | Where-Object { $_.State -eq "CloseWait" } ``` ### 查看系统中 `TIME_WAIT` `CLOSE_WAIT` 的数量 #### Linux 系统 - 查看 `TIME_WAIT` 连接数量: ```bash ss -ant 'state time-wait' | wc -l ``` - 查看 `CLOSE_WAIT` 连接数量: ```bash ss -ant 'state close-wait' | wc -l ``` #### Windows 系统 - 查看 `TIME_WAIT` 连接数量: ```cmd netstat -an | findstr TIME_WAIT | find /c /v "" ``` - 查看 `CLOSE_WAIT` 连接数量: ```cmd netstat -an | findstr CLOSE_WAIT | find /c /v "" ``` ### 总结 通过上述方法,可以有效地在 Linux Windows 系统中查看 TCP 连接状态,尤其是 `TIME_WAIT` `CLOSE_WAIT` 状态的连接。这些工具脚本可以帮助快速诊断网络问题,并优化系统性能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值