linux-command-04 ss

linux-command-04 ss

概念解析

  ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快。当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。ss 命令利用到了 TCP 协议栈中 tcp_diag。tcp_diag 是一个用于分析统计的模块,可以获得 Linux 内核中第一手的信息,因此 ss 命令的性能会好很多。

  ss命令用于显示socket状态。他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets,Unix domain sockets等等统计。它比其他工具展示等多tcp和state信息。 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具。SS命令可以提供如下信息:

  • 所有的TCP sockets
  • 所有的UDP sockets
  • 所有ssh/ftp/ttp/https持久连接
  • 所有连接到Xserver的本地进程
  • 使用state(例如:connected, synchronized, SYN-RECV, SYN-SENT,TIME-WAIT)、地址、端口过滤
  • 所有的state FIN-WAIT-1 tcpsocket连接以及更多

  很多流行的Linux发行版都支持ss以及很多监控工具使用ss命令。熟悉这个工具有助于您更好的发现与解决系统性能问题。强烈建议使用ss命令替代netstat部分命令,例如netsat -ant/lnt等。

  总之,netstat 已经过时了,ss 是功能更强大的命令 。

ss 和 netstat 效率对比

用time来计时

1)netstat

1
[root@node4 ~]# time netstat -a

1Pa3es.png

2)ss

1
[root@node4 ~]# time ss -a

1Pa6Fx.png

  可以看到,一个是秒级的,一个是毫秒级的。在敲下time netstat -a我们也能明显感觉到需要等两秒,很心塞。然而在敲下time ss -a时,瞬间就显示出了所有结果,高下立见。

注意

(1)netstat命令是net-tools工具集中的一员
(2)ss命令是iproute工具集中的一员

所以要使用ss命令的话,需要先安装iproute、iproute-doc

1
[root@node4 ~]# yum install iproute iproute-doc -y

常用参数

1
2
3
4
5
6
7
8
9
10
11
12
-h, --help 帮助
-V, --version 显示版本号
-t, --tcp 显示 TCP 协议的 sockets
-u, --udp 显示 UDP 协议的 sockets
-x, --unix 显示 unix domain sockets,与 -f 选项相同
-n, --numeric 不解析服务的名称,如 "22" 端口不会显示成 "ssh"
-l, --listening 只显示处于监听状态的端口
-p, --processes 显示监听端口的进程(Ubuntu 上需要 sudo)
-a, --all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-r, --resolve 把 IP 解释为域名,把端口号解释为协议名称
-s, --summary 显示 Sockets 摘要
-m, --memory 显示内存情况

所有参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
如果没有指定任何参数,则ss列出所有已经建立、并不处在listen的TCP 套接字。

-h, –help
列出选项概要

-V,–version
输出版本信息

-n, –numeric
不尝试解析服务的名字

-r,–resolve
尝试解析数字地址/端口

-a,–all
显示处在listening 和 非listening 状态的套接字(对TCP来说,这意味所有已建立的连接)。

-l,–listening
只显示处在 listening 状态的套接字(默认情况下它们是被忽略的)

* -o, –options*
显示定时器信息

-e,–extended
显示详细的套接字信息

-m,–memory
显示套接字的内存使用信息

-p, –process
显示使用套接字的进程

-i, –info
显示TCP内部信息

-s,–summary
显示概要统计。该选项不分析来自不同来源的套接字概要信息。 当套接字的数量很大导致分析/proc/net/tcp 很痛苦时,它很有用。

-Z,–context
同 -p 选项,不过还显示进程的安全上下文

-z,–contexts
同 -Z, 不过还显示套接字的上下文。 该套接字上下文是从inode里取出的、并不是内核持有的实际的socket上下文。 套接子通常以创建它的进程上下文标记, 但该上下文会反映已应用上的policy role, type and/or range , 因此这是个很有用的参考。

-b,-bpf
显示套接字的BPF过滤(只有管理员能获取这些信息)

-4,–ipv4
只显示IPv4 套接字(-f inet的别名)

-6,–ipv6
只显示IPv6 套接字(-f inet6的别名)

-0,–packet
显示PACKET 套接字(-f link的别名)

-t,–tcp
显示 TCP 套接字

-u,–udp
显示UDP 套接字

-d,–dccp
显示 DCCP 套接字

-w,–raw
显示 RAW 套接字

-x,–unix
显示 Unix Domain 套接字(-f unix的别名)

-f FAMILY,–family=FAMILY
显示类型为FAMILY的套接字。 支持以下几个family: unix, inet,inet6,link,netlink

-A QUERY, –query=QUERY, –socket=QUERY
列出需要倒出的套接字列表,用逗号隔开。 支持以下标识符: all, inet, tcp, udp, raw, unix, packet, netlink, unix_dgram, unix_stream, unix_seqpacket, packet_raw, packet_dgram

-D FILE, –diag=FILE
不显示任何内容,仅把原始TCP套接字信息存入文件FILE。 如果FILE为 - , 则使用stdout作为输出。

-F FILE, –filter=FILE
从文件FILE中读取信息。 文件的每一行被认为是单个命令行参数。 如果FILE为 - , 则使用stdin。

* FILTER := [ state TCP-STATE ] [ EXPRESSION ] *
请参考filter的官方文档(debian 包 iproute-doc).

实例解析

1.查看进每个程具体打开的socket

1
[root@node4 ~]# ss -pl

1PahOH.png

2.找出打开某套接字或某端口的应用程序

1
[root@node4 ~]# ss -pl | grep 622

1PaO1S.png

3.显示所有的连接(按回车换行,按空格翻页,按ctrl+z退出)

1
[root@node4 ~]# ss | less

4.把TCP连接过滤出来

1
[root@node4 ~]# ss -at

1Paxmj.png

5.把UDP连接过滤出来

1
[root@node4 ~]# ss -au

1PdCt0.png

6.不解析主机名

  为了加快输出的速度,用”n”选项防止ss 解析IP地址到主机名。不过这同样阻止了对端口名的解析。

1
[root@node4 ~]# ss -ant

1PdFpT.png

7.只显示监听的套接字(参数l)

1
[root@node4 ~]# ss -lnt

和之前的netstat一样,用参数l的时候不要用参数a,才能只显示监听状态的连接

1PdEX4.png

8.打印进程名和进程号(p参数)

1
[root@node4 ~]# ss -ltp

1PwQVs.png

9.打印统计概要

1
[root@node4 ~]# ss -s

1PwwZ9.png

10.仅显示IPv4 或 IPv6 连接

1
2
[root@node4 ~]# ss -tl4
[root@node4 ~]# ss -tl6

1Pw0aR.png

  1. 列出处在 time-wait 状态的套接字,下图这里一个也没有。
1
[root@node4 ~]# ss state time-wait

1PwrPx.png

那我们换个状态列出处在established状态的套接字

1
[root@node4 ~]# ss state established

1PwgMD.png

上面通过 TCP 的状态进行过滤,支持的 TCP 协议中的状态有:

1
2
3
4
5
6
7
8
9
10
11
established
syn-sent
syn-recv
fin-wait-1
fin-wait-2
time-wait
closed
close-wait
last-ack
listening
closing

12.显示所有源端口或目的端口为 ssh 的套接字(注意空格)

1
[root@node4 ~]# ss -at '( dport = :ssh or sport = :ssh )'

1Pw2se.png

13.显示目的端口是53或61769的套接字

1
[root@node4 ~]# ss -ant '( dst :53 or dst :61769 )'

14.同时对目的地址和端口过滤

1
[root@node4 ~]# ss -nt dst 192.168.141.1:61769

15.仅过滤目的端口

1
[root@node4 ~]# ss -nt dport = :61769

除了等于,也可以设置大于小于关系

1
2
[root@node4 ~]# ss -nt dport \< :100    
[root@node4 ~]# ss -nt dport \> :100

16.显示所有已建立的ssh连接

1
[root@node4 ~]# ss -o state established '( dport = :ssh or sport = :ssh )'

1PwoJP.png

欢迎打赏,谢谢
------ 本文结束------
0%