如何用命令查看TCP连接的详细状态?

在计算机网络管理和故障排查中,查看TCP连接状态是核心操作之一,无论是监控服务端口、识别异常连接,还是分析网络性能,都需要通过命令行工具快速获取TCP连接信息,不同操作系统(如Linux、Windows、macOS)提供的命令略有差异,但核心功能类似,下面将详细介绍各系统中常用的TCP连接查看方法。

怎么用命令查看tcp连接

Linux系统下查看TCP连接

Linux系统提供了多种命令查看TCP连接,其中最常用的是netstatss,此外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命令(推荐,更高效)

ssiproute2工具包的一部分,相比netstat更快速,默认显示TCP连接,且支持更丰富的过滤条件,常用参数与netstat类似:

参数 作用 示例
-t 显示TCP连接 ss -t
-l 显示监听连接 ss -l
-n 数字形式显示 ss -n
-p 显示进程信息 ss -p
-4/-6 仅显示IPv4/IPv6连接 ss -4
state 过滤连接状态(如ESTABLISHEDLISTEN 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连接。

怎么用命令查看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类似,支持netstatss命令,参数基本一致,同时也可使用lsof

netstat命令

macOS的netstat默认显示TCP连接,常用参数:

怎么用命令查看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:使用netstatss结合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:使用ssnetstat结合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

(0)
酷番叔酷番叔
上一篇 3小时前
下一篇 3小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信