netstat命令详解
netstat命令详解
Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态(Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等。
netstat -s
命令,与/proc/net/netstat
文件中内容应该是一致的,但是/proc/net/netstat
文件的可读性较差,需要格式化才能显示。
命令格式: netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
option:
- -a或--all 显示所有连线中的Socket。
- -A或-- 列出该网络类型连线中的相关地址。
- -c或--continuous 持续列出网络状态。
- -C或--cache 显示路由器配置的快取信息。
- -e或--extend 显示网络其他相关信息。
- -F或--fib 显示路由缓存。
- -g或--groups 显示多重广播功能群组组员名单。
- -h或--help 在线帮助。
- -i或--interfaces 显示网络界面信息表单。
- -l或--listening 显示监控中的服务器的Socket。
- -M或--masquerade 显示伪装的网络连线。
- -n或--numeric 显示数字形式地址而不是去解析主机、端口或用户名。
- -N或--netlink或--symbolic 显示网络硬件外围设备的符号连接名称。
- -o或--timers 显示计时器。
- -p或--programs 显示正在使用Socket的程序识别码和程序名称。
- -r或--route 显示Routing Table。
- -s或--statistics 显示网络工作信息统计表。
- -t或--tcp 显示TCP传输协议的连线状况。
- -u或--udp 显示UDP传输协议的连线状况。
- -v或--verbose 显示指令执行过程。
- -V或--version 显示版本信息。
- -w或--raw 显示RAW传输协议的连线状况。
- -x或--unix 此参数的效果和指定"-A unix"参数相同。
- --ip或--inet 此参数的效果和指定"-A inet"参数相同。
netstat 输出结果解析
netstat的输出结果可以分为两个部分:
-
Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
- Proto:连接使用的协议
- Recv-Q:单位是字节,是表示程序总共还有多少字节的数据没有从内核空间的套接字缓存拷贝到用户空间
- Send-Q:单位是字节,表示远程主机还没有接收到的数据量。发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快
- Local Address:本地主机名和端口号
- Foreign Address:远程主机名和端口号
- State:链路状态,共有12种状态。
-
Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
- Proto:连接使用的协议
- RefCnt:表示连接到本套接口上的进程号
- Type:显示套接字的类型
- State:显示套接字当前的链路状态
- I-Node:节点编号
- Path:连接到套接字的其它进程使用的路径名
[root@izwz91quxhnlkan8kjak5hz proc]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:ddi-tcp-1 localhost:51948 TIME_WAIT
tcp 0 0 izwz91quxhnlkan:msg-icp 113.110.230.173:srcp ESTABLISHED
tcp 0 0 izwz91quxhnlkan8k:57000 100.100.30.25:http ESTABLISHED
...
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] DGRAM 7377 /run/systemd/notify
unix 2 [ ] DGRAM 7379 /run/systemd/cgroups-agent
unix 2 [ ] DGRAM 10206 /run/systemd/shutdownd
...
State链路状态:
SYN: (同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立TCP连接时有效。表示一个新的TCP连接请求。
ACK: (确认编号,Acknowledgement Number)是对TCP请求的确认标志,同时提示对端系统已经成功接收所有数据。
FIN: (结束标志,FINish)用来结束一个TCP回话.但对应端口仍处于开放状态,准备接收后续数据。
状态 | 解释 |
---|---|
LISTEN | 监听TCP连接请求 |
SYN_SENT | 客户端发送SYN以请求连接之后,等待匹配的连接请求,此时状态为SYN_SENT |
SYN_RECV | 服务端发出ACK确认客户端的 SYN,同时向客户端发送一个SYN等待对连接请求的确认. 之后状态置为SYN_RECV |
ESTABLISHED | 连接已成功建立 |
FIN_WAIT1 | 主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。等待远程TCP的连接中断请求 |
CLOSE_WAIT | 被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求,此时状态为CLOSE_WAIT.等待从本地用户发来的连接中断请求 |
FIN_WAIT2 | 主动关闭端接到ACK后,就进入了 FIN_WAIT2。从远程TCP等待连接中断请求 |
LAST_ACK | 被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK |
TIME_WAIT | 在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态。等待足够的时间以确保远程TCP接收到连接中断请求的确认 |
CLOSING | 等待远程TCP对连接中断的确认 |
CLOSED | 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束 |
UNKNOWN | 未知的Socket状态 |
sockets Type 套接字类型:
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制
类型 | 解释 |
---|---|
SOCK_DGRAM | 此套接字用于数据报(无连接)模式 |
SOCK_STREAM | 流模式(连接)套接字 |
SOCK_RAW | 此套接字用于RAW模式 |
SOCK_RDM | 一种服务可靠性传递信息 |
SOCK_SEQPACKET | 连续分组套接字 |
SOCK_PACKET | RAW接口使用套接字 |
UNKNOWN | 未知类型 |
nestat 常用命令:
命令 | 解释 |
---|---|
netstat -a | 列出所有连接的网络状况 |
netstat -at | 列出 TCP 协议的连接 |
netstat -au | 列出 UDP 协议的连接 |
netstat -tnl | 只列出监听中的TCP连接 |
netstat -tnpl | 只列出监听中的TCP连接及其进程编号、进程名称 |
netstat -s | 显示网络统计信息 |
netstat -rn | 显示路由信息 |
netstat -i | 显示网络接口 |
netstat -atnp | grep ESTABLISHED | 只列出 active 状态的连接,active 状态的套接字连接用 "ESTABLISHED" 字段表示 |
netstat -aple | grep ssh | 查看ssh服务是否在运行 |
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}' | 统计TCP各个连接状态的数量 |
[root@izwz91quxhnlkan8kjak5hz proc]# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
ESTABLISHED 3
TIME_WAIT 2
// /proc/net/netstat文件格式化命令:cat /proc/net/netstat | awk '(f==0) {name=$1; i=2; while ( i<=NF) {n[i] = $i; i++ };
// 通过grep匹配某个值,结果netstat命令统计出来的数据与/proc/net/netstat文件中的数据是一致的
f=1; next} (f==1){ i=2; while ( i<=NF){ printf "%s%s = %d\n", name, n[i], $i; i++}; f=0} '
[root@izwz91quxhnlkan8kjak5hz ~]# cat /proc/net/netstat | awk '(f==0) {name=$1; i=2; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} (f==1){ i=2; while ( i<=NF){ printf "%s%s = %d\n", name, n[i], $i; i++}; f=0} ' | grep TCPSpuriousRTOs
TcpExt:TCPSpuriousRTOs = 1349
[root@izwz91quxhnlkan8kjak5hz net]# netstat -ts | grep TCPSpuriousRTOs
TCPSpuriousRTOs: 1349