简介
ss
(Socket Statistics)是一个查询套接字的工具,它可以显示出类似于netstat
的信息。
和其它工具相比,ss
能显示出更多的信息。并且比netstat
更加灵活,同样的查询,可能netstat
需要写挺长的awk
外加好几层管道做过滤,ss
很多情况下可以不使用那么复杂的管道,直接通过参数就能得到我们想要的结果。
关于什么是套接字,可以看萌新之前的一篇文章。
常用参数
- -h, –help: 显示帮助信息
- -V, –version: 显示版本信息
- -H, –no-header: 不显示Header那一栏
- -n, –numeric: 不尝试解析服务名称,例如22不会显示成ssh
- -r, –resolve: 尝试解析ip地址与端口,例如尝试将ss解析成ssh,ip地址解析成主机名
- -a, –all: 显示监听与非监听的套接字
- -l, –listening: 仅显示监听的套接字(默认情况下是忽略这些套接字的)
- -o, –options: 显示计时器信息
- -e, –extended: 显示详细的套接字信息
- -m, –memory: 显示套接字的内存使用情况
- -p, –processes: 显示使用套接字的进程
- -i, –info: 显示内部的TCP信息
- -s, –summary: 显示摘要统计信息(当套接字数量比较多的时候,解析
/proc/net/tcp
会很慢), 显示摘要会比较快 - -N NSNAME, --net=NSNAME: 切换到指定的命名空间(docker就是用命名空间做的资源隔离)
- -4, –ipv4: 仅显示ipv4的套接字(也可以使用
-f inet
) - -6, –ipv6: 仅显示ipv6的套接字(也可以使用
-f inet6
) - -t, –tcp: 仅显示tcp套接字
- -u, –udp: 仅显示udp套接字
- -d, --dccp: 显示dccp套接字
- -w, --raw: 显示raw套接字
- -x, –unix: 显示unix套接字
- -S, –sctp: 显示sctp套接字(与tcp、udp类似,也是一种传输协议)
- –vsock: 显示vsock套接字(也可以使用
-f vsock
) - -f FAMILY, –family=FAMILY: 显示套接字类型,例:
-f inet
,目前支持unix
、inet
、inet6
、link
、netlink
、vsock
- -A QUERY, --query=QUERY, --socket=QUERY: 要显示的套接字列表,有(all,inet,tcp,udp,raw,unix,packet,netlink,unix_dgram,unix_stream,unix_seqpacket,packet_raw,packet_dgram,dccp,sctp,vsock_stream,vsock_dgram)
- START-FILTER: 状态过滤器,根据state和exclude关键字,后面跟状态标识符来过滤 (不仅仅是TCP接口,如果我们想用这个参数过滤TCP状态的话,需要自己加
-t
参数)
TCP接口状态
- ESTABLISHED: TCP三次握手成功,已经建立正常的连接,可以随时进行数据传输
- SYN-SENT: 主动打开,主动握手的一方发送第一次握手后的状态
- SYN-RECV: 被动握手的一方接收到第一次握手消息后的状态
- FIN-WAIT-1: 主动关闭的一方,发送第一次挥手消息(FIN)后的状态
- FIN-WAIT-2: 主动关闭的一方,接收到第二次挥手后的状态
- TIME-WAIT: 主动关闭的一方,发送完第四次挥手后的状态,需要等待2MSL时间后才能进入CLOSED状态(Centos上是60s,并且不能通过配置参数修改),TIME_WAIT只发生在主动关闭的一方。
- CLOSED: 套接字未被使用
- CLOSE-WAIT: 被动关闭的一方,发送第二次挥手的状态
- LAST-ACK: 被动关闭的一方,发送第三次挥手后的状态
- LISTENING: 套接字正在监听的状态,除非指定 -l或者 -a参数才能显示
- CLOSING: 两个套接字都已经关闭了,但是仍然还有数据没有发送完的状态
- UNKNOWN: 未知的套接字状态
还有几个不属于TCP接口的状态,ss
命令帮咱们封装了一下,可以用来代表多种TCP状态。
- all: 所有的状态(不仅仅是TCP协议,UDP等其它协议也包含在内)
- connected: 除了LISTENING和CLOSED之外的所有状态
- synchronized: 在connected的基础上再排除SYN-SENT,也就是说除了LISTENING、CLOSED、SYN-SENT的所有状态
- bucket: 包含TIME-WAIT和SYN-RECV状态
- big: 与bucket相反
常见例子
- 显示套接字摘要
ss -s
- 显示所有的tcp连接
ss -ta
- 显示所有udp套接字
ss -ua
- 显示所有处于监听状态的tcp端口,并且不解析服务名称
ss -lnt
- 显示所有处于监听状态的tcp端口,并尝试解析ip和端口(如果没有特殊需求,不建议使用
-r
参数,性能比较差)
ss -lrt
- 显示所有处于监听状态的tcp端口,并查询程序名称
ss -ltp
- 显示所有已建立的ssh连接
# 下面的三种写法是等价的,如果有括号需要用单引号或者转义符号转义
ss state established dport = :ssh or sport = :ssh
ss state established '( dport = :ssh or sport = :ssh )'
ss state established \( dport = :ssh or sport = :ssh \)
- 查询处于监听状态的tcp,并且source port为22或者80的
ss -ltn sport = :22 or sport = :80
- 查看我们的http(80)或者https(443)处于fin-wait-1状态下目标为192.168.7/24的所有连接,并查看他们的计时器
ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 192.168.7/24
- 列出所有连接到10.0.8.14:22的连接
ss -n src 10.0.8.14:22
- 统计TIME-WAIT状态的TCP数量
ss -tnH state time-wait|wc -l
- 查看connected状态的TCP连接(不包含listening和closed)
ss -tn state connected
- 显示除了listening状态之外的TCP连接
ss -tn exclude listening
ss与netstat的性能对比
经过多次对比,发现在使用-n
参数不解析ip与端口时,ss
稍微比netstat
快一点点
但是在不使用-n
参数时,netstat
默认会将ip解析为域名,将端口解析为服务名,ss
默认只会将端口解析为服务名
对比上面使用了-n
参数可以看到netstat
解析ip和端口时慢了几十倍,ss
更是慢了上百倍。所以没有解析域名的需求时尽量使用-n
参数。
本文链接:https://my.lmcjl.com/post/1100.html
展开阅读全文
4 评论