Linux如何查看TCP连接状态?

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

linux如何查看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连接总数、各状态占比)。

常用示例与输出解析

  1. 查看所有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表示等待关闭)。
  2. 查看监听状态的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端口)。

  3. 统计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连接(现代高效工具)

ssiproute2工具包的一部分,从Linux 3.0+开始逐渐替代netstat,其优势在于:查询速度快(直接从内核获取数据,避免遍历进程)、功能更丰富(支持更多网络协议和状态筛选),适合高并发场景。

基本语法与常用参数

  • -t:显示TCP连接;
  • -n:数字形式显示地址和端口;
  • -l:仅显示监听连接;
  • -a:显示所有连接;
  • -p:显示进程信息(需root);
  • -s:统计连接信息(按协议和状态);
  • -4/-6:仅显示IPv4/IPv6连接;
  • state <状态>:筛选特定状态(如state establishedstate time-wait)。

常用示例与输出解析

  1. 查看所有TCP连接(简洁格式)

    ss -tna

    输出示例:

    linux如何查看tcp连接

    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含义一致。

  2. 查看已建立的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)。

  3. 统计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的进程连接)。

常用示例与输出解析

  1. 查看所有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:进程名(如sshdnginx);
    • PID:进程ID;
    • FD:文件描述符(3u表示可读写);
    • NAME:连接详情(*:22 (LISTEN)表示监听所有网卡的22端口,TCP... (ESTABLISHED)表示已建立的连接)。
  2. 查看指定端口的占用进程

    lsof -i :80

    输出示例:

    linux如何查看tcp连接

    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/关联进程。

实用示例

  1. 查看本地IP和端口(转换十六进制)
    本地地址0100007F:0035转换:

    • IP:0100007F(十六进制)= 0.0.1(十进制,小端序);
    • 端口:0035(十六进制)= 53(十进制)。
      该连接为本地127.0.0.1的53端口(DNS服务)。
  2. 通过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 原始数据,适合二次开发 需手动转换格式,可读性差 内核调试、自动化脚本开发

常见问题排查思路

  1. 端口占用无法启动服务
    使用ss -tlnp | grep :端口号lsof -i :端口号查看占用进程,若为无用进程则kill,若为服务冲突则修改服务端口。

  2. TCP连接数过高导致性能下降
    通过ss -s查看连接总数,ss -tp state established查看已建立连接数,结合top -p PID监控进程资源占用;若TIME_WAIT连接过多,可调整内核参数(如net.ipv4.tcp_tw_reuse=1)。

相关问答FAQs

Q1: 如何快速统计当前服务器上ESTABLISHED状态的TCP连接数?
A: 使用ssnetstat结合grep统计:

# 方法1(ss,推荐)
ss -t state established | wc -l
# 方法2(netstat)
netstat -tna | grep 'ESTABLISHED' | wc -l

Q2: 如何排查某个IP频繁与服务器的80端口建立连接?
A: 使用ssnetstat结合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

(0)
酷番叔酷番叔
上一篇 2025年9月19日 14:59
下一篇 2025年9月19日 15:11

相关推荐

  • Linux多终端,复用器还是分屏更高效?

    Linux提供终端复用器(如tmux/screen)和多终端窗口/标签页两种核心方式,实现灵活的多任务并行操作与高效终端管理,显著提升工作效率。

    2025年8月8日
    3300
  • Linux下rviz重装的详细步骤与方法是什么?

    在Linux系统中,rviz作为ROS(Robot Operating System)的核心可视化工具,常用于机器人数据的3D可视化,若因版本冲突、依赖损坏或功能异常需要重装,需遵循规范的卸载、清理、安装及验证流程,以下是详细操作步骤,涵盖主流Linux发行版(如Ubuntu/Debian、Fedora/Cen……

    2025年10月7日
    1000
  • 在Linux系统中,如何从头开始编写并运行C语言程序?

    在Linux系统中编写C语言程序是开发者的基础技能,整个过程涉及环境搭建、代码编写、编译运行、调试优化等环节,本文将详细讲解从零开始到完成一个完整C程序的全流程,帮助读者掌握Linux下C语言开发的核心操作,开发环境准备在Linux下编写C程序,首先需要确保系统安装了必要的工具,主要包括文本编辑器、编译器和调试……

    2025年9月21日
    2400
  • Linux误删文件夹还能恢复吗?

    核心命令详解rmdir 命令(安全删除空文件夹)适用场景:仅删除空文件夹,命令格式:rmdir 文件夹路径示例:rmdir /home/user/empty_folder # 删除名为 empty_folder 的空目录⚠️ 限制:若文件夹非空,将报错 Directory not empty,rm 命令(递归删……

    2025年6月28日
    5800
  • 为什么加班越多效率越低?

    如何将本地文件上传到 Linux 服务器(详细指南)在日常开发、运维或数据管理中,将本地文件上传到 Linux 服务器是高频操作,本文提供 4 种主流方法,涵盖命令工具与图形界面,兼顾安全性与效率,适合不同技术背景的用户,SCP 命令(安全复制)适用场景:快速传输单个文件或小批量文件,基于 SSH 加密,操作步……

    2025年7月16日
    6000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信