§ 9.5 · Section

netstat / ss

Listening Ports · Connections · PID · TIME_WAIT · Loopback

前四节的镜头一直对着"外面":ping 看路通不通,traceroute 看路怎么绕,nslookup 看名字翻得对不对,curl 看远方服务器回了什么。本节把镜头掉转 180 度,对准你自己的电脑:"网站连不上"的病,有一半根本不在外面,而在本机——服务没起来、端口被占了、防火墙拦了、或者某个程序在偷偷联网。netstat 和 ss 就是本机的来访登记簿:哪扇门开着等人(端口在监听)、哪些客人正在屋里会面(连接已建立)、门牌是谁家的(进程 PID)——一张表全列出来。程序员天天撞上的"端口被占用",答案就在这张表里。

生活场景
📒 小区门卫的来访登记簿

一个管理规范的小区,门卫室有一本登记簿,页页三栏:谁来过、找谁、现在什么状态。随手一翻就知道:3 栋 502 在等客人(灯亮着、门开着);2 栋 101 家里正坐着两位访客,聊了四十分钟了;还有几户刚送走客人,主人还站在门口道别没进屋。
你想找的人到底在不在家?客人到底来没来?别挨家敲门了——翻登记簿。

你的电脑就是这个小小区:每个联网的程序是一户,端口是门牌,"监听"是亮灯等人,"已建立"是正在会客,"TIME_WAIT"是刚送走客人还在门口道别。netstat / ss,就是那本登记簿。

先把这一节的术语翻译成人话

照例,术语表先行。本节的名词全是"门房视角"的:

术语换成大白话生活原型
端口(Port)说白了就是"同一栋楼里的房间号"——数据找到楼还得找对门IP 是小区门牌,端口是户号
监听(LISTEN)说白了就是"开着门等人来"——服务就绪的姿态窗口亮灯营业中
netstat"网络状态表"——看本机所有门和会话的老牌工具门卫的老登记簿
ssnetstat 的年轻接班人——同样的账,翻得快得多门卫新换的电子台账
PID进程编号——占着那个门的是哪位住户在物业登记的身份号
本地地址 / 远程地址会话两头的"谁和谁"——各带门牌号登记簿的"来访人 / 受访户"两栏
ESTABLISHED会话已建立——两边正聊着客人在屋里,茶已倒上
TIME_WAIT刚结束的会话在收尾——等最后一声道别落地送客到楼下,人走了还在挥手
0.0.0.0"这扇门对所有网卡开放"——谁家的网都接待临街正门,路人皆可叩
127.0.0.1回环地址——"只接自家内线",外人不通大院里的内线电话
套接字(Socket)IP + 端口凑成的一对——一扇具体的门"某小区某栋某户"的完整地址

三十秒复习:端口,一栋楼里的房间号

第 3 章 § 3.2 讲 TCP 时埋的概念,这里复习到够用。IP 地址负责把数据送到正确的(那台机器),端口负责送进正确的房间(那个程序)。一台电脑同时开着浏览器、微信、游戏、音乐软件——数据包涌进来时靠什么分家?就靠端口号:每个程序守着自己的门。约定俗成的门牌号不少:网页服务守 80 和 443,SSH 守 22,邮件收发守 25/110/143/993……这叫"知名端口",是全网通用的房间号惯例。

不妨这样想整条链路:域名是单位名(§ 9.3 查号台翻成 IP),IP 是楼,端口是房间。上一节 curl 报的 Connection refused,翻成门房语言就是:"楼是找到了,可那间房没亮灯"——门口没人在等客,敲门自然没人应。至于是"服务没起来"还是"压根没这个服务",翻开本节的登记簿便知分晓。

既然说到房间号惯例,把常客名单一次列全——查登记簿时见到这些号,基本能猜出门后是谁:

端口门后是谁一句话备注
22SSH 远程登录管理机房服务器的正门,也是黑客最爱敲的门
53DNS上一节的查号台窗口
80 / 443HTTP / HTTPS网页世界的两扇大门(明门与加密门)
3306MySQL 数据库只该对内开的门,出现在公网监听里就是事故
3389Windows 远程桌面居家办公的常用门,也是扫描器的重点关照对象
8080开发者的"自留地"本地起网站的默认习惯门牌,本节病例的主角

另一半号码则是临时门牌:系统给每个出门的连接随机发一个五位数上下的号(比如 51234),用完收回。这就是为什么登记簿里本地端口一会是 443(守门等人)、一会是五位数(出门办事)——一扇是店门,一张是排队取的号。看到这儿再回头看那张表,一半的数字你已经认识了。

第一次出手:一张来访登记簿

Windows 上看全表的常用姿势(-a 全部、-n 显示数字地址、-o 附带 PID):

Linux/macOS 的等价命令是 netstat -tlnp 或更新的 ss -tlnp(下面细讲区别)。输出的每一行是一场"门事",五列各有讲究:

第一次跑这条命令,多数人的反应是"怎么这么多行"。正常——你电脑上每个联网的程序都在册:浏览器的每条会话、每个 App 的心跳、系统后台的更新检查……几十上百行是常态,一两行才奇怪。这张表不求逐行看懂,先学会"带着问题来查":查某个端口、查某个状态、查某个 PID——工具是检索器,不是阅读题。

带着问题来,就得会过滤。三招最常用的"翻页法":

netstat -ano | findstr LISTENING      # 只看亮灯等客的门
netstat -ano | findstr :443           # 只看 443 相关的行
netstat -ano | findstr 203.0.113.66   # 只看和某个 IP 的会话

竖线是"把前一个命令的输出,喂给后一个命令筛"——上一节你已经用过它(findstr :8080 查占用),这里只是把筛子换了个孔。Linux/macOS 把 findstr 换成 grep,其余一字不差。简单说:登记簿不用通读,问一句答一句。三个筛子分别对应三类问题:谁开着门(找监听)、这个端口归谁(查占用)、它还连着谁(追会话)——恰好是下面三节的主角。

谁在门口等人:LISTENING 的门道

状态列里最该认识的是 LISTENING(Linux 下写作 LISTEN)——开着门、亮着灯、等人叩门。你起了个本地网站,程序守在 8080 门后;你开了远程桌面,系统守在 3389 门后。看监听行,重点看本地地址那一栏的写法,两种写法天差地别:

这个区别有实打实的分诊价值:"我本地 curl localhost:8080 好好的,同事从他电脑访问我就不通"——八成是服务只听在 127.0.0.1,门压根没朝外开。反过来的安全问题同样成立:0.0.0.0 的监听就是临街的正门,每多开一扇,攻击面就多一块。定期扫一眼自己的监听列表,看到不认识的端口朝外开着——好比巡视自家小楼,发现二楼有扇窗忘了关(第 8 章 § 8.5 的防火墙,管的就是这些窗谁能进)。

谁和谁正在通话:ESTABLISHED 与两列地址

状态为 ESTABLISHED 的行,是正在进行的会话——登记簿上"来访人/受访户"两栏都有名有姓。读这种行有个诀窍:看"本地地址的端口"在哪一侧。如果本地端口是随机的五位数(比如 51234)、远程端口是 443——这是你主动连出去的(你的浏览器去敲人家的门,出门用的门牌是系统临时发的);反过来,本地端口 8080、远程端口随机——这是别人连进来的(客人在你亮灯的门口坐下会客了)。

这招的最大民用价值:查"哪个程序在偷偷联网"。哪天风扇狂转、网速异常,你怀疑某软件在后台搞事——netstat 一开,ESTABLISHED 的行里,远程地址那些陌生 IP 全是嫌疑人。记下行尾的 PID,再到任务管理器(或 tasklist / 任务管理器的"详细信息"页)按 PID 对人:哦,原来是你。是正常更新还是鬼祟外联,看到名字再判断——登记簿不管善恶,只管如实登记;认人这一步,得你自己来。(顺带呼应 § 9.3 学的反查:拿远程 IP 去 dig -x 问一句"这是谁家的电话",两招合璧,可疑外联无处遁形。)

逐行读表:三行典型登记的翻译练习

纸上谈兵到此为止,来一次实战翻译。下面是从一张真实的 netstat 输出里摘的三行典型(数字做了化名处理),逐行读给你看:

协议  本地地址              远程地址               状态          PID
TCP   0.0.0.0:445           0.0.0.0:0              LISTENING     4
TCP   192.168.1.8:51234     203.0.113.66:443       ESTABLISHED   8892
TCP   127.0.0.1:8080        127.0.0.1:53099        TIME_WAIT     0

第一行:守门的。本地 0.0.0.0:445、远程一栏空着、状态 LISTENING——445 是 Windows 文件共享的门牌,挂在 0.0.0.0 上意味着"对所有网卡开放"。PID 4 是 Windows 的系统进程(PID 1 或 4 通常是系统本体),门是系统自己开的,正常,但外网环境建议用防火墙把这扇门看紧(第 8 章 § 8.5 的老话题)。

第二行:出门的。本地端口是五位数临时号 51234,远程是某台服务器的 443——一个标准的"你的浏览器/程序去敲别人的加密门"。PID 8892 是谁?查任务管理器——大概率是你的浏览器或某 App。这一行健康的标志是远程地址可解释:要么是你认识的网站(IP 归属地查得到,比如 CDN 大厂),要么是它该连的地方。要是长年累月连着一个查无归属的境外 IP,才值得多问一句。

第三行:道别的。两头都在 127.0.0.1 上——自己楼里的内线通话刚结束(多半是你的浏览器刚访问完自己电脑上的本地网站),主动方还在 TIME_WAIT 里等收尾,PID 0 表示"进程已走、账还挂着",一两分钟自动销户,无需管理。三行分别是等客、会客、送客——登记簿上千变万化,行行都能归进这三类。

病症一:端口被占——车位的日常纠纷

程序员世界里流传最广的报错,大概就是这行:Address already in use(地址已被占用)。翻译:你想让新服务守 8080 那扇门,可门后已经站了个人——多半是你上次启动的程序没关干净,还在那儿守着。好比开车到公司,发现自己昨天那辆车没开走,还占着车位——新车没处停,物业(操作系统)一纸告知:车位已占。

三步破案,一分钟结案:

netstat -ano | findstr :8080     # 谁占了 8080?记下最后一列的 PID
tasklist | findstr 12345          # PID 12345 是哪个程序?(Linux: ps -p 12345)
taskkill /PID 12345 /F            # 确认是自己人后,请它走(Linux: kill 12345)

注意第三步的"确认是自己人后"——PID 对出来的名字如果是你自己项目的旧进程、上次没退干净的编辑器插件,放心动手;如果是完全陌生的名字,先别杀,多看一眼(可能是正经系统服务,也可能是第 8 章教过的那类不速之客)。杀完再启动,多半药到病除。至于"重启电脑"这个万能土法——当然也管用,就像家里跳闸了总闸一拉全屋重置(电学篇的老梗),但为了一个车位重启整栋楼,动静大了点。

三步流程各平台有自己的方言,对照着记:Windows 用 findstr 过滤、tasklist 认人、taskkill 动手;Linux 用 greppskill;macOS 最省事——lsof -i:8080 一条命令直接把占用者和进程名一起报出来,连第二步都省了。命令各有各的拼写,思路却是同一张停车纠纷处理单:查牌 → 认人 → 请走。本质上就是一门"物业管理学",物业换制服,流程不换。

病症二:TIME_WAIT 大军与 CLOSE_WAIT 警报

翻登记簿时你会撞见成片的 TIME_WAIT——尤其在一台跑着繁忙网站的服务器上,几百上千行不稀奇。先安心:TIME_WAIT 是规矩,不是病。第 3 章 § 3.2 讲四次挥手时埋的伏笔:TCP 的道别要来来回回说两轮,挂断后主动关闭的一方会留守一小段(约一到两分钟),确保最后一句话真送到了,才彻底销户。这就是"人走了还在楼下挥手"的那一栏。送客送到楼下,是礼貌,也是保险。

大量 TIME_WAIT 什么时候才值得管?当你的程序以极高频率建短连接时(每秒几百个新连接,用完就挂),挥手的人能在登记簿上排成长队,极端情况会把可用的临时门牌号耗尽。治法也讲道理:让客人别走——用"连接池"让会话常驻复用,别每次说三句话就道别一次(这背后正是 HTTP keep-alive 的思路,第 10 章 § 10.1 讲 HTTP/2 时还会再遇到它)。

真正要拉警报的是它的孪生兄弟 CLOSE_WAIT:对面已经道别挂断了,你这边的程序却忘了收线——登记簿上留着一屋子"对方已走、自己还举着话筒"的会话。TIME_WAIT 是礼貌的留守,CLOSE_WAIT 是程序的失忆:会话越积越多,最终门牌号耗尽,服务瘫掉。区别记这一句就够:TIME_WAIT 成片是壮观,CLOSE_WAIT 成片是事故。看到 CLOSE_WAIT 堆积,病根在你自己程序的代码里(忘了关闭连接),重启程序只是把失忆洗掉,不修代码还会犯。

为什么"礼貌的留守"要设一两分钟这么久?这就是 TCP 四次挥手里的细心处(§ 3.2 的原图):挂断前双方各说一次"我说完了",主动挂断的一方最后还要说"再见"并等对方回一个"再见"才算礼成。留守期(术语叫 2MSL,两个最大报文寿命)就是留给这句"再见"在路上往返的时间——万一它半路丢了,还能补发。说白了就是送客送到楼下、目送拐过街角再上楼,看起来啰嗦,防止的是"客人以为你还有话说又折回来、你却已经睡了"的尴尬错位。可靠传输的"可靠",一半藏在这些啰嗦里。

门牌号耗尽长什么样?程序疯狂报错"Cannot assign requested address",新连接一个都建不起来——好比小区的临时访客号发完了,新来的客人登记不了,只能堵在门口干等。到这一步,登记簿上通常积着几万条 TIME_WAIT,那才是真正需要动手术(改程序用连接池)的时刻。日常几十几百条,看一眼放心睡觉。

ss:跑得更快的接班人

Linux 世界里,netstat 已经属于"老门卫"——资历深、谁都认识,但翻账本的方式老了:它要把系统里所有网络信息整个遍历一遍再汇总给你,机器上一旦有几十万条会话(大服务器常态),你等它输出能等出茶来。ss(socket statistics)直接从内核的台账里取数,同样的账,快出几个数量级。常用的几张速记:

参数的字母和 netstat 大体对得上(会 netstat 的上手 ss 几乎零成本),社区也早把 ss 钦定为正牌接班人。那 netstat 学了亏不亏?不亏——macOS 和 Windows 上 netstat 仍是主力军,且老门卫满世界都是,新旧两代都得认识。工具会退休,登记簿永远有人守。

登记簿之外:netstat 的三张副表

除了"谁和谁"的主表,netstat 还兼管着三张平时用不上、关键时刻很管用的副表——知道它们存在,比记住参数更要紧:

三张副表的共同脾气:单看是流水账,对比出真知。它们记的都是累计值,像家里的电表水表——读一次毫无意义,隔天再读一次,用了多少电一目了然。网络排障的进阶功夫,一半就是"定时取两遍数,对出差值来"。

127.0.0.1:自家院里的内线电话

登记簿上最常出现的地址,莫过于 127.0.0.1——它有个专属名字:回环地址(loopback),域名马甲是 localhost。它的规矩很特别:发往 127.0.0.1 的数据压根不出网卡,在本机内部就转回来了。相当于楼里的内线电话:拨出去,接的还在同一栋楼。两个必知后果:其一,ping 127.0.0.1 永远通——它测的其实不是网络,而是你机器的网络协议栈活着没(本机 TCP/IP 程序没瘫);其二,听在 127.0.0.1 的服务,外面谁来都敲不开——门牌压根没挂到临街面。

这组设计在本地开发里天天用:程序员在自己电脑上起个网站,浏览器访问 http://localhost:3000——流量出不了自家院子,外人看不见、防火墙不操心、开发个啥都安心。等哪天要给同事演示了,才把服务改听 0.0.0.0,把门开到街上。一句话记住这组门牌:localhost 是内线,0.0.0.0 是正门——想清给谁用,再决定开哪张。

两个容易撞见的小细节,一并交代。其一,翻登记簿时会看到 ::1 这个怪地址——它是 IPv6 版的回环地址,干的事和 127.0.0.1 一模一样,好比内线电话的新号段(第 10 章 § 10.3 讲 IPv6 时正式登台)。其二,localhost 这个名字是怎么变成 127.0.0.1 的?用上一节刚学的 nslookup 查一下就知道——它压根不走 DNS,答案早就写在你电脑的 hosts 文件里(§ 9.3 见过的老前辈,内线号是出厂预装的)。两节知识在这里接上了榫。

登记簿上的两种方言:UDP 行与 IPv6 门牌

翻全表时还会撞见两种"长得不太一样"的行,认得它们才不至于愣住。第一种方言是 UDP 行。netstat -ano 的账本里混着 TCP 和 UDP 两类账,UDP 行有个显眼特征:远程地址栏画着 *:*、状态栏一片空白。不是登记员偷懒——UDP 压根没有"先握手、后会面、最后挥手道别"这套礼数(§ 3.3 的老朋友:快递柜式的"放下就走")。没建立过连接,自然没有连接状态可记。所以 UDP 的行只回答一个问题:"哪扇门开着等人投件"——DNS 的 53 号窗口(上一节的查号台)、很多本地服务的发现端口,都以这种"无状态"的姿态挂在簿上。想只翻某一类账,加个协议参数:netstat -ano -p tcp 只看 TCP(Linux 上 ss -tss -u 各管一头)。顺带一个容易误诊的点:服务"连不上"时,先弄清它走的是 TCP 还是 UDP——TCP 的病在登记簿上状态分明,UDP 的病簿上根本不留痕迹,得靠下一节的抓包才能看见。

第二种方言是 IPv6 门牌。现在的系统默认都开着 IPv6,登记簿里会混进这样的行:[::]:8080[::1]:5354。方括号是 IPv6 地址的"防混淆马甲"——IPv6 地址本身就带冒号(比如 2001:db8::1),再直接跟端口连写,谁是谁就分不清了,于是地址套上方括号、端口留在括号外。认这两张新门牌不用学新规矩,规则原样照搬:[::]:8080 就是 IPv6 版的 0.0.0.0:8080(对所有网卡开放),[::1] 就是 IPv6 版的 127.0.0.1(自家内线)。好比小区翻修后门牌换了新号段,住户还是那些住户——你前面学的"内线还是正门"的判断法,一个字都不用改。有个常被问到的现象也顺便交代:明明只配了一个地址,登记簿却出现两行(0.0.0.0 一行、[::] 一行)——那是系统同时用两套地址体系(IPv4 和 IPv6)各挂了一张门牌,同一个服务,两套号牌并行营业,正常现象。

追到老家去:从 PID 到程序文件

PID 认人这一步,任务管理器给出的是"名字"。但名字这东西,会重名,也会冒名。安全圈的老案例:恶意程序把自己改名成 svchost.exe——那是 Windows 上最常见的服务宿主,任务管理器里一开一大把,名字一栏看着人畜无害,实际是李鬼。所以巡楼认门时,最靠得住的一步是追到老家去:查这个 PID 对应的程序文件躺在哪个文件夹。

tasklist /fi "PID eq 12345"              # 第一层:名字(会重名、会冒名)
# 第二层:老家(程序文件的真实路径)
Get-Process -Id 12345 | Select-Object Path     # PowerShell,推荐
wmic process where processid=12345 get executablepath   # 老牌写法,新系统已逐步退役
# Linux:顺着 /proc 摸到可执行文件本体
ls -l /proc/12345/exe        # 箭头指向 /usr/bin/python3.10 之类
# macOS:lsof -p 12345 看这个进程打开的一切(含程序本体)

看路径的学问一句话说透:正经程序住在正经小区,来路不明的程序租住在临时窝点。svchost.exe 住在 C:\Windows\System32 里,是本尊;同名文件若出现在 C:\Users\你\...Temp 或下载目录里,几乎可以断定是冒名的。这就好比查名字不够、还得看户口所在地——满大街都叫"张伟",报出住址才能锁定是哪一个张伟。到这里,巡楼流程彻底闭环了:端口 → PID → 名字 → 路径,四步连环,把"多出来的那扇门"从门牌一路追到程序文件,李鬼无所遁形。这套追踪法和第 8 章 § 8.6 零信任的精神一脉相承:不问名字响不响亮,只验证来路清不清楚。

安全视角:把登记簿当巡逻清单

第 8 章讲了那么多攻防,本节的登记簿正好是防御侧的第一手资料。巡逻两问:一问"哪些门朝外开着"(LISTENING + 0.0.0.0)——每扇对外的门都是一道攻击面,名单里出现你不知道的端口,就要查清是哪个程序开的、该不该开;二问"谁在和陌生地址会客"(ESTABLISHED + 陌生远程 IP)——正常软件外联常去的是自家机房和 CDN(远程地址稳定、可查归属),可疑软件外联的 IP 归属地混乱、端口刁钻、出现时机鬼祟。配合 § 9.3 的 IP 反查和归属地查询,一个陌生地址几分钟能验明正身。

说白了,这就是小区安保的日常:登记簿不负责抓贼,负责让一切有据可查。贼最怕的不是保安多能打,而是这本账记得太全——来过必留痕,留痕必能查。很多入侵事故复盘时才发现,可疑外联在登记簿上挂了好几周,只是没人翻开看过。防御的起点不是买设备,是定期翻账本。

落到实操,给你一套两分钟版的"月度巡楼":第一步,netstat -ano 拉全表,只看 LISTENING 行,把 0.0.0.0 开头的端口抄下来——这是你的"对外门面清单";第二步,逐个 PID 认主,能对上"我知道你在干嘛"的就画勾(浏览器、下载工具、远程桌面都是常客);第三步,画不上勾的去查:任务管理器看程序路径、网上搜这个端口号——十有八九能查到是哪个软件的门,查不到的再升级警惕。这一趟的勾选结果存下来,下个月巡楼就是你的"基线"——安全不是认得所有的门,而是能发现"多出来的那扇门"。想象一下超市打烊后店长巡场:不用清点每件货,扫一眼货架就知道哪排不对劲——因为他昨天下班时看过一遍。巡楼同理,功夫全在"上次看过"。

排查流:本机四层门

把本节的诊断收成一条流程。场景:"我起的服务连不上"——从自己这栋楼查起,逐层往外推:

看到这个形状你一定笑了——还是那套"由近及远、逐段夹逼",本节的"近"近到了极限:从自己的网卡口开始查起。五节工具连起来,就是一张完整的网络排查地图:内(netstat)→ 名(nslookup)→ 路(ping/traceroute)→ 端(curl)。哪儿疼查哪儿,一节管一层。

这套流程最值钱的地方在于顺序不可乱:多少人"服务连不上"第一反应就去查路由器、重启光猫——折腾半小时,最后发现是程序压根没起来。从最里层往外查,每一层排除的都是一整类嫌疑:进程排除"没出生",监听排除"没开门",防火墙排除"被保安拦",最后才轮到"路不好"。跟医院分诊一个道理:先问挂号导诊,别一进门就直奔 CT 室。

把本机网络想成"你名下的一栋小楼"
IP 地址是大门口挂的小区门牌,端口是楼里一间间房。你是这栋楼的物业兼保安,netstat/ss 是你手里的登记簿。日常巡楼就四件事:

第一件:查哪些房亮着灯等人(LISTENING)。亮灯的房是开门营业的服务。看清灯挂在哪面:挂在 127.0.0.1,是院里内线,外人找不到;挂在 0.0.0.0,是临街正门,路人皆可叩。开正门是做生意的需要,但每一扇都记在案——不知道谁开的正门,就是忘了关的窗。

第二件:查哪些房正在会客(ESTABLISHED)。登记簿两栏对得清清楚楚:谁来访、找的哪户、坐了多久。看到陌生访客,顺着 PID 认门牌、顺着远程 IP 查归属——登记簿不认贼,但贼一定在簿上。

第三件:处理车位纠纷(端口被占)。新车想停 8080,车位上停着昨天没开走的旧车。查牌(findstr 端口)、认人(tasklist 对 PID)、确认是自己人再请走(taskkill)。

第四件:分清"礼貌留守"和"失智占屋"。TIME_WAIT 是主人送客到楼下还在挥手——规矩,过一两分钟自然回屋;CLOSE_WAIT 是客人早走了、主人还举着话筒发呆——每一间都白白锁着,积多了整栋楼无房可租。

一栋楼、一间间房、一本登记簿——netstat/ss 的全部学问,就是当好这栋楼的门卫:谁在等客、谁在会客、谁占了房、谁忘了挂电话,白纸黑字,翻账即知。

动手清单:一次规范的本机巡楼

常见误区

Recap · 收束

带走三句话。第一,netstat/ss 是本机的来访登记簿:监听行告诉你哪些门开着、开给谁(127.0.0.1 内线还是 0.0.0.0 正门);会话行告诉你谁正和谁通话——查偷偷联网的程序,就认 ESTABLISHED 行的 PID。第二,两大日常病症的药方都在表里:端口被占,按 PID 认人后请走旧进程;TIME_WAIT 成片是礼貌留守无需慌,CLOSE_WAIT 成片才是代码失忆要拉闸。第三,排查的内层闭环凑齐了:进程起了没 → 门开了没 → 内线通了没——由近及远的心法,这一节把它推到了自己家门口。

至此排错工具箱还差最后一块拼图:netstat 看的是"登记簿的摘要",而 Wireshark 是"在门口架一台摄像机,把每个进出包裹拆开拍给你看"——下一节,逐包分析,网络排错的终极武器。

☰ 主页
Xue Hai Wu Ya · Network · § 9.5 · netstat / ss