Linux ss 命令教程
在早期运维工作中,查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令!
netstat命令是net-tools工具集中的一员,这个工具一般linux系统会默认安装的;ss命令是iproute工具集中的一员;
net-tools是一套标准的Unix网络工具,用于配置网络接口、设置路由表信息、管理ARP表、显示和统计各类网络信息等等,但是遗憾的是,这个工具自2001年起便不再更新和维护了。
iproute,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集。
SS的用法
语法
ss [参数] ss [参数] [过滤]
选项
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-p, --processes 显示使用套接字(socket)的进程
-i, --info 显示 TCP内部信息
-s, --summary 显示套接字(socket)使用概况
-4, --ipv4 仅显示IPv4的套接字(sockets)
-6, --ipv6 仅显示IPv6的套接字(sockets)
-0, --packet 显示 PACKET 套接字(socket)
-t, --tcp 仅显示 TCP套接字(sockets)
-u, --udp 仅显示 UCP套接字(sockets)
-d, --dccp 仅显示 DCCP套接字(sockets)
-w, --raw 仅显示 RAW套接字(sockets)
-x, --unix 仅显示 Unix套接字(sockets)
-f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink
-F, --filter=FILE 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]
实例
ss -t -a # 显示TCP连接 ss -s # 显示 Sockets 摘要 ss -l # 列出所有打开的网络连接端口 ss -pl # 查看进程使用的socket ss -lp | grep 3306 # 找出打开套接字/端口应用程序 ss -u -a 显示所有UDP Sockets ss -o state established '( dport = :smtp or sport = :smtp )' # 显示所有状态为established的SMTP连接 ss -o state established '( dport = :http or sport = :http )' # 显示所有状态为Established的HTTP连接 ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24 # 列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字 # ss 和 netstat 效率对比 time netstat -at time ss # 匹配远程地址和端口号 # ss dst ADDRESS_PATTERN ss dst 192.168.1.5 ss dst 192.168.119.113:http ss dst 192.168.119.113:smtp ss dst 192.168.119.113:443 # 匹配本地地址和端口号 # ss src ADDRESS_PATTERN ss src 192.168.119.103 ss src 192.168.119.103:http ss src 192.168.119.103:80 ss src 192.168.119.103:smtp ss src 192.168.119.103:25
将本地或者远程端口和一个数比较
# ss dport OP PORT 远程端口和一个数比较; # ss sport OP PORT 本地端口和一个数比较 # OP 可以代表以下任意一个: # <= or le : 小于或等于端口号 # >= or ge : 大于或等于端口号 # == or eq : 等于端口号 # != or ne : 不等于端口号 # < or gt : 小于端口号 # > or lt : 大于端口号 ss sport = :http ss dport = :http ss dport \> :1024 ss sport \> :1024 ss sport \< :32000 ss sport eq :22 ss dport != :22 ss state connected sport = :http ss \( sport = :http or sport = :https \) ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24
用TCP 状态过滤Sockets
ss -4 state closing # ss -4 state FILTER-NAME-HERE # ss -6 state FILTER-NAME-HERE # FILTER-NAME-HERE 可以代表以下任何一个: # established、 syn-sent、 syn-recv、 fin-wait-1、 fin-wait-2、 time-wait、 closed、 close-wait、 last-ack、 listen、 closing、 # all : 所有以上状态 # connected : 除了listen and closed的所有状态 # synchronized :所有已连接的状态除了syn-sent # bucket : 显示状态为maintained as minisockets,如:time-wait和syn-recv. # big : 和bucket相反.
列出所有端口为 22(ssh)的连接
[root@localhost ~]# ss state all sport = :ssh Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp LISTEN 0 128 *:ssh *:* tcp ESTAB 0 0 192.168.0.136:ssh 192.168.0.102:46540 tcp LISTEN 0 128 :::ssh :::*
查看TCP的连接状态
[root@localhost ~]# ss -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}'
LISTEN 7
ESTAB 31
TIME-WAIT 28
ss命令和netstat命令比较
ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。原因如下:
1)当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。可能你不会有切身的感受,但请相信我,当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。
2)而ss快的秘诀在于它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢(但仍然比 netstat要快)。
为了验证ss比netstat更快更高效,可以如下做几个实验看看效果:
如果没有ss命令,可以如下安装:
[root@wang ~]# yum install iproute iproute-doc
当服务器维持30000个socket连接时,使用netstat和ss命令统计连接数的耗时情况如下:
[root@wang ~]# netstat -at | wc -l //耗时15.60秒
[root@wang ~]# ss -atr | wc -l //耗时5.40秒(未利用tcp_diag)
[root@wang ~]# ss -atr | wc -l //耗时0.47秒(利用tcp_diag)
--------------------------连接状态------------------------------
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
CLOSED 初始(无连接)状态。
LISTEN 侦听状态,等待远程机器的连接请求。
SYN_SEND 在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV 在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED 完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1 在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2 在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT 在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING 在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT 在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK 在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
主动连接端可能的状态有: CLOSED SYN_SEND ESTABLISHED
主动关闭端可能的状态有: FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT
被动连接端可能的状态有: LISTEN SYN_RECV ESTABLISHED
被动关闭端可能的状态有: CLOSE_WAIT LAST_ACK CLOSED
查看tomcat的并发数:netstat -an|grep 10050|awk '{count[$6]++} END{for (i in count) print(i,count[i])}'
|
附录:
1. netstat属于net-tools工具集,ss属于ipoute工具集。替换方案如下:

2. netstat 用法:
与 netstat 命令一起使用的常见命令行选项有:
-l, –listening 显示监听服务器套接字
-a, –all 显示所有套接字(默认:已连接)
-r, –route 显示路由表
–i, –interfaces 显示接口表
-g, –groups 显示组播组成员资格
-s, –statistics 显示网络统计信息(如 SNMP)
-M, –masquerade 显示伪装的连接
-v, –verbose 详细
-W, –wide 不截断 IP 地址
-n, –numeric 不解析名称< br>-e, –extend 显示其他/更多信息
-p, –programs 显示套接字的 PID/程序名称
-o, –timers 显示计时器
-F, –fib 显示转发信息库(默认)
-C, –cache 显示路由缓存而不是FIB
用法示例:
显示所有套接字(默认:已连接)
要获取系统上不同协议的所有活动连接的列表,请运行:
$ netstat -a
列出所有 UDP 端口
$ netstat -au
列出所有 TCP 端口:
$ netstat -at
列出所有监听端口:
$ netstat -l
列出所有侦听 TCP 端口:
$ netstat -lt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:nfs 0.0.0.0:* LISTEN tcp 0 0 localhost.localdo:18083 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:37959 0.0.0.0:* LISTEN tcp 0 0 localhost.locald:mshvlm 0.0.0.0:* LISTEN
列出所有监听的udp端口:
要列出侦听 udp 端口,请使用选项-lu
$ netstat -lu Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 0.0.0.0:52179 0.0.0.0:* udp 0 0 0.0.0.0:mountd 0.0.0.0:* udp 0 0 dev.jmtai.com:bootpc 0.0.0.0:* udp 0 0 0.0.0.0:sunrpc 0.0.0.0:* ....
显示内核路由表
选项-r用于查看内核路由表。
$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default _gateway 0.0.0.0 UG 0 0 0 tun0 default _gateway 0.0.0.0 UG 0 0 0 wlp1s0 10.10.46.0 _gateway 255.255.255.0 UG 0 0 0 tun0 10.20.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
查看哪个进程正在侦听特定端口:
格式为:netstat -pln | grep <端口> | awk ‘{print $NF}’。作为查看哪个进程正在侦听端口 22 的示例:
$ sudo netstat -pln | grep 22 | awk '{print $NF}'
7885/sshd
要确认这一点,请通过 ps 命令进行检查。
$ ps aux | grep 7885 root 7885 0.0 0.0 40692 5452 ? Ss 18:54 0:00 /usr/bin/sshd -D
仅显示 IPv4 侦听端口(TCP 和 UDP)
默认情况下,Netstat 会提供 IPv4 和 IPv6 侦听端口列表。要获取仅包含 IPv4 的列表,请使用:
$ sudo netstat -vutlnp --listening -4 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7885/sshd tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:18083 0.0.0.0:* LISTEN 429/vboxwebsrv tcp 0 0 0.0.0.0:37959 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:6600 0.0.0.0:* LISTEN 678/mpd tcp 0 0 0.0.0.0:49743 0.0.0.0:* LISTEN 422/rpc.statd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init ...
显示所有接口的网络统计信息
可以使用命令选项-s查看界面统计信息。
sudo netstat -s
要显示 tcp 统计信息,请使用 -st, 要显示 udp 统计信息,请使用 -su
显示 IPv4 和 IPv6 的多播组成员身份
组播是组通信,其中数据传输同时发送到一组目标计算机。要获取多播组成员身份,请使用选项-g
$ sudo netstat -g IPv6/IPv4 Group Memberships Interface RefCnt Group --------------- ------ --------------------- lo 1 all-systems.mcast.net wlp1s0 1 224.0.0.251 wlp1s0 1 all-systems.mcast.net tun0 1 224.0.0.251 tun0 1 all-systems.mcast.net lo 1 ff02::1 lo 1 ff01::1 wlp1s0 1 ff02::fb wlp1s0 1 ff02::1:ff48:91f8 wlp1s0 1 ff02::1 wlp1s0 1 ff01::1 tun0 1 ff02::fb tun0 1 ff02::1 tun0 1 ff01::1
列出所有正在侦听的 UNIX 端口
$ sudo netstat -lx Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] STREAM LISTENING 21766 /tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 276493 /run/user/1000/pulse/cli unix 2 [ ACC ] STREAM LISTENING 21789 /run/user/1000/i3/ipc-socket.644 unix 2 [ ACC ] STREAM LISTENING 49182 /tmp/qtsingleapp-HipCha-9b70-3e8 unix 2 [ ACC ] STREAM LISTENING 21765 @/tmp/.X11-unix/X0 unix 2 [ ACC ] STREAM LISTENING 18468 /run/gssproxy.sock unix 2 [ ACC ] STREAM LISTENING 2609 /run/systemd/private unix 2 [ ACC ] STREAM LISTENING 2620 /run/rpcbind.sock ...
查找正在运行的进程使用的端口
$ sudo netstat -ap | grep ssh tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 7885/sshd tcp6 0 0 [::]:ssh [::]:* LISTEN 7885/sshd
在可能的情况下显示 IP 地址的域名:
netstat -ltF
此命令将列出侦听 tcp 端口,但在输出中显示域名。
以连续模式显示输出
使用 –c 选项可以通过每五秒刷新一次来连续显示输出。
netstat -ac 5