重学ss命令

简介

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,目前支持unixinetinet6linknetlinkvsock
  • -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: 状态过滤器,根据stateexclude关键字,后面跟状态标识符来过滤 (不仅仅是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: 除了LISTENINGCLOSED之外的所有状态
  • synchronized: 在connected的基础上再排除SYN-SENT,也就是说除了LISTENING、CLOSED、SYN-SENT的所有状态
  • bucket: 包含TIME-WAITSYN-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 评论

留下您的评论.