ss
命令作为 iproute2
软件包的一部分,是Socket Statistics的缩写,也称为IPC(Inter-process Communication)套接字统计
ss命令用于显示sockets(套接字)的状态。与netstat类似,但它通常提供更详细的统计信息和更快的性能。但ss更高效因为它直接利用了内核的TCP连接跟踪状态信息(通过tcp_diag)模块,并且提供了更丰富和详细的网络连接状态视图。ss
命令的输出可以与 grep
, awk
, sort
等命令结合使用,进行更复杂的数据处理和过滤。
ss:基本语法
ss [选项] [过滤器]
常见命令选项
用法:ss [OPTIONS]
ss [选项] [过滤器]
-h、 --帮助此消息
-V、 --版本输出版本信息
-n、或--numeric
: --数字不解析服务名称,(不进行 DNS 解析,直接显示 IP 地址和端口号。)
-r、或--resolve
: --解析主机名。尝试解析 IP 地址到主机名和端口号到服务名。
-a、 --所有显示所有插座
-l、 --监听显示监听插座
-o、 或--options
: 显示计时器和套接字选项。
-e、--extended
: --扩展显示详细的套接字信息 ,(显示更多详细信息,如套接字的标记、队列长度等。)
-m、 --内存显示套接字内存使用情况
-p、 或--processes
: --进程显示使用套接字的进程。(显示与套接字关联的进程 ID 和名称。)
-i、 --info显示内部TCP信息
-s、 --summary显示套接字使用情况摘要
-b、 --bpf显示bpf筛选器套接字信息
-E、 --事件在套接字被破坏时不断显示套接字
-Z、 --上下文显示进程SELinux安全上下文
-z、 --上下文显示进程和套接字SELinux安全上下文
-N、 --net切换到指定的网络命名空间名称
-4, --ipv4仅显示IP版本4套接字
-6, --ipv6仅显示IP版本6套接字
-0, --数据包显示packet套接字
-t、 --tcp仅显示tcp套接字
-S、 --sctp仅显示sctp套接字
-u、 --udp仅显示udp套接字
-d、 --dccp仅显示dccp套接字
-w、 --仅原始显示raw套接字
-x、 --unix仅显示unix域套接字
--vsock 仅显示vsock套接字
-f、 --family=family类型的family显示插座
系列:={inet|inet6|link|unix|netlink|vsock|help}
-K、 --kill强制关闭套接字,显示关闭的内容
-H、 --无标题取消标题行
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|
-D、 --diag=FILE将有关TCP套接字的原始信息转储到FILE
-F、 --filter=FILE从FILE读取筛选器信息
FILTER:=[state state-FILTER][EXPRESSION]
STATE-FILTER:={all|connected|synchronized|bucket|big|TCP-STATES}
TCP-STATES:={已建立|已发送同步|已同步recv|fin-wait-{1,2}|时间等待|关闭|关闭等待|最后一次确认|侦听|关闭}
connected:={已建立|同步发送|同步recv | fin wait-{1,2}|时间等待|关闭等待|最后一次确认|关闭}
synchronized:={已建立|syn-recv|fin-wait-{1,2}|时间等待|关闭等待|最后一次确认|关闭}
bucket:={syn-recv | time wait}
big:={已建立|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closed}
显示所有套接字
ss
或 ss -a
:显示所有类型的套接字,包括监听(Listening)和非监听状态的。
ss -a
仅显示监听套接字
ss -l
:列出所有监听状态的套接字。
ss -l
TCP 和 UDP 连接
ss -t
:显示所有 TCP 连接。
ss -u
:显示所有 UDP 连接。
ss -t
ss -u
结合选项
ss -at
:显示所有 TCP 连接(包括监听和非监听)。
ss -au
:显示所有 UDP 连接。
ss -at
ss -au
过滤与排序
- 可以通过
-f
或--filter
加上表达式来过滤输出,比如state established
只显示已建立的连接。 - 使用
-o
后可以加上列名对输出进行排序,例如,-o state
按照状态排序。
要查看所有正在监听的 TCP 连接
ss -lt
要查看所有 TCP 连接,并解析主机名和端口号
ss -ane
要查看所有连接,并显示进程信息
ss -ap
输出排序与限制
- 排序:使用
-o
或--sort
选项可以对输出进行排序,例如按接收或发送的数据量排序。 - 限制输出数量:使用
-n
(与-t
,-u
,-x
等结合) 限制输出的条目数,如ss -nt 10
只显示前10个TCP连接。
目标筛选
- 指定目标IP或端口:通过
dst
或sport
、dport
参数筛选特定目标或端口的连接,例如ss dst 192.168.1.1
或ss sport = :80
。
统计与分析
- 统计信息:
-s
或--summary
提供了关于各种协议(TCP, UDP, RAW, UNIX等)的统计信息,包括连接数、接收/发送字节数等。 - 计时器信息:使用
-o
选项可以显示每个套接字的计时器信息,这有助于分析网络延迟问题。
高级应用
- 与其它命令结合:
ss
的输出可以方便地与grep
,awk
,sed
,sort
等命令结合使用,进行更复杂的过滤和数据分析。 - 实时监控:配合
watch
命令,如watch -n 1 'ss -ant'
,可以实时查看网络连接的变化情况,其中-n 1
表示每秒更新一次。
替代传统命令
ss
命令因其高效性和详细信息,常被推荐作为netstat
,ifconfig
,route
等传统网络管理命令的替代品。它不仅提供更详尽的TCP连接状态,还支持现代协议如DCCP和SCTP。
连接状态筛选
状态筛选:你可以根据连接的状态来筛选输出。例如,ss state ESTABLISHED
会显示所有已建立的连接。
ss state established
常见的状态包括:SYN-SENT
, SYN-RECV
, ESTABLISHED
, FIN-WAIT-1
, FIN-WAIT-2
, TIME-WAIT
, CLOSED
, CLOSE-WAIT
, LAST-ACK
, LISTEN
, CLOSING
。
-
CLOSED:
- 这是TCP连接的初始状态,表示没有连接活动。
-
LISTEN:
- 服务器端socket处于此状态,表示它正在监听来自客户端的连接请求。
-
SYN_SENT:
- 客户端发起连接请求,发送SYN报文后进入此状态,等待服务器响应。
-
SYN_RECEIVED:
- 服务器接收到客户端的SYN报文后,会以SYN+ACK响应,并进入此状态,等待客户端的确认。
-
ESTABLISHED:
- 客户端收到服务器的SYN+ACK后,回复ACK,连接建立成功,双方进入此状态,开始数据传输。
-
FIN_WAIT_1:
- 连接终止的第一步,主动关闭方发送FIN报文后进入此状态,等待对方的FIN报文或ACK。
-
FIN_WAIT_2:
- 主动关闭方收到对方对FIN的ACK后,进入此状态,等待对方的FIN报文。
-
CLOSE_WAIT:
- 被动关闭方收到FIN后,回应ACK并进入此状态,此时连接还未完全关闭,等待应用程序关闭连接。
-
CLOSING:
- 双方几乎同时尝试关闭连接,即双方都发送了FIN且至少一端收到了ACK,但还没收到对方的FIN。
-
LAST_ACK:
- 被动关闭方在发送完自己的FIN后,等待最后一个ACK到来的状态。
-
TIME_WAIT:
- 主动关闭方在接收到对方的FIN并发送ACK后进入此状态,等待足够长的时间以确保所有分组在网络中消失,防止延迟的数据包引起混淆。
-
CLOSED:
- 连接彻底关闭,回到初始状态。
这些状态反映了TCP连接建立(三次握手)和拆除(四次挥手)的整个过程,以及连接期间可能出现的其他情况,如一方请求关闭连接而另一方继续处理数据等。
连接状态筛选案例
1. 查看所有已建立的连接(ESTABLISHED)
1ss state established
这个命令会显示所有TCP连接中状态为“ESTABLISHED”的连接,即数据传输正在进行中的连接。
2. 查看监听状态的套接字(LISTEN)
1ss state listening
此命令会列出所有正在监听并等待连接请求的套接字,这对于了解哪些服务正在运行并监听端口非常有用。
3. 查找处于SYN_SENT状态的连接
1ss state syn-sent
此命令显示那些已发送SYN包但尚未收到SYN+ACK确认的连接,这可能意味着连接建立过程中出现了延迟或问题。
4. 查看TIME_WAIT状态的连接
1ss state time-wait
TIME_WAIT状态表示连接已经关闭,但是为了确保所有数据包都被正确接收,套接字在一段时间内保持打开。过多的TIME_WAIT状态可能表明之前有很多连接被快速打开和关闭。
5. 查找CLOSE_WAIT状态的连接
1ss state close-wait
CLOSE_WAIT状态意味着本地端已经接收到对方的关闭连接请求,但还没有完成关闭操作。长时间处于此状态可能意味着程序未正确关闭连接。
6. 显示所有状态的连接,包括不常见状态
1ss state all
此命令将显示所有状态的网络连接,包括但不限于上述提到的状态,有助于全面了解系统的网络连接状况。
7. 结合其他条件进行筛选
例如,查找特定IP的ESTABLISHED连接:
1ss state established dst 10.0.0.1
这会显示所有与IP地址10.0.0.1之间已建立的TCP连接。