ss命令

ss命令 #

ss命令(socket statistics)用于显示套接字统计信息。它是netstat命令的现代替代品,提供了更多信息和更好的性能。ss命令可以显示比其他工具更多的TCP和状态信息。

语法 #

ss [选项] [过滤器]

常用选项 #

选项 描述
-a, --all 显示所有套接字(包括监听和非监听的)
-l, --listening 只显示监听套接字
-t, --tcp 显示TCP套接字
-u, --udp 显示UDP套接字
-x, --unix 显示Unix域套接字
-n, --numeric 不解析服务名称
-p, --processes 显示使用套接字的进程
-i, --info 显示内部TCP信息
-e, --extended 显示详细的套接字信息
-m, --memory 显示套接字内存使用情况
-o, --options 显示定时器信息
-s, --summary 显示套接字使用概要
-4, --ipv4 只显示IPv4套接字
-6, --ipv6 只显示IPv6套接字
-0, --packet 显示PACKET套接字
-r, --resolve 解析主机名
-h, --help 显示帮助信息
-V, --version 显示版本信息

过滤器语法 #

ss命令支持强大的过滤器语法,可以根据各种条件过滤套接字:

ss [选项] [ state 状态 ] [ EXPRESSION ]

其中,EXPRESSION的语法为:

dport = :443
sport = :http
src = 192.168.1.1
dst = 192.168.1.1:443

常见用法 #

1. 显示所有套接字 #

ss

2. 显示所有TCP套接字 #

ss -t

3. 显示所有UDP套接字 #

ss -u

4. 显示所有监听套接字 #

ss -l

5. 显示所有监听的TCP套接字 #

ss -lt

6. 显示所有监听的UDP套接字 #

ss -lu

7. 显示所有已建立的TCP连接 #

ss -t state established

8. 显示所有处于TIME-WAIT状态的TCP连接 #

ss -t state time-wait

9. 显示进程信息 #

sudo ss -p

10. 显示详细的套接字信息 #

ss -e

11. 显示内存使用情况 #

ss -m

12. 显示定时器信息 #

ss -o

13. 显示套接字统计信息 #

ss -s

14. 不解析服务名称 #

ss -n

15. 显示IPv4套接字 #

ss -4

16. 显示IPv6套接字 #

ss -6

17. 显示Unix域套接字 #

ss -x

过滤示例 #

1. 显示特定端口的连接 #

ss -t src :80
ss -t dst :80

2. 显示特定IP地址的连接 #

ss -t src 192.168.1.1
ss -t dst 192.168.1.1

3. 显示特定IP和端口的连接 #

ss -t src 192.168.1.1:80
ss -t dst 192.168.1.1:80

4. 使用多个过滤条件 #

ss -t src 192.168.1.1 dst 192.168.1.2

5. 使用比较操作符 #

# 显示源端口大于1024的连接
ss -t sport \> :1024

# 显示目标端口小于1024的连接
ss -t dport \< :1024

# 显示源端口在1024到65535之间的连接
ss -t sport \> :1024 sport \< :65535

6. 使用状态过滤 #

# 显示已建立的连接
ss -t state established

# 显示多个状态的连接
ss -t state established,time-wait

# 显示除已建立外的所有连接
ss -t state all exclude established

与netstat的对比 #

ss命令是netstat命令的现代替代品,提供了更多信息和更好的性能。以下是一些常见的netstat命令及其ss命令的等效形式:

netstat命令 ss命令 描述
netstat -a ss 显示所有套接字
netstat -at ss -t 显示所有TCP套接字
netstat -au ss -u 显示所有UDP套接字
netstat -l ss -l 显示所有监听套接字
netstat -lt ss -lt 显示所有监听的TCP套接字
netstat -lu ss -lu 显示所有监听的UDP套接字
netstat -p ss -p 显示进程信息
netstat -n ss -n 不解析服务名称
netstat -s ss -s 显示统计信息
netstat -r ip route 显示路由表

实用示例 #

1. 查找监听特定端口的进程 #

sudo ss -tlnp | grep ":80"

2. 统计各种连接状态的数量 #

ss -tan state all | awk '{print $1}' | sort | uniq -c

3. 查看连接到特定IP地址的连接 #

ss -t dst 192.168.1.1

4. 查看网络接口的错误统计 #

ss -s

5. 监控实时连接数 #

watch -n 1 "ss -t | wc -l"

6. 查看特定进程的网络连接 #

sudo ss -p | grep nginx

7. 检查是否有异常的TIME_WAIT或CLOSE_WAIT连接 #

ss -t state time-wait | wc -l
ss -t state close-wait | wc -l

8. 查看网络流量统计 #

ss -s

9. 查看所有已建立的SSH连接 #

ss -o state established '( dport = :ssh or sport = :ssh )'

10. 查看所有HTTP和HTTPS连接 #

ss -o state established '( dport = :http or sport = :http or dport = :https or sport = :https )'

套接字状态 #

TCP套接字可以处于以下状态:

状态 描述
ESTABLISHED 连接已建立
SYN-SENT 已发送连接请求,等待确认
SYN-RECV 已收到连接请求,等待确认
FIN-WAIT-1 等待远程TCP关闭连接或发送FIN
FIN-WAIT-2 等待远程TCP关闭连接
TIME-WAIT 等待足够的时间以确保远程TCP收到连接关闭确认
CLOSED 连接已关闭,不在表中
CLOSE-WAIT 等待本地用户关闭连接
LAST-ACK 等待远程TCP确认连接关闭请求
LISTEN 监听连接请求
CLOSING 等待远程TCP确认连接关闭
UNKNOWN 未知状态

提示 #

  • 使用-n选项可以加快ss的执行速度,特别是在DNS解析缓慢的情况下
  • 使用-p选项需要root权限才能查看所有进程信息
  • 结合grep命令可以过滤特定的连接或状态
  • 使用watch命令可以实时监控连接状态的变化
  • 在脚本中,通常使用-n选项以便于解析输出
  • 使用-s选项可以查看详细的网络统计信息,这对于诊断网络问题很有用
  • 使用状态过滤器可以快速找到特定状态的连接
  • 使用-o选项可以查看定时器信息,这对于诊断连接问题很有用
  • 使用-e选项可以查看详细的套接字信息,包括拥塞窗口、接收窗口等
  • 使用-m选项可以查看套接字的内存使用情况