根据TCP协议的三次握手,完整的建立一个连接分为四步
1.客户端在本地将本地socket状态改为SYN_SENT,并发送信号量(SYN)给服务端
2.服务端收到信号后将socket状态改为SYN_RCVD,并发送SYN_ACK给客户端
3.客户端受到信号后将socket状态改为ESTABLISHED,并发送ACK给服务器
4.服务器收到信号后将socket状态改为ESTABLISHED
此时tcp连接就建立起来了
监控用户连接状态的思路就是统计ESTABLISHED的数量,
TCP的四次断开思路如下:
1.客户端将socket状态改为FIN_WAIT,并发送信号量FIN_ACK给服务器
2.服务器收到信号后,将socket状态更改为CLOSE_WAIT,并发送ACK给客户端,代表收到请求
3.服务器将socket状态改为CLOSE_WAIT后,又迅速将状态更改为LAST_ACK,即不等待客户端回应,并发送FIN给客户端
4.客户端如果先收到ACK,将socket状态改为FIN_WAIT2,不发送信号量
5.客户端如果先收到FIN,将socket状态改为TIME_WAIT,并发送信号量ACK给服务端,服务端不接受此ACK(drop)
根据四次断开,我们可以监控CLOSE_WAIT的数量来获取断开连接的用户数
准备客户端,服务端两台服务器
1.客户端模拟多人并发连接
- [root@zabbixclient_web1 ~]# ab -c 1000 -n 100000 http://192.168.2.100/
2.查看网络连接状态,仔细观察、分析第二列的数据
- [root@myhost ~]# ss -antup | grep "ESTAB"
tcp ESTAB 0 98756 192.168.1.233:22 113.87.27.59:8026 users:(("sshd",pid=11514,fd=3))
3.创建自定义key
注意:被监控端修改配置文件,注意要允许自定义key并设置Include。
- [root@zabbixclient_web1 ~]# vim /usr/local/etc/zabbix_agentd.conf.d/net.status
- UserParameter=net.status[*],/usr/local/bin/net_status.sh $1
- [root@zabbixclient_web1 ~]# killall zabbix_agentd
- [root@zabbixclient_web1 ~]# zabbix_agentd
4.自定义监控脚本
- [root@zabbixclient_web1 ~]# vim /usr/local/bin/net_status.sh
- #!/bin/bash
- case $1 in
- estab)
- ss -antp |awk '/^ESTAB/{x++} END{print x}';;
- close_wait)
- ss -antp |awk '/^CLOSE-WAIT/{x++} END{print x}';;
- esac
- [root@zabbixclient_web1 ~]# chmod +x /usr/local/bin/net_status.sh
5.测试效果
- [root@zabbixclient_web1 ~]# zabbix_get -s 127.0.0.1 -k 'net.status[time_wait]'
6.监控netstatus
在监控服务器,添加监控项目item,Configuration-->Hosts点击主机后面的items
点击Create item,如图