1. 网络状态
State | 状态 |
LISTENING | 监听中,服务端需要打开一个socket进行监听,侦听来自远方TCP端口的连接请求 |
ESTABLISHED | 已连接,代表一个打开的连接,双方可以进行或已经在数据交互了 |
SYN_SENT | 客户端通过应用程序调用connect发送一个SYN以请求建立一个连接。在收到ACK后,状态转为ESTABLIHSED |
CLOSE_WAIT | 被动关闭端接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序) |
TIME_WAIT | 主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态 |
LAST_ACK | 等待对方回应一个ACK(这是准备关闭连接的一个步骤,意味着这个连接正在关闭) |
2. netstat
命令的用法格式和选项如下:
usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]
-r, --route 显示路由表
-I, --interfaces=<Iface> 显示<Iface>的接口表
-i, --interfaces 显示网络界面信息表单
-g, --groups 显示多重广播功能群组组员名单
-s, --statistics 显示网络工作信息统计表
-M, --masquerade 显示伪装的网络连线
-v, --verbose 显示指令执行过程
-V, --version 显示版本信息
-W, --wide 不截断IP地址
-w, --raw 显示RAW传输协议的连线状况
-n, --numeric 不解析名称,以数字形式显示地址和端口号
--numeric-hosts don't resolve host names
--numeric-ports don't resolve port names
--numeric-users don't resolve user names
-N, --symbolic 显示网络硬件外围设备的符号连接名称
-e, --extend 显示网络其他相关信息
-p, --programs 显示正在使用Socket的程序识别码和程序名称
-o, --timers 显示计时器(显示定时器)
-c, --continuous 持续列出网络状态
-l, --listening 显示监控中的服务器的Socket
-a, --all 示所有连线中的Socket
-F, --fib display Forwarding Information Base (default)
-C, --cache 显示路由缓存而不是FIB
-Z, --context 显示套接字的SELinux安全上下文
3. 功能使用例子
netstat -anop | grep 端口号
显示所有连接和监听端口并显示每个连接相关的进程ID
netstat -ano
netstat -ano: 显示所有连接和监听端口,以数字形式显示地址和端口号,并显示与每个连接相关的进程 ID
显示所有已建立的连接
netstat -ano | grep ESTABLISHED
显示每个进程的连接数
netstat -ano | grep ESTABLISHED | awk '{print $5}' | sort | uniq -c | sort -nr | head -10
grep ESTABLISHED :过滤出已建立的连接。
awk '{print $5}' :提取出第5列进程ID。
sort | uniq -c | sort -nr :排序统计每个进程ID的连接数量,并按照连接数量从高到低排序;
sort:排序。
uniq -c:用于在文本中查找并计数唯一行,有点像count - group by
sort -nr:用于对文本进行排序。
-n 选项表示按照数值大小排序,而不是按照字典序排序;
-r 选项表示按照逆序排序,即从大到小排序。
head : 显示前面的若干行。
显示每个IP地址的连接数
netstat -ano | awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn
显示每种类型TCP/UDP的连接数
netstat -ano | awk '{print $1}' | sort | uniq -c
显示指定进程ID网络状态的数量// TCP 网络状态的数量
netstat -ano |grep tcp | awk '{print $6}' | sort | uniq -c
显示端口占用数量
netstat -ano | grep -c : 注意冒号和前面的命令是一个整体
或者
netstat -a -n | grep -c "TCP"
netstat -a -n | grep -c "UDP"
netstat -a -n | grep -w "TCP" | wc -l
netstat -ano | awk 'NR>2{print $1}' | sort | uniq -c | awk '{print $2 "占用了"$1"个端口"}'
上面的都有重复
netstat -ano | awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn
"grep -c :" : grep 命令用于在文件或输出中查找与指定模式匹配的行,并将匹配的行打印出来。
其中 -c 选项用于统计匹配到的行数
":" : 表示匹配冒号字符。 因此,grep -c : 命令会统计输出或文件中包含冒号字符的行数。
显示指定进程ID指定协议的数量
netstat -ano | grep 进程ID | grep UDP | grep -v -E ':5353|::'
"-v":排除相关的行。grep -v UDP排除UDP相关的行。
"-E 'keyword1|keyword2|keyword3'" : 匹配多个关键词,keyword1、keyword2和keyword3是关键词,用|分隔。
"wc -l" : 用于统计文件的行数
netstat -ano | grep 6712 | grep UDP | grep -v -E ':5353|::' | wc -l
4. ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等统计
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 命令格式
Usage: ss [ OPTIONS ]
ss [ OPTIONS ] [ FILTER ]
-h, --help 显示帮助信息
-V, --version 输出版本信息
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字
-l, --listening 显示监听套接字
-o, --options 显示定时器信息
-e, --extended 显示详细的套接字信息
-m, --memory 显示套接字内存使用情况
-p, --processes 显示使用套接字的进程
-i, --info 显示内部TCP信息
-s, --summary 显示套接字使用概况
-b, --bpf 显示bpf过滤套接字信息
-E, --events 持续显示被销毁的套接字
-Z, --context 显示进程的SELinux安全上下文
-z, --contexts 显示进程和套接字的SELinux安全上下文
-N, --net 切换到指定的网络命名空间名称
-4, --ipv4 仅显示IP版本4套接字
-6, --ipv6 仅显示IP版本6套接字
-0, --packet 显示PACKET套接字
-t, --tcp 仅显示TCP套接字
-S, --sctp 仅显示SCTP套接字
-u, --udp 仅显示UDP套接字
-d, --dccp 仅显示DCCP套接字
-w, --raw 仅显示RAW套接字
-x, --unix 仅显示Unix域套接字
--vsock 仅显示vsock套接字
-f, --family=FAMILY 显示指定类型的套接字,FAMILY类型包括:
inet、inet6、link、unix、netlink、vsock、help。
-K, --kill 强制关闭套接字,并显示被关闭的套接字。
-H, --no-header 禁止显示标题行。
-A, --query=QUERY, --socket=QUERY 查询指定类型的套接字,QUERY类型包括:
all、inet、tcp、udp、raw、unix、unix_dgram、unix_stream、unix_seqpacket、
packet、netlink、vsock_stream、vsock_dgram等。
-D, --diag=FILE 将TCP套接字的原始信息导出到文件。
-F, --filter=FILE 从文件中读取过滤信息。
5. 使用例子
ss -l 显示本地打开的所有端口
ss -pl 显示每个进程具体打开的socket
ss -t -a 显示所有tcp socket
ss -u -a 显示所有的UDP Socekt
ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接
ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接
ss -x src /tmp/.X11-unix/* 找出所有连接X服务器的进程
ss -s 列出当前socket详细信息:
分别使用netstat 和ss 统计服务器并发连接数
1. time netstat -ant | grep ESTABLISHED | wc -l
2. time ss -o state ESTABLISHED | wc -l
结果如下图