mac局域网共享未正常断开会导致残留空闲tcp会话,引发连接异常;需用lsof查445/139端口的established/time_wait/close_wait连接,再通过kill -9终止对应pid或批量清理,最后执行sudo pfctl和sudo sysctl刷新内核tcp状态以彻底清除。

Mac局域网共享连接后若未正常断开,系统可能残留空闲TCP会话,导致后续访问NAS、Time Machine备份卷或SMB共享时出现“连接已关闭”“权限被拒绝”或反复弹出认证窗口。这些会话不显示在访达界面,但持续占用端口并干扰新连接建立,必须通过命令行强制清理。
确认当前活跃的SMB/CIFS相关TCP连接
先查看是否存在异常空闲连接,避免误杀正在传输的会话:
打开终端 → 输入以下命令并回车:lsof -i tcp:445,139 | grep -E "(ESTABLISHED|TIME_WAIT|CLOSE_WAIT)"
该命令只筛选与SMB服务强相关的445(HTTPS/SMBv3)和139(NetBIOS Session)端口,排除其他干扰项。若输出为空,说明无残留会话,无需继续;若有结果,记录第一列PID(进程号)和最后一列远程地址(如192.168.1.100:49231)。
终止指定SMB会话进程
方法一:按PID精准终止
从上一步输出中复制目标连接的PID(例如12345),执行:kill -9 12345
该操作立即强制结束进程,不等待数据刷新,适用于卡死的会话。
方法二:批量终止所有SMB关联进程
若存在多个残留连接或无法逐个判断,运行:lsof -i tcp:445,139 | awk 'NR>1 {print }' | xargs -r kill -9
【注意:此命令会终止所有445/139端口上的用户级进程,包括正在运行的Samba客户端、文件同步工具等,请确保无重要传输任务正在进行】
清空内核级TCP连接状态缓存
仅杀进程不能清除内核保留的半开连接状态,需手动刷新TCP状态表:
第一步:确认当前网络接口名(通常为en0)→ 执行 ipconfig getifaddr en0 2>/dev/null || echo "en0未启用,尝试en1"; ipconfig getifaddr en1
第二步:强制重置TCP连接跟踪表 → 输入:sudo pfctl -f /etc/pf.conf 2>/dev/null || sudo pfctl -e
第三步:刷新本地连接状态 → 运行:sudo sysctl -w net.inet.tcp.pcbcount=0 2>/dev/null
这一步绕过图形界面限制,直接干预内核TCP控制块计数器,使系统丢弃所有未完成握手或超时未关闭的SMB会话元数据。
验证空闲会话是否已清除
执行以下命令检查残留:netstat -an | grep -E ":(445|139).*[LW]" | grep -v "LISTEN"
若返回结果为空,则表示所有空闲SMB TCP会话已被清除;若仍有输出,重复











