ss命令深度解析:比 netstat 快 10 倍的网络连接排查工具!
在网络运维领域,netstat 命令曾经是查看网络连接状态的经典工具,就像一位经验丰富的老工匠,陪伴着运维人员走过了许多岁月。在学习 Linux 时,大家通常会被教导使用 netstat -an 来查看端口监听情况。它的工作原理是读取 /proc 文件系统中的信息,比如从 /proc/net/tcp 获取 TCP 连接信息,从 /proc/net/udp 获取 UDP 连接信息 。在过去网络规模较小、连接数不多的情况下,netstat 表现得中规中矩,能够满足基本的网络排查需求,就像一辆在平坦小路上行驶的汽车,平稳且实用。
随着互联网的飞速发展,业务量呈爆发式增长,高并发场景越来越常见。在电商大促、直播带货等活动期间,服务器上的网络连接数可能会在短时间内激增到数千甚至数万个。在这种情况下,netstat 就像一位年迈的老人,逐渐显得力不从心。当连接数大幅增加时,netstat 的响应速度变得极其缓慢,执行一次命令可能需要等待几秒甚至十几分钟。
为了解决 netstat 在高并发场景下的困境,ss 命令应运而生,它就像一位年轻有为的新秀,迅速崭露头角。ss 命令早在 2001 年就已出现,全称是 Socket Statistics(套接字统计信息) 。它最大的优势在于直接从内核获取信息,使用 netlink socket 与内核通信,这就好比是一条高速公路,大大提高了数据获取的效率。与 netstat 相比,ss 在处理高并发连接时表现得游刃有余,能够在短时间内快速返回网络连接状态信息,通常不到 0.1 秒就能完成,为运维人员节省了大量的时间,就像在拥堵的城市中开辟了一条快速通道,让网络排查工作更加高效。
netstat:经典但渐显疲态
(一)netstat 命令介绍
netstat,即 “network statistics” 的缩写,作为一款老牌的网络命令行工具,在网络排查领域堪称经典。它主要用于显示网络连接、路由表、接口统计信息、伪装连接以及多播成员等信息 ,就像是网络世界的 “探测器”,为运维人员提供了深入了解系统网络状况的关键数据。无论是检查网络连接是否正常,还是查看哪些服务正在监听端口,netstat 都能发挥重要作用,帮助运维人员快速定位和解决网络问题。
(二)netstat 工作原理
netstat 的工作原理是通过读取文件系统来获取网络信息。在 Linux 系统中,它主要读取 /proc 文件系统下的相关文件。例如,从 /proc/net/tcp 文件中获取 TCP 连接的详细信息,包括本地和远程的 IP 地址、端口号以及连接状态等;从 /proc/net/udp 文件中获取 UDP 连接的信息 ;从 /proc/net/route 文件中读取路由表信息,了解数据包在网络中的转发路径。通过对这些文件的读取和解析,netstat 将内核中的网络信息以直观的方式呈现给用户,让用户能够清晰地了解网络的运行状态。
(三)netstat 使用场景与示例
netstat 在实际应用中有多种使用场景,以下是一些常见的例子:
• 查看活动连接:使用 netstat -a命令可以显示所有活动的网络连接,包括正在监听的端口和已建立的连接。执行该命令后,会列出一系列连接信息,其中 “Proto” 列表示协议类型,如 TCP 或 UDP;“Local Address” 列显示本地的 IP 地址和端口号;“Foreign Address” 列展示远程的 IP 地址和端口号;“State” 列则表明连接的状态,如 “LISTENING” 表示正在监听,“ESTABLISHED” 表示已建立连接。• 查看监听端口:若想查看系统中正在监听的端口,可以使用 netstat -l命令。这个命令会过滤出所有处于监听状态的套接字,让运维人员快速了解哪些服务正在等待传入的连接请求,从而判断系统的服务运行状况。• 统计连接状态数量: netstat -an | grep ESTABLISHED | wc -l这个命令可以统计当前处于 “ESTABLISHED” 状态(即已建立连接)的 TCP 连接数量。在排查网络连接稳定性或分析网络负载时,这一数据非常有用,能帮助运维人员了解当前网络的繁忙程度。
(四)netstat 存在的问题
尽管 netstat 曾经是网络排查的得力助手,但随着技术的发展,它逐渐暴露出一些问题。在高并发环境下,当服务器需要处理大量的网络连接时,netstat 的性能表现就显得不尽如人意,速度变得非常缓慢。这是因为它需要读取多个文件并进行复杂的解析操作,随着连接数的增加,这些操作的开销变得越来越大,导致命令执行时间大幅延长。
netstat 的功能也相对有限。它在获取网络信息时,往往只能提供一些基本的统计数据,对于一些更深入的网络分析需求,如查看特定进程的详细网络流量、分析网络连接的性能瓶颈等,netstat 就难以满足。在现代复杂的网络环境中,这些功能的缺失使得 netstat 在处理一些高级网络问题时显得力不从心。
由于 netstat 基于文件系统读取信息的方式在效率和功能上的局限性,在一些现代的内核中,它可能不再被支持或更新。这也促使运维人员寻找更高效、更强大的替代工具,以适应不断变化的网络环境和日益增长的网络管理需求。
ss:后来居上的新星
(一)ss 命令介绍
ss 命令,全称 Socket Statistics(套接字统计信息),是 Linux 系统中用于查看网络连接、路由表、接口统计信息等网络相关信息的命令行工具。它可以获取 TCP、UDP、Unix 套接字等各种类型的 socket 统计信息,涵盖了连接状态、接收和发送队列、本地和远程地址及端口等详细数据,就像一把万能钥匙,能够打开网络连接状态的大门,为运维人员提供全面且准确的网络信息。
(二)ss 工作机制
ss 命令之所以能高效运行,关键在于它直接从内核获取信息,使用 netlink socket 与内核通信 。netlink 是 Linux 内核提供的一种用户空间与内核空间通信的机制,专门用于获取网络统计信息。它就像一条高速通道,绕过了复杂的文件系统读取过程,使得 ss 能够快速地从内核获取最新的网络连接数据。与 netstat 读取 /proc 文件系统的方式相比,netlink 通信机制更加高效,减少了数据获取的时间和系统资源的消耗,就好比乘坐高铁比走普通公路更快到达目的地一样。
(三)用 strace 揭秘性能差异
为了更直观地对比 netstat 和 ss 的性能差异,我们可以使用 strace 工具来跟踪它们的系统调用。strace 是一个用于跟踪进程执行时的系统调用和信号接收的工具,通过它可以清晰地看到程序在执行过程中与操作系统内核的交互情况。
使用strace -c netstat -an > /dev/null命令来跟踪 netstat -an 的系统调用,输出结果显示 netstat 执行了大量的 read、openat、close 等操作,这些操作主要是在读取 /proc 文件系统中的信息。由于 /proc 文件系统是一种虚拟文件系统,读取其中的文件需要进行多次磁盘 I/O 操作和文件解析,这就导致了 netstat 在处理大量连接时效率低下。
再使用strace -c ss -an > /dev/null命令跟踪 ss -an 的系统调用,结果显示 ss 的系统调用明显少很多,主要是 socket、sendto、recvmsg 这些与 netlink 通信相关的调用。这表明 ss 通过 netlink socket 与内核直接通信,避免了频繁的磁盘 I/O 和文件解析操作,大大提高了获取网络信息的效率,从系统调用的层面直观地展示了 ss 比 netstat 更快的原因。
ss 命令详细用法与实战案例
(一)ss 命令常用选项详解
• -t, --tcp:仅显示 TCP 协议的套接字连接。在查看 TCP 相关的网络连接时非常有用,比如查看 Web 服务器的 TCP 连接状态,能清晰地了解到与客户端建立的 TCP 连接情况 ,可以执行 ss -t。• -u, --udp:用于显示 UDP 协议的套接字连接。在排查 UDP 相关服务,如 DNS(Domain Name System)服务时,这个选项能帮助我们查看 UDP 端口的使用情况,判断 DNS 服务器是否正常接收和发送 UDP 数据包,使用命令 ss -u即可。• -l, --listening:只显示处于监听状态的套接字。通过 ss -l命令,我们可以快速了解系统中哪些服务正在监听端口,等待传入的连接请求,对于检查服务是否正常启动并监听特定端口很有帮助。• -a, --all:对 TCP 协议来说,既包含监听的端口,也包含建立的连接。执行 ss -a命令,能够全面展示系统中 TCP 和 UDP 的所有连接状态,无论是正在监听的端口,还是已经建立的网络连接,都能一目了然,方便我们对整体网络连接状况进行全面的把控和分析。• -n, --numeric:不解析服务的名称,直接显示端口号和 IP 地址。使用 ss -n命令,在需要快速获取端口和 IP 地址信息,而不希望系统进行名称解析时,能提高信息获取的速度,避免因名称解析失败或耗时过长而影响查看效率。• -p, --processes:显示使用套接字的进程信息(在 Ubuntu 上需要 sudo 权限)。当我们想知道哪个进程占用了某个端口时,使用 ss -p命令,比如ss -t -p查看 TCP 连接及其对应的进程,输出结果中会显示进程名、PID(进程 ID)和文件描述符,方便我们定位和管理相关进程。• -r, --resolve:把 IP 解释为域名,把端口号解释为协议名称。使用 ss -r命令,能将抽象的 IP 地址和端口号转换为更易理解的域名和协议名称,对于不太熟悉 IP 和端口含义的用户来说,有助于更直观地理解网络连接的相关信息 。• -o, --options:显示计时器信息。执行 ss -o命令,可以查看 TCP 连接的一些计时器信息,如 retransmit(重传时间)、keepalive(保活时间)等,这些信息对于分析网络连接的稳定性和性能非常重要,有助于我们诊断网络连接中的延迟、超时等问题。• -m, --memory:显示 socket 使用的内存情况。通过 ss -m命令,能够了解每个套接字所占用的内存资源,在对系统内存使用情况进行分析,特别是排查网络相关的内存占用问题时,这个选项能提供关键的数据支持 。• -i, --info:显示更多 TCP 内部的信息,如 RTT(Round - Trip Time,往返时间)、拥塞窗口等。使用 ss -i命令,对于深入分析 TCP 连接的性能和网络状况,尤其是在处理网络拥塞、优化网络传输效率等方面,这些内部信息能帮助我们更好地理解 TCP 连接的工作状态,从而采取针对性的优化措施。• -s, --summary:显示套接字使用概况,包括各种协议的套接字总数、TCP 连接的不同状态数量等。执行 ss -s命令,能快速获取系统中网络连接的整体统计信息,对系统的网络负载情况有一个宏观的了解,便于及时发现网络连接异常增多或减少等问题 。
(二)ss 命令使用场景与示例
1. 监控网络连接状态:在排查网络连接故障或了解系统当前的网络负载时,我们常常需要查看所有已建立的 TCP 连接。使用 ss -t -a命令即可实现这一目的。例如,在一台 Web 服务器上执行该命令,输出结果可能如下:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:80 10.0.0.5:54321
ESTAB 0 0 192.168.1.100:80 10.0.0.6:54322从输出中可以清晰地看到,本地地址为 192.168.1.100 的 Web 服务器通过 80 端口与远程地址 10.0.0.5 和 10.0.0.6 建立了 TCP 连接 ,连接状态为 “ESTAB”(ESTABLISHED 的缩写,表示已建立连接),接收队列(Recv - Q)和发送队列(Send - Q)中都没有未处理的数据。
1. 查找特定端口的使用情况:当我们部署新的服务或排查端口冲突问题时,需要检查指定端口是否被占用,并定位对应的进程。比如,要检查 22 端口(通常用于 SSH 服务)是否被占用,可以使用 ss -p src :22命令。如果 22 端口被占用,输出结果可能如下:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 64 172.17.0.17:22 113.225.172.204:53724
users:((\\"sshd\\",pid=18546,fd=3))这表明 22 端口被名为 “sshd”(SSH 守护进程)的进程占用,其进程 ID 为 18546,文件描述符为 3 ,同时还显示了本地和远程的 IP 地址及端口号,以及连接状态等信息。
1. 检查系统的监听套接字:为了确保系统中的服务正常启动并监听正确的端口,我们可以使用 ss -l命令查看所有监听状态的套接字及其进程信息。如果是查看 TCP 监听端口,可以使用ss -tl命令,输出示例如下:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 \*:80 \*:\*
LISTEN 0 128 \*:22 \*:\*上述结果显示,系统正在通过 80 端口(可能运行着 Web 服务)和 22 端口(SSH 服务)进行监听,等待客户端的连接请求 ,“LISTEN” 状态表示套接字正在监听连接,接收队列和发送队列的初始值分别为 0 和 128,这是系统默认的设置,用于限制等待处理的连接请求数量。
1. 按条件精准过滤连接:在复杂的网络环境中,我们往往需要根据特定的条件来过滤网络连接,以便更精准地分析问题。
• 按端口过滤:查看源端口为 80 的 TCP 连接,可以使用 ss -t sport = :80命令,这对于分析 Web 服务器作为源端发起的连接非常有用。• 按 IP 地址过滤:若要查看目标 IP 为 192.168.1.1 的 TCP 连接,执行 ss -t dst ``192.168.1.1命令即可,在排查与特定 IP 地址通信相关的问题时,这个命令能快速筛选出相关的连接信息。• 按连接状态过滤:查看所有处于 “ESTABLISHED” 状态的 TCP 连接,使用 ss -t state established命令,这有助于了解当前已经稳定建立的连接情况,判断网络通信的活跃程度。
1. 分析 TCP 性能:在优化网络性能时,深入了解 TCP 连接的内部状态至关重要。使用 ss -ti命令可以查看 TCP 连接的一些内部状态信息,如拥塞窗口(cwnd)、RTT 等。例如,输出结果可能包含如下信息:
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 192.168.1.100:80 10.0.0.5:54321
  cubic wscale:7,7 rto:204 rtt:12.3/4.8 ato:40 mss:1448其中,“cubic” 是拥塞控制算法,“rto” 表示重传超时时间,“rtt” 显示了往返时间(当前值为 12.3ms,平均值为 4.8ms),“ato” 是确认超时时间,“mss” 为最大段大小 。通过这些信息,我们可以评估网络的拥塞程度、延迟情况等,进而采取相应的优化措施,如调整拥塞控制算法、优化网络带宽分配等,以提升网络性能。
ss 与 netstat 的全方位对比
在网络连接排查工具的领域中,ss 和 netstat 就像是两个风格迥异的武林高手,各有千秋。下面我们从多个维度来对比这两者的差异,以便在实际应用中能够精准选择合适的工具。
性能对比
在性能方面,ss 展现出了明显的优势。ss 直接与内核通信,使用 netlink socket 获取信息,这使得它在处理大量网络连接时速度极快,通常能在瞬间完成操作 。而 netstat 需要读取 /proc 文件系统,在连接数较多时,大量的磁盘 I/O 和文件解析操作会导致其响应迟缓,可能需要数秒甚至更长时间才能返回结果。例如,在一个拥有数千个网络连接的服务器上,执行 ss 命令查看连接状态几乎能立即得到结果,而 netstat 命令则可能会让运维人员苦苦等待,影响工作效率。
功能对比
功能上,ss 更为强大和全面。它不仅能像 netstat 一样查看网络连接、路由表等基本信息,还能提供更详细的 TCP 连接状态、UDP 连接的详细信息以及 Unix 域套接字的连接状态等 。比如,ss 可以显示 TCP 连接的重传次数、拥塞窗口大小等关键性能指标,这些对于深入分析网络性能和故障排查非常有帮助,而 netstat 在这方面的信息展示则相对匮乏。
现代性对比
从现代性来看,ss 是更贴合现代 Linux 系统发展趋势的工具。随着内核的不断演进,netstat 在某些新版本的内核中可能不再被支持或更新 ,而 ss 则积极适应现代内核的变化和需求,持续为用户提供稳定高效的服务,成为现代 Linux 系统中推荐使用的网络连接查看工具。
易用性对比
易用性方面,ss 的选项和参数设计得更加直观简洁。例如,使用 ss -t 可以快速查看所有 TCP 连接,操作简单明了;而 netstat -t 要达到类似效果,可能需要搭配更多的选项,对于初学者或不熟悉的用户来说,学习成本相对较高 。
依赖性对比
在依赖性上,ss 是 iproute2 包的一部分,而 netstat 属于 net-tools 包 。iproute2 包是现代 Linux 系统中推荐使用的网络工具包,发展较为活跃;net-tools 包则被认为是过时的,在一些新的 Linux 发行版中甚至不再默认安装。
综上所述,在高并发、对性能要求较高以及需要详细网络信息的场景下,ss 无疑是首选工具;而在一些对性能要求不高、网络连接简单且更习惯使用经典工具的场景中,netstat 也仍能发挥一定的作用。但总体而言,随着网络技术的不断发展,ss 凭借其卓越的性能和丰富的功能,逐渐成为网络连接排查的主流工具 。
在网络连接排查的领域中,ss 命令凭借其卓越的性能、强大的功能和现代性,成为了比 netstat 更具优势的工具。它在高并发场景下的高效表现,以及丰富多样的选项和参数,为运维人员提供了更精准、更快速的网络连接分析能力,大大提升了网络排查工作的效率和质量。