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)
酷番叔酷番叔
上一篇 1小时前
下一篇 1小时前

相关推荐

  • Linux下如何安装安卓系统?

    在Linux系统中安装安卓系统是许多开发者和技术爱好者探索跨平台体验、满足特定应用需求或进行开发调试的常见需求,本文将详细介绍通过虚拟机、双系统、容器化等多种方式在Linux上安装安卓的具体步骤、注意事项及优缺点分析,帮助用户根据自身需求选择合适方案,通过虚拟机安装:安全隔离的轻量级方案虚拟机技术可在Linux……

    1天前
    400
  • 如何快速入睡

    在 Linux 系统中安装 Lantern(注意:您查询的 “lentern” 可能是拼写错误,正确名称应为 Lantern,一款网络代理工具)的详细步骤如下,本文提供两种主流安装方式,适用于 Ubuntu、Debian、Fedora、CentOS 等主流发行版,通过官方安装包安装(推荐)步骤 1:下载安装包访……

    2025年6月17日
    4100
  • linux如何登入到root

    Linux中,可通过切换用户su -或使用sudo -i等命令,输入root密码后

    2025年8月19日
    1800
  • 在Linux系统中,删除文件和目录是基础但关键的操作。以下是详细指南,涵盖命令行、图形界面及安全实践,确保操作安全高效

    命令行删除(核心方法)删除文件rm 文件名 # 删除单个文件(例: rm report.txt)rm 文件1 文件2 # 批量删除文件rm *.log # 通配符删除所有.log后缀文件关键选项:-i:交互确认(推荐新手)rm -i important.txt # 删除前提示确认-f:强制删除(忽略错误提示)r……

    2025年8月7日
    2100
  • Linux文件目录rw权限如何管理?

    理解权限基础权限组成r(读):查看文件内容或目录列表,w(写):修改文件内容,或在目录中创建/删除文件,x(执行):运行程序或进入目录,权限分配对象:所有者(user)、所属组(group)、其他用户(others),查看当前权限使用 ls -l 命令查看权限(示例输出):-rw-r–r– 1 user g……

    2025年7月2日
    3900

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信