ss命令和netstat命令比较

目录

  1. netstat命令详解
    1. netstat –help
    2. 状态
    3. 示例
  2. ss命令详解
    1. ss –help
    2. 示例
  3. netstat和ss区别
    1. netstat和ss之间替换命令
      1. 命令替换
      2. 软件包替换

netstat命令详解

  • netstat命令:用于显示各种网络相关信息,如网络连接,路由表,接口状态,无效连接,组播成员等等。
  • netstat命令是net-tools软件包中的一员。

netstat

netstat –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
root@controller-1:~# netstat --help
usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -i | [-cWnNe] -M | -s }

-r, --route display routing table
-i, --interfaces display interface table
-g, --groups display multicast group memberships
-s, --statistics display networking statistics (like SNMP)
-M, --masquerade display masqueraded connections

-v, --verbose be verbose
-W, --wide don't truncate IP addresses
-n, --numeric don't resolve names
--numeric-hosts don't resolve host names
--numeric-ports don't resolve port names
--numeric-users don't resolve user names
-N, --symbolic resolve hardware names
-e, --extend display other/more information
-p, --programs display PID/Program name for sockets
-c, --continuous continuous listing

-l, --listening display listening server sockets
-a, --all, --listening display all sockets (default: connected)
-o, --timers display timers
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB

<Socket>={-t|--tcp} {-u|--udp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom
<AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)

状态

netstat中的各种状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CLOSED         初始(无连接)状态。
LISTEN 侦听状态,等待远程机器的连接请求。

SYN_SEND 在TCP三次握手期间,client发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV 在TCP三次握手期间,server收到SYN包后,进入SYN_RECV状态。
ESTABLISHED 完成TCP三次握手后,client进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。

FIN_WAIT_1 在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
CLOSE_WAIT 在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK 在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
FIN_WAIT_2 在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT 在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING 在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。


主动连接端可能的状态有: CLOSED SYN_SEND ESTABLISHED
主动关闭端可能的状态有: FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT
被动连接端可能的状态有: LISTEN SYN_RECV ESTABLISHED
被动关闭端可能的状态有: CLOSE_WAIT LAST_ACK CLOSED

在Linux下,如果连接数比较大,可以使用效率更高的ss来替代netstat。

示例

netstat -ltunp

1
2
3
4
5
6
7
8
9
10
11
12
root@controller-1:~# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:41055 0.0.0.0:* LISTEN 143994/beam.smp
tcp 0 0 2.3.2.52:6815 0.0.0.0:* LISTEN 12005/ceph-osd
tcp 0 0 2.3.3.54:4000 0.0.0.0:* LISTEN 1659249/httpd
tcp 0 0 2.3.3.54:9696 0.0.0.0:* LISTEN 1277924/python2.7
tcp 0 0 2.3.3.54:6080 0.0.0.0:* LISTEN 2740184/python
tcp 0 0 2.3.3.54:4001 0.0.0.0:* LISTEN 3016399/httpd
tcp 0 0 2.3.3.54:4002 0.0.0.0:* LISTEN 2925101/httpd
tcp 0 0 2.3.2.52:6789 0.0.0.0:* LISTEN 17296/ceph-mon
tcp 0 0 2.3.3.54:8774 0.0.0.0:* LISTEN 2896223/python

Proto:数据包的协议,分为UDP和TCP。
Recv-Q:表示收到的数据已经在本地接收缓存,但是还没有被进程取走的数据包数量。
Send-Q:对方没有收到的数据包或者没有Ack回复的,加上本地缓冲区的数据包数量。
Local Address:本地IP:端口。
Foregin Address:远程主机IP:端口。表远程主机使用IP,通过端口连接到本机。
State:连接状态。主要是已经建立连接(ESTABLISHED)和监听(LISTEN)两种状态。
PID/Program name:进程ID和进程命令。

netstat -an

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:41055 0.0.0.0:* LISTEN
tcp 0 0 2.3.2.52:6815 0.0.0.0:* LISTEN
tcp 0 0 2.3.3.54:4000 0.0.0.0:* LISTEN
tcp 0 0 2.3.3.54:9696 0.0.0.0:* LISTEN
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 67754 @cib_ro
unix 2 [ ACC ] STREAM LISTENING 62296 @quorum
unix 2 [ ACC ] STREAM LISTENING 69170 @crmd
unix 2 [ ] DGRAM 18705 /var/lib/haproxy/dev/log
unix 2 [ ACC ] STREAM LISTENING 82414 private/tlsmgr
unix 2 [ ACC ] STREAM LISTENING 63035 @lrmd
unix 2 [ ACC ] STREAM LISTENING 166781368 /run/httpd/wsgi.8.0.1.sock

Socket套接字的输出
Proto:协议,一般为unix。
RecCnt:连接到此Socket的进程数量。
Flags:连接标识。
Type:Socket访问类型。
State:连接状态。主要是已经建立连接(ESTABLISHED)和监听(LISTEN)两种状态。
I-Node:程序文件的i节点。
Path:Socket程序的路径,或者相关数据的输出路径。

ss命令详解

ss是Socket Statistics的缩写。

  • ss命令可以用来获取socket统计信息。它可以显示和netstat类似的内容。
  • ss命令是iproute2软件包中的一员。

ss –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
root@controller-1:~# ss --help
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
-h, --help this message
-V, --version output version information
-n, --numeric don't resolve service names
-r, --resolve resolve host names
-a, --all display all sockets
-l, --listening display listening sockets
-o, --options show timer information
-e, --extended show detailed socket information
-m, --memory show socket memory usage
-p, --processes show process using socket
-i, --info show internal TCP information
-s, --summary show socket usage summary
-b, --bpf show bpf filter socket information

-4, --ipv4 display only IP version 4 sockets
-6, --ipv6 display only IP version 6 sockets
-0, --packet display PACKET sockets
-t, --tcp display only TCP sockets
-u, --udp display only UDP sockets
-d, --dccp display only DCCP sockets
-w, --raw display only RAW sockets
-x, --unix display only Unix domain sockets
-f, --family=FAMILY display sockets of type FAMILY

-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-D, --diag=FILE Dump raw information about TCP sockets to FILE
-F, --filter=FILE read filter information from FILE
FILTER := [ state TCP-STATE ] [ EXPRESSION ]

示例

ss -s
查看当前服务器的网络连接数。

1
2
3
4
5
6
7
8
9
10
11
12
root@controller-1:~# ss -s
Total: 24160 (kernel 24511)
TCP: 12865 (estab 4719, closed 7888, orphaned 0, synrecv 0, timewait 2780/0), ports 0

Transport Total IP IPv6
* 24511 - -
RAW 0 0 0
UDP 48 17 31
TCP 4977 4971 6
INET 5025 4988 37
FRAG 0 0 0

ss -l
查看所有打开的网络端口。

1
2
3
4
5
6
7
8
root@controller-1:~# ss -l | more
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:-1582816811 0:0
nl UNCONN 0 0 rtnl:ntpd/16466 *
nl UNCONN 0 0 rtnl:dockerd/2249 *
nl UNCONN 0 0 rtnl:kernel *
nl UNCONN 0 0 rtnl:-728964520 0:0
nl UNCONN 0 0 rtnl:ovs-vswitchd/3996 0:0
1
2
3
4
5
ss -a    # 列出所有网络连接
ss -at # 查看TCP Socket
ss -au # 查看UDP Socket
ss -aw # 查看RAW Socket
ss -ax #查看UNIX Socket

netstat和ss区别

ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。
ss的优势在于它能够显示更多详细的有关TCP和连接状态的信息,而且比netstat更快更高效。原因如下:

  1. netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多。
  2. 当服务器的socket连接数量变得非常大时,无论使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。
  3. ss快速的秘诀是采用了TCP协议栈中的tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手信息,这就确保了ss的快捷高效。

netstat和ss之间替换命令

命令替换
原命令 新命令 作用
netstat -a ss 网络连接
netstat -r ip route 路由表
netstat -i ip -s link 统计接口
netstat -M ss 伪连接
netstat -g ip maddr 组播成员
软件包替换
net-tools(淘汰) iproute2 用途
ifconfig ip addr,ip link 地址和链路配置
route ip route 路由表
arp ip neigh arp表
vconfig ip link VLAN
iptunnel ip tunnel 隧道
ipmaddr ip maddr 组播
netstat ss 统计