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 |
2)ss
1 | [root@node4 ~]# time ss -a |
可以看到,一个是秒级的,一个是毫秒级的。在敲下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 | -h, --help 帮助 |
所有参数
1 | 如果没有指定任何参数,则ss列出所有已经建立、并不处在listen的TCP 套接字。 |
实例解析
1.查看进每个程具体打开的socket
1 | [root@node4 ~]# ss -pl |
2.找出打开某套接字或某端口的应用程序
1 | [root@node4 ~]# ss -pl | grep 622 |
3.显示所有的连接(按回车换行,按空格翻页,按ctrl+z退出)
1 | [root@node4 ~]# ss | less |
4.把TCP连接过滤出来
1 | [root@node4 ~]# ss -at |
5.把UDP连接过滤出来
1 | [root@node4 ~]# ss -au |
6.不解析主机名
为了加快输出的速度,用”n”选项防止ss 解析IP地址到主机名。不过这同样阻止了对端口名的解析。
1 | [root@node4 ~]# ss -ant |
7.只显示监听的套接字(参数l)
1 | [root@node4 ~]# ss -lnt |
和之前的netstat一样,用参数l的时候不要用参数a,才能只显示监听状态的连接
8.打印进程名和进程号(p参数)
1 | [root@node4 ~]# ss -ltp |
9.打印统计概要
1 | [root@node4 ~]# ss -s |
10.仅显示IPv4 或 IPv6 连接
1 | [root@node4 ~]# ss -tl4 |
- 列出处在 time-wait 状态的套接字,下图这里一个也没有。
1 | [root@node4 ~]# ss state time-wait |
那我们换个状态列出处在established状态的套接字
1 | [root@node4 ~]# ss state established |
上面通过 TCP 的状态进行过滤,支持的 TCP 协议中的状态有:
1 | established |
12.显示所有源端口或目的端口为 ssh 的套接字(注意空格)
1 | [root@node4 ~]# ss -at '( dport = :ssh or sport = :ssh )' |
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 | [root@node4 ~]# ss -nt dport \< :100 |
16.显示所有已建立的ssh连接
1 | [root@node4 ~]# ss -o state established '( dport = :ssh or sport = :ssh )' |