在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