怎么查看进程的网络连接

系统问题

某个程序到底在跟谁通信,是不是在后台偷偷往外传东西,或者 8080 端口被谁占了——这些问题的落点其实是同一个动作:查看进程的网络连接。Windows 自己就带了好几套手段,图形界面的、命令行的都有,不用装任何东西就能看到本机每条连接归谁所有。

下面按“从最省事到最灵活”的顺序排。只想快点看到结果,跳过前面直接看资源监视器那段;想按端口、按状态精细过滤,命令行更趁手。

资源监视器:图形界面里按进程看连接

最省事的入口藏在任务管理器里。按 Ctrl+Shift+Esc 打开它,切到“性能”选项卡,页面底部就有一行“打开资源监视器”。更快的办法是 Win+R 输入 resmon 回车,直接跳过去。

进去之后点“网络”选项卡,布局分上下两半。上半部分是进程列表,每个进程后面跟着发送和接收的字节数;下半部分是“TCP 连接”和“监听端口”两张表,连接明细就在这里。

资源监视器的“网络”选项卡

想只看某一个程序,勾选它前面的复选框,下面两张表立刻只剩这个进程的记录。表里的“远程地址”就是它正在通信的对端 IP 和端口。UDP 的记录会出现在“监听端口”表里,状态那一列是空的,因为 UDP 没有握手过程,看不到 ESTABLISHED 这类状态属于正常现象,不是软件出问题。

netstat -ano,一行命令把 PID 也带出来

命令行派的常用套路是 netstat -ano。三个参数拆开看:-a 显示所有连接和监听端口,-n 让地址和端口直接以数字呈现(省掉反向域名解析,输出快很多),-o 在最后一列附上进程 PID(进程标识符,系统给每个运行中的进程分配的编号)。

输出的每一列含义如下:

列名 含义 举例
协议 TCP 或 UDP TCP
本地地址 本机的 IP 加端口,0.0.0.0 表示监听所有网卡 192.168.1.5:52310
外部地址 对端的 IP 加端口,监听状态下通常是 0.0.0.0:0 104.18.32.7:443
状态 连接当前处于哪个阶段 ESTABLISHED
PID 归属进程的编号,这就是关键 12684

全量输出动辄几十上百行,配合 findstr 过滤才好用:

  • netstat -ano | findstr LISTENING —— 只看正在监听的端口,找端口占用从这条开始。
  • netstat -ano | findstr ESTABLISHED —— 只看已经建立、正在传数据的连接。
  • netstat -ano | findstr :443 —— 只看和 443 有关的记录,冒号不能省。

命令提示符中执行 netstat -ano | findstr ESTABLISHED 的输出结果

有个小地方容易绕进去:findstr :443 是纯字符串匹配,外地地址里带 443 的行也会一起出来,结果比预想的多几条。不用较真,扫一眼最后一列的 PID 就能分辨。有一说一有二说二,平时排查我用得最多的还是这条命令,复制粘贴一下结果就出来了,比一层层点界面利索。

状态那列的几个值,含义值得记一下:

状态 含义
LISTENING 本机在监听端口,等人连进来
ESTABLISHED 双方已握手,正在通信
SYN_SENT 本机正在往外发起连接
TIME_WAIT 连接已关闭,等待超时回收,属于残留记录
CLOSE_WAIT 对方已经关了,本端还没跟上,多半是程序没处理干净
LAST_ACK 本端已发关闭请求,等对方最后确认

PID 拿到手了,怎么换成看得懂的进程名

netstat 只给编号不给名字,这一步得再补一条命令。在同一个命令行窗口里执行:

tasklist /fi "pid eq 12684"

把 12684 换成你实际看到的 PID,输出里就有进程名、内存占用和会话信息。如果这个进程是后台服务,加上 /svc 参数(tasklist /svc /fi "pid eq 12684")还能顺带看到它对应的服务名,比猜要靠谱得多。

PowerShell 里可以一步到位,连可执行文件路径都一起给出来:

Get-Process -Id 12684 | Select-Object ProcessName, Path

路径这一项在判断陌生程序时挺有用。正常的软件基本都待在 Program Files 或者用户目录下,如果某条连接的进程路径是临时文件夹或者一堆随机字符的目录,那就值得多看两眼。

PowerShell 的 Get-NetTCPConnection 输出更规整

Windows 8 之后系统自带了一个专门的 cmdlet(PowerShell 里的命令单元),叫 Get-NetTCPConnection。它把连接信息拆成了独立字段,方便排序和筛选,不像 netstat 那样需要靠文本切割。

按状态筛:Get-NetTCPConnection -State Established

按端口筛:Get-NetTCPConnection -LocalPort 443

想直接看到进程名,一条命令就够:

Get-NetTCPConnection -State Established | Select-Object LocalPort,RemoteAddress,RemotePort,State,@{n='Process';e={(Get-Process -Id $_.OwningProcess).ProcessName}}

反过来的需求也很常见——已经知道是哪个程序,想看它连了谁:

$p = Get-Process chrome | Select-Object -First 1; Get-NetTCPConnection | Where-Object OwningProcess -eq $p.Id

PowerShell 窗口中 Get-NetTCPConnection 输出的连接列表

它还有个附带好处:能直接作用于管道。想把当下的连接快照存成 CSV 慢慢比对,Get-NetTCPConnection | Export-Csv conn.csv -Encoding UTF8 就完事了,netstat 得靠重定向,格式还得自己整理。

端口被占用时怎么揪出占用它的进程

这是最典型的使用场景。启动服务报“端口已被占用”,但你不知道是谁占的。步骤就三步,串起来是一条链:先 netstat -ano | findstr :8080 拿到最后一列的 PID,再用 tasklist /fi "pid eq 那个PID" 换成进程名,确认之后才谈得上处理。

判断的时候认准 LISTENING 那几行,它才是真正占着端口不放的。TIME_WAIT 只是连接关闭后的残留状态,过一两分钟自己就消失了,不用管。翻来覆去查了半天,结果凶手就一个 PID 安安静静蹲在那,那感觉挺微妙的。

确认无误要结束进程的话,taskkill /f /pid 12684 直接干掉,PowerShell 里对应 Stop-Process -Id 12684 -Force。不过先看清楚这是个什么进程再动手,系统服务或者数据库进程被杀掉,连带的影响可能比端口冲突本身还麻烦。

任务管理器里翻不到连接列表,是正常的

不少人第一反应是打开任务管理器的“进程”选项卡找连接,翻了半天没找到,以为系统藏着掖着。其实那儿的“网络”一列显示的是实时吞吐量,也就是每秒发送接收了多少字节,属于速率统计,跟“这条连接连到了哪个 IP”完全是两码事。任务管理器压根没打算做连接级展示。

想按进程看连接,路径就是前面说的两条:资源监视器看界面,netstat 或 Get-NetTCPConnection 看命令行。Win10 和 Win11 在这点上没区别,不用特意换系统版本去试。

要实时刷新和进程路径,试试 Sysinternals 那套工具

微软官方的 Sysinternals 工具集里有两个专门干这个的。TCPView 会实时列出每条连接,一行显示进程名、PID、协议、本地地址、远程地址和状态,用颜色区分监听、已建立、正在关闭这几种情况,刷新间隔能自己调。它比 netstat 多出来的地方在于能直接透出进程路径,还能右键关掉单条连接,不用整个进程一起杀。

Process Explorer(任务管理器的加强版)也带这个功能,在进程属性窗口的 TCP/IP 选项卡里能看到该进程的全部连接。两个工具都是绿色版,解压就能跑,从微软官方站点下就行,别从别处随便抓安装包。想更直观地看连接随时间的进出变化,这类工具确实占优势。

Linux 和 macOS 上的对应做法

顺手把非 Windows 系统的命令列一下,换机器排查时不用重新查。Linux 上现代发行版推荐 ss -tunap-p 会显示进程名,但普通用户只能看到自己启动的进程,要看全得加 sudo。老一些的系统还是 netstat -tunap,只是 net-tools 这个包很多新版本默认不装了。macOS 上通用的是 lsof -i -P -n,加个 grep 过滤监听端口:sudo lsof -i -P -n | grep LISTEN。macOS 自带的 nettop 也能按进程看流量,不过界面偏原始,用起来不如 lsof 顺手。

系统 命令 特点
Windows netstat -ano 全系统可用,需搭配 tasklist 查进程名
Windows Get-NetTCPConnection 字段结构化,可排序、可导出 CSV
Linux ss -tunap 速度快,新发行版默认自带
Linux lsof -i -P -n 按文件描述符列,信息最全
macOS lsof -i -P -n 同样是主流选择,需 sudo 看全量

三种系统思路是一致的:先列出连接和归属编号,再把编号翻译成进程名,最后才判断这个连接该不该存在。

操作系统种类多样、版本繁杂,本文内容可能无法完全匹配你的具体环境,不保证完全正确或普遍适用,仅供操作参考。