在计算机网络管理和故障排查中,查看TCP连接状态是核心操作之一,无论是监控服务端口、识别异常连接,还是分析网络性能,都需要通过命令行工具快速获取TCP连接信息,不同操作系统(如Linux、Windows、macOS)提供的命令略有差异,但核心功能类似,下面将详细介绍各系统中常用的TCP连接查看方法。
Linux系统下查看TCP连接
Linux系统提供了多种命令查看TCP连接,其中最常用的是netstat
和ss
,此外lsof
也可用于关联进程信息。
netstat
命令(传统工具)
netstat
是Linux系统中经典的网络状态查看工具,虽然逐渐被ss
替代,但在许多旧系统或兼容场景中仍广泛使用,常用参数如下:
参数 | 作用 | 示例 |
---|---|---|
-a |
显示所有连接(包括监听和未监听) | netstat -a |
-t |
仅显示TCP连接 | netstat -t |
-u |
仅显示UDP连接 | netstat -u |
-l |
仅显示监听状态的连接 | netstat -l |
-n |
以数字形式显示IP和端口(不解析域名) | netstat -n |
-p |
显示连接对应的进程ID和名称 | netstat -p |
-anp |
组合参数:显示所有TCP连接,数字形式,并关联进程 | netstat -anp |
示例输出:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1234/mysqld
tcp 0 0 192.168.1.100:80 10.0.0.5:54321 ESTABLISHED 5678/nginx
tcp6 0 0 :::22 :::* LISTEN 9012/sshd
字段说明:
Proto
:协议(TCP/UDP);Local Address
:本地IP和端口;Foreign Address
:远程IP和端口;State
:连接状态(如LISTEN
监听、ESTABLISHED
已建立、TIME_WAIT
等待关闭等);PID/Program name
:进程ID和进程名(需root权限或netstat -p
)。
ss
命令(推荐,更高效)
ss
是iproute2
工具包的一部分,相比netstat
更快速,默认显示TCP连接,且支持更丰富的过滤条件,常用参数与netstat
类似:
参数 | 作用 | 示例 |
---|---|---|
-t |
显示TCP连接 | ss -t |
-l |
显示监听连接 | ss -l |
-n |
数字形式显示 | ss -n |
-p |
显示进程信息 | ss -p |
-4 /-6 |
仅显示IPv4/IPv6连接 | ss -4 |
state |
过滤连接状态(如ESTABLISHED 、LISTEN ) |
ss state ESTABLISHED |
示例:查看所有已建立的TCP连接并关联进程:
ss -tp state ESTABLISHED
lsof
命令(关联文件描述符)
lsof
(List Open Files)可查看进程打开的文件,网络连接在Linux中也被视为文件,因此可通过lsof
查看TCP连接并关联进程:
lsof -i :8080 # 查看8080端口的连接 lsof -i TCP # 查看所有TCP连接
Windows系统下查看TCP连接
Windows系统主要通过netstat
命令和PowerShell的Get-NetTCPConnection
cmdlet查看TCP连接。
netstat
命令
Windows的netstat
参数与Linux类似,但语法略有差异,常用参数如下:
参数 | 作用 | 示例 |
---|---|---|
-a |
显示所有连接 | netstat -a |
-n |
数字形式显示IP和端口 | netstat -n |
-o |
显示进程ID(PID) | netstat -o |
-an |
显示所有连接(数字形式) | netstat -an |
-ano |
显示所有连接、数字形式、PID | netstat -ano |
-b |
显示创建连接的可执行文件(需管理员权限) | netstat -b |
示例:查看所有TCP连接并显示PID:
netstat -ano
输出示例:
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:80 0.0.0.0:LISTENING 4
TCP 127.0.0.1:3306 127.0.0.1:54321 ESTABLISHED 1234
TCP 192.168.1.100:8080 10.0.0.5:12345 ESTABLISHED 5678
字段说明:
Proto
:协议;Local Address
:本地IP和端口;Foreign Address
:远程IP和端口;State
:连接状态;PID
:进程ID(可通过任务管理器查看对应进程)。
PowerShell命令(推荐,更详细)
PowerShell提供了Get-NetTCPConnection
cmdlet,可获取更丰富的TCP连接信息,包括进程名、本地/远程端口、状态等:
Get-NetTCPConnection | Where-Object {$_.State -eq "ESTABLISHED"} # 查看已建立的连接 Get-NetTCPConnection | Where-Object {$_.LocalPort -eq 8080} # 查看8080端口连接
输出示例:
LocalAddress LocalPort RemoteAddress RemotePort State ProcessName
----------- --------- ------------- ---------- ----- -----------
192.168.1.100 8080 10.0.0.5 12345 ESTABLISHED nginx
127.0.0.1 3306 127.0.0.1 54321 ESTABLISHED mysqld
macOS系统下查看TCP连接
macOS系统与Linux类似,支持netstat
和ss
命令,参数基本一致,同时也可使用lsof
。
netstat
命令
macOS的netstat
默认显示TCP连接,常用参数:
netstat -an # 显示所有连接(数字形式) netstat -an -p # 显示进程信息(需sudo权限) netstat -t # 仅显示TCP连接
ss
命令
macOS较新版本(如10.14+)支持ss
,语法与Linux一致:
ss -t state ESTABLISHED # 查看已建立的TCP连接 ss -l # 查看监听端口
lsof
命令
macOS的lsof
用法与Linux相同,可查看端口关联的进程:
lsof -i :22 # 查看22端口(SSH)连接 lsof -i TCP # 查看所有TCP连接
TCP连接状态说明
无论是哪个系统,TCP连接状态字段(如State
)是理解连接的关键,常见状态包括:
LISTEN
:监听状态,等待连接请求(如服务端口);ESTABLISHED
:已建立连接,双方可正常通信;TIME_WAIT
:连接关闭后等待一段时间,确保数据传输完成;CLOSE_WAIT
:被动关闭方等待应用程序关闭连接;SYN_SENT
:发送连接请求后等待确认;SYN_RECV
:收到连接请求后等待确认。
相关问答FAQs
Q1: 如何快速查看某个进程占用的TCP连接?
A1:
- Linux/macOS:使用
netstat
或ss
结合grep
过滤进程名或PID,netstat -anp | grep "nginx" # 查看nginx进程的所有连接 ss -tp | grep "PID=1234" # 通过PID过滤(ss需用grep "PID=")
- Windows:通过
netstat -ano
获取PID,再用任务管理器或PowerShell关联进程名:netstat -ano | findstr "5678" # 查看PID为5678的连接
或PowerShell:
Get-NetTCPConnection | Where-Object {$_.OwningProcess -eq 5678}
Q2: 如何统计当前系统TCP连接数及各状态分布?
A2:
- Linux/macOS:使用
ss
或netstat
结合awk
/sort
/uniq
统计,ss -t | awk 'NR>1{print $1}' | sort | uniq -c # 统计各状态TCP连接数 ss -t | wc -l # 统计总TCP连接数(含监听)
- Windows:通过
netstat
或PowerShell统计,netstat -ano | findstr "TCP" | findstr "ESTABLISHED" /c /i | wc -l # 统计已建立连接数
或PowerShell:
(Get-NetTCPConnection).State | Group-Object | Select-Object Name, Count # 各状态统计
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/15722.html