netstat
语法
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
在Linux下,如果连接数比较大,可以使用效率更高的ss来替代netstat。
1 | usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help} |
输出结果
1 | [root@instance-gctg007a ~]# netstat |
有源TCP连接
Active Internet connections,称为有源TCP连接,其中”Recv-Q”和”Send-Q”指的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
有源Unix域套接口
Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
参数说明
- Proto显示连接使用的协议
- RefCnt表示连接到本套接口上的进程号
- Types显示套接口的类型
- State显示套接口当前的状态
- Path表示连接到套接口的其它进程使用的路径名
状态说明
CLOSED | 初始(无连接)状态 |
---|---|
LISTEN | 侦听状态,等待远程机器的连接请求 |
SYN_SEND | 在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包 |
SYN_RECV | 在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态 |
ESTABLISHED | 完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信 |
FIN_WAIT_1 | 在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态 |
FIN_WAIT_2 | 在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态 |
TIME_WAIT | 在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包 |
CLOSING | 在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态 |
CLOSE_WAIT | 在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态 |
LAST_ACK | 在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包 |
主动连接端可能的状态有 | CLOSED SYN_SEND ESTABLISHED |
---|---|
主动关闭端可能的状态有 | FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT |
被动连接端可能的状态有 | LISTEN SYN_RECV ESTABLISHED |
被动关闭端可能的状态有 | CLOSE_WAIT LAST_ACK CLOSED |

常用命令
显示网卡列表
1 | [root@instance-gctg007a ~]# netstat -i |
显示组播信息
1 | [root@instance-gctg007a ~]# netstat -g |
显示网络统计
1 | [root@instance-gctg007a ~]# netstat -s | more 4 |
常用组合
1 | [root@instance-gctg007a ~]# netstat -lntup |
显示关于以太网的统计数据
用于显示关于以太网的统计数据。它列出的项目包括传送的数据报的总字节数、错误数、删除数、数据报的数量和广播的数量。这些统计数据既有发送的数据报数量,也有接收的数据报数量。这个选项可以用来统计一些基本的网络流量)
1 | [root@instance-gctg007a ~]# netstat -e |
显示路由信息
1 | [root@instance-gctg007a ~]# netstat -r |
统计机器中网络连接各个状态个数
1 | [root@instance-gctg007a ~]# netstat -an | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]} ' |
查看连接某服务端口最多的的IP地址
1 | [root@instance-gctg007a ~]# netstat -ant|grep "127.*"|awk '{print $5}'|awk -F: '{print $1}'|sort -nr|uniq -c |
找出程序运行的端口
1 | [root@instance-gctg007a ~]# netstat -ap | grep ssh |
在 netstat 输出中显示 TCP连接信息
1 | [root@instance-gctg007a ~]# netstat -pt |
ss
语法
ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容,ss可以提供以下信息:
- 所有的TCP sockets
- 所有的UDP sockets
- 所有ssh/ftp/ttp/https持久连接
- 所有连接到Xserver的本地进程
- 使用state(例如:connected, synchronized, SYN-RECV, SYN-SENT,TIME-WAIT)、地址、端口过滤
- 所有的state FIN-WAIT-1 tcpsocket连接以及更多
ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。原因如下:
- 当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。当服务器维持的连接达到上万个的时候,使用netstat等于浪费 生命,而用ss才是节省时间。
- 而ss快的秘诀在于它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux内核中第一手的信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得稍慢(但仍然比 netstat要快)。
1 | Usage: ss [ OPTIONS ] |
常用命令
1 | ss -l 显示本地打开的所有端口 |