在Linux系统中,监控和管理TCP连接是网络运维和故障排查的核心技能之一,TCP作为传输层最重要的协议之一,其连接状态直接反映了网络服务的健康度、性能瓶颈以及潜在的安全风险,本文将详细介绍Linux系统中查看TCP连接的多种方法,包括传统工具netstat、现代高效工具ss、进程级查看工具lsof以及内核接口/proc/net/tcp,并结合实际场景说明参数使用、输出解析及问题排查思路。

使用netstat查看TCP连接(传统工具)
netstat是Linux系统中最早用于查看网络连接状态的工具,虽然在新版系统中逐渐被ss替代,但其兼容性好,仍在许多旧环境或基础排查中使用。  
基本语法与常用参数
netstat的参数组合灵活,通过不同参数可筛选TCP连接的特定信息:  
-t:仅显示TCP连接(默认显示所有协议,需结合-t或-u指定);-u:显示UDP连接(本文聚焦TCP,故不展开);-n:以数字形式显示IP地址和端口(不解析域名和服务名,提升速度);-l:仅显示监听状态的连接(如LISTEN);-a:显示所有连接状态(包括监听、连接中、已建立等);-p:显示连接对应的进程ID(PID)和程序名(需root权限);-c:持续输出连接状态变化(类似tail -f,适合实时监控);-s:按协议统计连接信息(如TCP连接总数、各状态占比)。
常用示例与输出解析
- 
查看所有TCP连接(含监听与非监听)
netstat -tna
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 192.168.1.100:80 10.0.0.5:54321 ESTABLISHED tcp 0 0 192.168.1.100:80 10.0.0.6:54322 TIME_WAIT字段说明:
Proto:协议(tcp);Recv-Q:接收队列(等待应用层读取的字节数);Send-Q:发送队列(已发送但未确认的字节数);Local Address:本地IP和端口(0.0.0:22表示监听所有网卡的22端口);Foreign Address:远程IP和端口(0.0.0:*表示非连接状态);State:连接状态(LISTEN表示监听,ESTABLISHED表示已建立连接,TIME_WAIT表示等待关闭)。
 - 
查看监听状态的TCP连接及进程
netstat -tlnp
输出示例:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 5678/mysqld可直接通过
PID/Program name定位占用端口的进程(如sshd占用了22端口)。 - 
统计TCP连接状态分布
netstat -st | grep "TCP:"
输出示例:
TCP: 125 active connections openings TCP: 11 passive connection openings TCP: 8 failed connection attempts TCP: 23 connections established TCP: 12 segments send per 100ms 
使用ss查看TCP连接(现代高效工具)
ss是iproute2工具包的一部分,从Linux 3.0+开始逐渐替代netstat,其优势在于:查询速度快(直接从内核获取数据,避免遍历进程)、功能更丰富(支持更多网络协议和状态筛选),适合高并发场景。  
基本语法与常用参数
-t:显示TCP连接;-n:数字形式显示地址和端口;-l:仅显示监听连接;-a:显示所有连接;-p:显示进程信息(需root);-s:统计连接信息(按协议和状态);-4/-6:仅显示IPv4/IPv6连接;state <状态>:筛选特定状态(如state established、state time-wait)。
常用示例与输出解析
- 
查看所有TCP连接(简洁格式)
ss -tna
输出示例:

State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* ESTAB 0 0 192.168.1.100:80 10.0.0.5:54321 TIME-WAIT 0 0 192.168.1.100:80 10.0.0.6:54322字段与
netstat类似,但State列首字母大写(如TIME-WAIT),且Recv-Q/Send-Q含义一致。 - 
查看已建立的TCP连接数及进程
ss -tp state established
输出示例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.168.1.100:80 10.0.0.5:54321 users:(("nginx",pid=1234,fd=6))通过
Process列可直接定位进程(如nginx的PID为1234)。 - 
统计TCP连接状态及数量
ss -s
输出示例:
Total: 150 (kernel 200) TCP: 150 (estab 1, closed 0, orphaned 0, timewait 10) Transport Total I-Node Eth Proto Recv-Q Send-Q TCP 150 0 6 TCP 0 0可快速获取TCP连接总数、各状态数量(如
estab为已建立连接数)。 
使用lsof查看进程级TCP连接
lsof(list open files)用于列出系统打开的文件,在Linux中,“一切皆文件”,网络连接也被视为文件,因此可通过lsof查看进程占用的TCP连接,特别适合排查“哪个进程占用了端口”或“某个进程的网络连接情况”。  
基本语法与常用参数
-i:显示网络连接(可指定协议或端口,如-i :80、-i tcp);-P:不解析端口名(显示数字端口,提升速度);-n:不解析IP地址(显示数字IP);-p:指定进程PID(如-p 1234查看PID为1234的进程连接)。
常用示例与输出解析
- 
查看所有TCP连接及对应进程
lsof -i -P -n
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1234 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN) nginx 5678 www-data 6u IPv4 12346 0t0 TCP 192.168.1.100:80->10.0.0.5:54321 (ESTABLISHED)字段说明:
COMMAND:进程名(如sshd、nginx);PID:进程ID;FD:文件描述符(3u表示可读写);NAME:连接详情(*:22 (LISTEN)表示监听所有网卡的22端口,TCP... (ESTABLISHED)表示已建立的连接)。
 - 
查看指定端口的占用进程
lsof -i :80
输出示例:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 5678 www-data 6u IPv4 12346 0t0 TCP *:80 (LISTEN)可快速定位80端口被
nginx进程(PID=5678)占用。 
通过/proc/net/tcp查看内核原始TCP连接
/proc/net/tcp是Linux内核提供的TCP连接状态文件,以文本形式存储原始数据(十六进制格式),适合需要深度解析连接状态或二次开发的场景。  
文件格式与字段说明
cat /proc/net/tcp输出示例:  
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode       
   0: 0100007F:0035 00000000:0000 0A 00000000:00000000 02000000 00000000   100        0 12345 1 00000000 100 0 0 10 0  
   1: 0100007F:0035 5A3A0A0A:0016 01 00000000:00000000 00000000 00000000   100        0 12346 1 00000000 20 4 31 1 0 0  
字段解析(需手动转换):
sl:连接序号;local_address:本地地址(十六进制,前8位为IP,后4位为端口,需转十进制);rem_address:远程地址(格式同本地地址);st:连接状态(十六进制,如01=ESTABLISHED,0A=LISTEN,06=TIME_WAIT);inode:inode号,可通过ls -l /proc/PID/fd/关联进程。
实用示例
- 
查看本地IP和端口(转换十六进制)
本地地址0100007F:0035转换:- IP:
0100007F(十六进制)=0.0.1(十进制,小端序); - 端口:
0035(十六进制)=53(十进制)。
该连接为本地127.0.0.1的53端口(DNS服务)。 
 - IP:
 - 
通过inode关联进程
cat /proc/net/tcp | awk '$4=="00000000"{print $10}' | xargs -I {} ls -l /proc/*/fd/ | grep {}可快速定位inode对应的进程(需结合
awk筛选特定状态)。 
工具对比与适用场景
| 工具 | 优势 | 劣势 | 适用场景 | 
|---|---|---|---|
netstat | 
兼容性好,参数直观 | 速度慢(需遍历进程) | 旧系统、基础连接查看 | 
ss | 
速度快(直接读内核),功能全 | 参数较复杂(需熟悉状态筛选) | 高并发、实时监控、状态统计 | 
lsof | 
进程级关联,端口排查精准 | 输出信息较多,需过滤 | 定位端口占用进程、进程网络连接分析 | 
/proc/net/tcp | 
原始数据,适合二次开发 | 需手动转换格式,可读性差 | 内核调试、自动化脚本开发 | 
常见问题排查思路
- 
端口占用无法启动服务
使用ss -tlnp | grep :端口号或lsof -i :端口号查看占用进程,若为无用进程则kill,若为服务冲突则修改服务端口。 - 
TCP连接数过高导致性能下降
通过ss -s查看连接总数,ss -tp state established查看已建立连接数,结合top -p PID监控进程资源占用;若TIME_WAIT连接过多,可调整内核参数(如net.ipv4.tcp_tw_reuse=1)。 
相关问答FAQs
Q1: 如何快速统计当前服务器上ESTABLISHED状态的TCP连接数?
A: 使用ss或netstat结合grep统计:  
# 方法1(ss,推荐) ss -t state established | wc -l # 方法2(netstat) netstat -tna | grep 'ESTABLISHED' | wc -l
Q2: 如何排查某个IP频繁与服务器的80端口建立连接?
A: 使用ss或netstat结合grep筛选目标IP,并查看连接状态和进程:  
# 查看与目标IP的所有80端口连接
ss -tp 'dst 10.0.0.5 and dport = :80'
# 查看连接频次(需结合awk统计)
netstat -tna | grep '10.0.0.5:80' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
若发现异常高频连接,需结合防火墙(如iptables)封禁可疑IP,并检查服务是否存在漏洞。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/26167.html