netstat 命令可以用来查询整个系统的网络状态. 百度百科的定义如下:
Netstat 的定义是: Netstat 是在内核中访问网络连接状态及其相关信息的程序, 它能提供 TCP 连接, TCP 和 UDP 监听, 进程内存管理的相关报告.
Netstat 是控制台命令, 是一个监控 TCP/IP 网络的非常有用的工具, 它可以显示路由表, 实际的网络 https://baike.baidu.com/item/网络 连接以及每一个网络接口设备的状态信息. Netstat 用于显示与 IP, https://baike.baidu.com/item/TCP , https://baike.baidu.com/item/UDP 和 https://baike.baidu.com/item/ICMP 协议相关的统计数据, 一般用于检验本机各端口的网络连接情况.
从上面的百科介绍我们可以看出, netstat 命令在查询网络问题的时候十分有用. 下面就来详细介绍下 netstat 的用法.
使用语法
netstat [-acCeFghilMnNoprstuvVwx][-A < 网络类型>][--ip]
参数说明
-a 或 --all 显示所有连线中的 Socket.
-A < 网络类型>或 --<网络类型> 列出该网络类型连线中的相关地址.
-c 或 --continuous 持续列出网络状态.
-C 或 --cache 显示路由器配置的快取信息.
-e 或 --extend 显示网络其他相关信息.
-F 或 --fib 显示 FIB.
-g 或 --groups 显示多重广播功能群组组员名单.
-h 或 --help 在线帮助.
-i 或 --interfaces 显示网络界面信息表单.
-l 或 --listening 显示监控中的服务器的 Socket.
-M 或 --masquerade 显示伪装的网络连线.
-n 或 --numeric 直接使用 IP 地址, 而不通过域名服务器.
-N 或 --netlink 或 --symbolic 显示网络硬件外围设备的符号连接名称.
-o 或 --timers 显示计时器.
-p 或 --programs 显示正在使用 Socket 的程序识别码和程序名称.
-r 或 --route 显示 Routing Table.
-s 或 --statistice 显示网络工作信息统计表.
-t 或 --tcp 显示 TCP 传输协议的连线状况.
-u 或 --udp 显示 UDP 传输协议的连线状况.
-v 或 --verbose 显示指令执行过程.
-V 或 --version 显示版本信息.
-w 或 --raw 显示 RAW 传输协议的连线状况.
-x 或 --unix 此参数的效果和指定 "-A unix" 参数相同.
--ip 或 --.NET 此参数的效果和指定 "-A inet" 参数相同.
使用实例
- [root@SHA-L0161171 arthas]$ 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:8004 0.0.0.0:* LISTEN
- tcp 0 0 0.0.0.0:11052 0.0.0.0:* LISTEN
- tcp 0 0 172.24.248.108:8004 192.168.202.31:57588 ESTABLISHED
- tcp 0 0 127.0.0.1:51092 127.0.0.1:8091 TIME_WAIT
- tcp 0 0 172.24.248.108:8004 192.168.202.38:32283 ESTABLISHED
- tcp 0 0 172.24.248.108:8004 192.168.202.38:58923 TIME_WAIT
- tcp 0 0 172.24.248.108:8004 192.168.202.32:39983 ESTABLISHED
- tcp 0 0 172.24.248.108:8004 192.168.202.37:38230 ESTABLISHED
- tcp 0 0 172.24.248.108:8004 192.168.202.34:5081 ESTABLISHED
- tcp 0 0 172.24.248.108:8004 192.168.202.32:17240 ESTABLISHED
- tcp 0 0 127.0.0.1:38784 127.0.0.1:12050 TIME_WAIT
- ...
- Active UNIX domain sockets (w/o servers)
- Proto RefCnt Flags Type State I-Node Path
- unix 3 [ ] DGRAM 18442 /run/systemd/notify
- unix 2 [ ] DGRAM 18444 /run/systemd/cgroups-agent
- unix 2 [ ] DGRAM 23822 /var/run/chrony/chronyd.sock
- unix 8 [ ] DGRAM 18455 /run/systemd/journal/socket
- unix 18 [ ] DGRAM 18457 /dev/log
- unix 2 [ ] DGRAM 14151 /var/run/nscd/socket
- unix 2 [ ] DGRAM 584 /run/systemd/shutdownd
- unix 3 [ ] STREAM CONNECTED 124439388 /run/dbus/system_bus_socket
- unix 3 [ ] STREAM CONNECTED 42312 /run/systemd/journal/stdout
- unix 3 [ ] STREAM CONNECTED 39909
上面的输出包含两个部分:
1,Active Internet connections 有源 TCP 连接, 其中 "Recv-Q" 和 "Send-Q" 指接收队列和发送队列. 这些数字一般都应该是 0. 如果不是则表示软件包正在队列中堆积. 这种情况只能在非常少的情况见到.
2,Active UNIX domain sockets 有源 Unix 域套接口(和网络套接字一样, 但是只能用于本机通信, 性能可以提高一倍).
对于 Internet connections 部分输出参数, 做下重点介绍
Proto: 表示连接使用的协议, 常见的有 tcp,udp 和 tcp6 等;
Recv-Q: 指接收队列, 这个数字一般都应该是 0, 如果不是则表示数据包正在队列中堆积. 拿 Tomcat 服务器举个列子: 当 Tcp 连接建立后, Tomcat 服务器中会有一个 accepter 线程取出这个连接让 worker 线程处理, 现在假如连接建立的速度远远大于 accepter 线程取连接的速度, 那么连接就在队列中堆积, 此时 Recv-Q 就会大于 0; 还有一种可能就是系统遭遇到了 Dos 攻击, 已经不能再响应外部请求;
Send-Q: 发送队列, 对方没有收到的数据或者说没有 Ack 的, 还是本地缓冲区, 如果发送队列 Send-Q 不能很快的清零, 可能是有应用向外发送数据包过快, 或者是对方接收数据包不够快;
Local Address: 表示本地地址, 这个字段一般有三种形式的值:
172.24.248.108:8004 : 这种形式的值是最常见的值, 表示本机有个 ip 地址是 172.24.248.108, 有个程序正在使用本机的 8004 端口和外部程序建立连接;
0.0.0.0:8004 : 这种形式的值看起来比较奇怪, 其实其中的 0.0.0.0 表示的是所有能表示本机的 ip 地址. 我们知道机器是可以配置多块网卡的, 比如现在我们的机器配置了两个网卡, 其中一块配置的地址是 172.24.248.108, 另外一块配置的地址是 172.24.248.109, 那么这边的 0.0.0.0 就是表示 172.24.248.108,172.24.248.109 和 127.0.0.1 这三个 IP.
:::8004 : 其中的:: 表示全 0 的 IP 地址, 比如:::* 表示全 0 的 IPv6 地址,* 表示任意的端口号, 全 0 的含义和 0.0.0.0 的含义相同.
Foreign Address: 和本机通信的外部 IP 地址, 显示规则和 Local Address 类似, 不再赘述了;
State: 表示连接状态, 常见的连接状态如下:
LISTEN : 首先服务端需要打开一个 socket 进行监听, 状态为 LISTEN./The socket is listening for incoming connections. 侦听来自远方 TCP 端口的连接请求 /
SYN_SENT: 客户端通过应用程序调用 connect 进行 activeopen. 于是客户端 tcp 发送一个 SYN 以请求建立一个连接. 之后状态 SYN_SENT./The socket is actively attempting to establish aconnection. 在发送连接请求后等待匹配的连接请求 /
SYN_RECV: 服务端应发出 ACK 确认客户端的 SYN, 同时自己向客户端发送一个 SYN. 之后状态置为 SYN_RECV/* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 /
ESTABLISHED: 代表一个打开的连接, 双方可以进行或已经在数据交互了./ The socket has an established connection. 代表一个打开的连接, 数据可以传送给用户 /
FIN_WAIT1: 主动关闭 (activeclose) 端应用程序调用 close, 于是其 TCP 发出 FIN 请求主动关闭连接, 之后进入 FIN_WAIT1 状态./ The socket is closed, and the connection is shutting down. 等待远程 TCP 的连接中断请求, 或先前的连接中断请求的确认 /
CLOSE_WAIT: 被动关闭 (passiveclose) 端 TCP 接到 FIN 后, 就发出 ACK 以回应 FIN 请求(它的接收也作为文件结束符传递给上层应用程序), 并进入 CLOSE_WAIT./ The remote end has shut down, waiting for the socketto close. 等待从本地用户发来的连接中断请求 /
FIN_WAIT2: 主动关闭端接到 ACK 后, 就进入了 FIN-WAIT-2./ Connection is closed, and the socket is waiting for a shutdownfrom the remote end. 从远程 TCP 等待连接中断请求 /
LAST_ACK: 被动关闭端一段时间后, 接收到文件结束符的应用程 序将调用 CLOSE 关闭连接. 这导致它的 TCP 也发送一个 FIN, 等待对方的 ACK. 就进入了 LAST-ACK./ The remote end has shut down, and the socket is closed. Waiting foracknowledgement. 等待原来发向远程 TCP 的连接中断请求的确认 /
TIME_WAIT: 在主动关闭端接收到 FIN 后, TCP 就发送 ACK 包, 并进入 TIME-WAIT 状态./ Thesocket is waiting after close to handle packets still in the network. 等待足够的时间以确保远程 TCP 接收到连接中断请求的确认 /
CLOSING: 比较少见./ Bothsockets are shut down but we still don't have all our datasent. 等待远程 TCP 对连接中断的确认 /
CLOSED: 被动关闭端在接受到 ACK 包后, 就进入了 closed 的状态. 连接结束./The socket is not being used. 没有任何连接状态 /
UNKNOWN: 未知的 Socket 状态./ Thestate of the socket is unknown. */
备注
SYN: (同步序列编号, SynchronizeSequence Numbers)该标志仅在三次握手建立 TCP 连接时有效. 表示一个新的 TCP 连接请求.
ACK: (确认编号, AcknowledgementNumber)是对 TCP 请求的确认标志, 同时提示对端系统已经成功接收所有数据.
FIN: (结束标志, Finish)用来结束一个 TCP 回话. 但对应端口仍处于开放状态, 准备接收后续数据.
常用 netstat 命令
1. 列出所有信息
- netstat -a
- # 其中 n 表示使用 IP 地址表示机器信息, 而不是使用域名
- netstat -an
这个命令配合 grep 最常使用.
2. 只显示监听端口
netstat -l
3. 显示 PID 和进程名称
netstat -anp
4. 持续输出状态信息
netstat -anpc
5. 查看连接某服务端口最多的的 IP 地址(前 20 个)
netstat -nat | grep "xx.xx.xx.xx:port" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
输出
- 4 192.168.202.38
- 4 192.168.202.37
- 4 192.168.202.36
- 4 192.168.202.35
- 3 192.168.202.34
- 3 192.168.202.33
- 3 192.168.202.32
- 2 192.168.202.31
参考
- https://blog.csdn.net/dongl890426/article/details/86981901
- https://blog.csdn.net/qq_42014600/article/details/90372315
- https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html
来源: https://www.cnblogs.com/54chensongxia/p/12144520.html