在Linux系统中,TCP连接是网络通信的核心,无论是日常运维还是性能调优,掌握TCP连接数的查看方法都至关重要,本文将详细介绍多种查看TCP连接数的方式,包括基础命令、进阶分析以及工具推荐,帮助读者全面掌握这一技能。

基础命令:netstat与ss
netstat和ss是Linux系统中查看网络连接状态的经典工具,其中ss因性能更优逐渐成为主流选择。
使用netstat命令
netstat是一个传统的网络工具,能够显示网络连接、路由表、接口统计等信息,查看TCP连接数时,常用以下参数组合:
netstat -ant:显示所有TCP连接(-a),并以数字形式展示地址和端口(-n),跳过名称解析(-t指定TCP协议)。netstat -tn:仅显示已建立的TCP连接,通过管道结合wc -l可统计总数:netstat -tn | wc -l。netstat -an | grep ESTABLISHED | wc -l:统计当前已建立的连接数。
netstat的缺点在于,当连接数较多时(如数万级别),查询速度较慢,且默认不支持显示进程ID(PID),需额外添加-p参数(需root权限)。
使用ss命令(推荐)
ss是iproute2包的一部分,性能远超netstat,尤其在处理大量连接时优势明显,常用命令如下:
ss -t:显示所有TCP连接。ss -t -a:显示所有TCP连接,包括监听、已建立等状态。ss -t -n:以数字形式显示TCP连接,避免DNS解析延迟。ss -t -p:显示TCP连接及其对应的进程ID和名称,便于定位问题进程。ss -t -state ESTABLISHED -n | wc -l:统计已建立的TCP连接数。
ss还支持更灵活的状态过滤,例如ss -t -state TIME_WAIT, CLOSE_WAIT可查看特定状态的连接数。
进阶分析:/proc文件系统
Linux内核通过/proc文件系统暴露系统信息,其中/proc/net/tcp和/proc/net/tcp6分别记录IPv4和IPv6的TCP连接状态,直接查看这些文件可获取底层连接信息:
cat /proc/net/tcp:显示IPv4 TCP连接,每行代表一个连接,包含本地地址、远程地址、状态等十六进制编码信息。cat /proc/net/tcp6:显示IPv6 TCP连接。
由于输出为十六进制格式,可结合awk或python脚本解析,使用awk提取状态字段并统计:

cat /proc/net/tcp | awk 'NR>1 {print $6}' | sort | uniq -c
此命令可统计各状态的TCP连接数。/proc文件系统的优势在于无需额外工具,适合脚本化处理,但需要手动解析数据。
工具推荐:lsof与nmap
lsof命令
lsof(list open files)可列出系统打开的文件,包括网络连接,查看TCP连接时,常用以下命令:
lsof -iTCP -sTCP:ESTABLISHED:显示所有已建立的TCP连接及其进程信息。lsof -iTCP -P -n:显示所有TCP连接,不解析端口名称和主机名(-P和-n参数)。
lsof的优势在于能精确定位占用连接的进程,适合排查特定应用的连接问题。
nmap命令
nmap通常用于端口扫描,但结合--open参数可快速检测主机开放的TCP端口:
nmap -sT -p 1-65535 localhost | grep open:扫描本机所有开放端口,统计开放端口数(近似于监听连接数)。
此方法适合快速评估服务端口暴露情况,但不适合实时监控连接状态变化。
状态分类与统计
TCP连接状态是分析问题的关键,常见状态包括:
ESTABLISHED:已建立连接,数据传输中。LISTEN:监听状态,等待连接请求。TIME_WAIT:连接关闭后的等待状态,防止重复报文。CLOSE_WAIT:被动关闭等待,应用未正确关闭连接。SYN_SENT:发送连接请求后等待确认。SYN_RECV:收到连接请求等待确认。
统计各状态连接数有助于诊断问题,例如大量TIME_WAIT连接可能需要调整内核参数(如net.ipv4.tcp_tw_reuse),而CLOSE_WAIT过多则提示应用层存在连接泄漏。

内核参数优化
当连接数异常时,可能需要调整Linux内核参数。
net.ipv4.tcp_max_syn_backlog:SYN队列长度,应对SYN洪水攻击。net.ipv4.tcp_tw_reuse:复用TIME_WAIT状态,减少TIME_WAIT连接数。net.ipv4.tcp_fin_timeout:FIN_WAIT状态超时时间。
调整参数需谨慎,建议先通过sysctl -a查看当前值,修改后通过sysctl -p生效。
自动化监控脚本
结合ss或/proc/net/tcp,可编写监控脚本实现定期统计,以下脚本每小时统计一次各状态TCP连接数并记录日志:
#!/bin/bash
log_file="/var/log/tcp_monitor.log"
timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$timestamp] TCP Connection Status:" >> $log_file
ss -t -state | awk '{print $1}' | sort | uniq -c | sort -nr >> $log_file
将脚本加入crontab,可实现自动化监控。
查看Linux TCP连接数是系统运维的基础技能,从netstat到ss,从/proc文件系统到lsof,不同工具适用于不同场景。ss因其高效和灵活成为首选,而/proc文件系统则适合底层解析,通过合理选择工具、分析连接状态并结合内核优化,可有效保障系统网络性能,实际应用中,需根据需求选择合适的方法,并结合脚本实现自动化监控,提升运维效率。
















