在Linux系统中,查看网络连接状态是系统管理和故障排查中的常见操作,通过相关命令可以实时监控网络连接、端口占用、进程关联等信息,以下是几种常用的查看网络连接状态的方法及其详细说明。

使用netstat命令查看网络连接
netstat是一个传统的网络工具,用于显示网络连接、路由表、接口统计等信息,尽管在部分新版本Linux中已被ss命令替代,但仍有广泛使用场景。
基本用法
-
查看所有TCP和UDP连接
netstat -a
显示所有活动的网络连接,包括监听(LISTEN)和非监听状态。
-
显示监听端口
(图片来源网络,侵删)netstat -l
仅显示处于监听状态的端口,常用于检查服务是否正常启动。
-
显示进程ID和进程名
netstat -p
结合
-p参数可以查看每个连接对应的进程ID和名称,便于定位问题进程。 -
显示TCP连接状态统计
(图片来源网络,侵删)netstat -st
输出TCP协议的详细统计信息,如连接数、重传次数等。
-
显示UDP连接统计
netstat -su
输出UDP协议的统计信息,包括数据包收发情况。
常用参数组合
netstat -tuln:显示监听的TCP(-t)和UDP(-u)端口,并以数字形式显示地址(-n),避免DNS解析延迟。netstat -anp | grep :80:查找监听80端口的进程及连接状态。
使用ss命令查看网络连接
ss是netstat的替代工具,在性能上更优,尤其是在处理大量连接时,推荐优先使用。
基本用法
-
显示所有连接
ss -a
功能与
netstat -a类似,但输出更简洁高效。 -
显示TCP连接
ss -t
仅显示TCP连接,可结合
-a(所有)、-l(监听)、-n(数字)等参数。 -
显示UDP连接
ss -u
查看UDP连接状态。
-
显示 sockets 摘要
ss -s
输出协议类型(TCP/UDP)的连接总数、监听数等统计信息。
-
显示进程信息
ss -p
显示每个连接对应的进程ID和名称。
常用参数组合
ss -tuln:显示监听的TCP和UDP端口(数字形式)。ss -t state established:显示所有已建立的TCP连接。ss -ap 'sport = :22':查找源端口为22的连接(需支持过滤表达式)。
使用lsof命令查看端口占用
lsof(list open files)可用于查看打开的文件、网络连接等,通过指定网络相关参数可定位端口占用进程。
基本用法
-
查看指定端口的占用情况
lsof -i :80
显示占用80端口的进程、PID、用户等信息。
-
查看所有网络连接
lsof -i
显示所有活动的网络连接,包括TCP和UDP。
-
查看指定用户的网络连接
lsof -u username
查看指定用户的所有网络连接。
使用/proc文件系统查看网络连接
Linux内核通过/proc文件系统暴露系统信息,可直接读取网络连接相关文件。
常用文件
-
/proc/net/tcp
显示TCP连接信息,格式为本地地址、远程地址、状态、进程ID等。
示例:sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 500 0 65536 1 0000000000000000 100 0 0 10 0其中
local_address为本地IP和端口(十六进制),st为连接状态(如0A表示LISTEN)。 -
/proc/net/udp
显示UDP连接信息,格式与TCP类似。 -
/proc/net/tcp6和/proc/net/udp6
分别显示IPv6的TCP和UDP连接信息。
解析方法
可通过cat /proc/net/tcp | awk '{print $10}' | sort | uniq -c统计各状态的TCP连接数。
网络连接状态详解
无论是netstat还是ss,连接状态(State)字段是关键信息,常见状态如下(以TCP为例):
| 状态 | 说明 |
|---|---|
| LISTEN | 端口处于监听状态,等待连接请求 |
| ESTABLISHED | 连接已建立,数据传输中 |
| SYN_SENT | 发送连接请求后等待对方确认 |
| SYN_RECV | 收到连接请求,发送确认并等待对方确认 |
| FIN_WAIT1 | 主动关闭连接,发送FIN等待对方确认 |
| FIN_WAIT2 | 收到对方确认,等待对方发送FIN |
| CLOSE_WAIT | 被动关闭连接,等待应用程序关闭 |
| LAST_ACK | 被动关闭方发送FIN后,等待对方确认 |
| TIME_WAIT | 连接关闭后,等待足够时间确保网络中的报文消失 |
| CLOSED | 连接未建立或已关闭 |
综合应用示例
-
查找占用端口的恶意进程
ss -tulnp | grep :8080
若发现异常进程(如PID未知),可结合
kill -9终止。 -
分析高并发连接问题
ss -s
观察TCP连接中
ESTABLISHED数量是否异常,结合netstat -an | grep ESTABLISHED | wc -l统计总数。 -
监控特定IP的连接
ss -t | grep 192.168.1.100
查看与指定IP的所有TCP连接。
相关问答FAQs
Q1: 如何区分本地IP地址和远程IP地址?
A: 在netstat或ss的输出中,本地地址(Local Address)格式为IP:PORT,远程地址(Foreign Address)格式相同,例如0.0.0:22表示本地所有IP监听22端口,而168.1.100:80表示远程IP为192.168.1.100、端口为80的连接,使用-n参数可避免DNS解析,直接显示IP地址。
Q2: 为什么TIME_WAIT状态连接过多会影响性能?
A: TIME_WAIT状态是TCP连接正常关闭后的等待阶段,用于确保网络中的延迟数据包被正确处理,若该状态连接过多,可能因服务器处理能力不足或客户端频繁短连接导致,会占用系统端口资源,可通过调整内核参数(如net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle)优化,但需注意后者可能影响NAT环境。
