TCP状态统计 - 脚本命令
一、netstat命令说明
netstat常见参数 -a (all)显示所有选项,默认不显示LISTEN相关 -t (tcp)仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化成数字。 -l 仅列出有在 Listen (监听) 的服務状态 -p 显示建立相关链接的程序名 -r 显示路由信息,路由表 -e 显示扩展信息,例如uid等 -s 按各个协议进行统计 -c 每隔一个固定时间,执行该netstat命令。 提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
二、统计TCP状态
统计TCP状态:netstat -ant | awk 'NR>=3 {++State[$6]} END {for (key in State) print key,State[key]}' ss -ant | awk 'NR>=2 {++State[$1]} END {for (key in State) print key,State[key]}' 首先是netstat内容输出: [vagrant@localhost ~]$ netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:39198 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 10.0.2.15:22 10.0.2.2:58263 ESTABLISHED tcp 0 0 :::51041 :::* LISTEN tcp 0 0 :::111 :::* LISTEN tcp 0 0 :::22 :::* LISTEN tcp 0 0 ::1:25 :::* LISTEN 命令注释:netstat -n | awk '/^tcp/ {++state[$NF]} END {for(a in state) print a, state[a]}' /^tcp/ 滤出tcp开头的记录,屏蔽udp, socket等无关记录。 state[] 相当于定义了一个名叫state的数组 NF The number of fields in the current input record.(表示输入数据的字段总数,如上所示的记录,NF等于6) $NF 表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT state[$NF] 表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数 ++state[$NF] 表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一 END 表示在最后阶段要执行的命令 for(key in state) 遍历数组 print key,"\t",state[key] 打印数组的键和值,中间可以用\t制表符分割,美化一下。 NR>=3 The total number of input records seen so far.(NR表示已输入数据行数目,即表示从第二行开始处理,NR和NF都是内建变量) 同理ss工具下的awk语句应该修改成:ss -ant | awk 'NR>=2 {++State[$1]} END {for (key in State) print key,State[key]}' [root@localhost ~]# ss -ant State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 *:3306 *:* LISTEN 0 128 *:6379 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* ESTAB 0 0 10.0.2.15:22 10.0.2.2:58352 ESTAB 0 0 10.0.2.15:22 10.0.2.2:57127 LISTEN 0 128 :::80 :::* LISTEN 0 32 :::21 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
三、统计每个IP的连接数
统计每个IP的连接数:netstat -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort -rn ss -n | awk '/^tcp/ {print $5}' | awk -F: '{print $1}' | sort | uniq -c| sort -rn ---------------------------------------------------(netstat -n in CentOS6)---------------------------------------------------- Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.0.2.15:22 10.0.2.2:58262 ESTABLISHED tcp 0 0 10.0.2.15:22 10.0.2.2:58263 ESTABLISHED ---------------------------------------------------(ss -n in CentOS7)--------------------------------------------------------- Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 10.0.2.15:22 10.0.2.2:58352 tcp ESTAB 0 0 10.0.2.15:22 10.0.2.2:57127 netstat -n :以数字形式显示地址信息 awk '/^tcp/ {print $5}' :筛选以tcp开头的行,并打印5th filed. awk -F: '{print $1}' :以冒号为字段分隔符,打印第一个字段(-F fs 指定行中分隔数据字段的字段分隔符) uniq -c :去除重复项目,-c 进行计数 sort -rn :进行排序,-r 反向排序 -n 使用纯数字进行排序