简介

  面向应用的自定义TCP消息拦截、分析、统计工具。 因为每个项目TCP协议规范不一致,因此次项目不能直接使用,需要自行修改包封装逻辑和统计逻辑。

本地运行

  service/gate/example目录提供了示例TCP服务器客户端,可直接本地运行。需要提前安装go和mongodb运行环境。

安装MongoDB

# 1. 运行镜像
docker run -itd --name mongo-3.6.23 --restart=always -p 27017:27017 mongo:3.6.23 --auth

# 2. 进入容器创建账号
docker exec -it mongo-3.6.23 mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
db.auth('admin', '123456')

# 3. 连接地址
mongodb://admin:123456@192.168.110.16:27017/?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&ssl=false

运行项目

项目地址:http://127.0.0.1:5041
账号: admin
密码: 123

# 1. 克隆项目
git clone https://github.com/jzyong/TcpMonitor.git

# 2. 构建项目
cd TcpMonitor
go build

# 3. 查看网卡及配置config/ApplicationConfig_develop_gate.json 中的device
TcpMonitor.exe -m device
  [INFO]net_manager.go(105)--> 网卡:\Device\NPF_Loopback ==> Adapter for loopback traffic capture

# 4 运行网络工具 访问:http://127.0.0.1:5041 
TcpMonitor.exe --config config/ApplicationConfig_develop_gate.json

查看网卡列表

运行TCP服务器、客户端

# 1.运行测试服务器代码
cd service\gate\example
go test

测试服务器客户端

常见问题

1. couldn't load wpcap.dll
官网下载最新的Npcap
参考文档:https://blog.csdn.net/itopit/article/details/125075447

Linux运行

  service/gate/example目录提供了示例TCP服务器客户端,可直接本地运行。需要提前安装go和mongodb运行环境。

安装MongoDB

# 1. 运行镜像
docker run -itd --name mongo-3.6.23 --restart=always -p 27017:27017 mongo:3.6.23 --auth

# 2. 进入容器创建账号
docker exec -it mongo-3.6.23 mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
db.auth('admin', '123456')

# 3. 连接地址
mongodb://admin:123456@192.168.110.16:27017/?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&ssl=false

运行项目

项目地址:http://127.0.0.1:5041
账号: admin
密码: 123

# 1. 克隆项目
git clone https://github.com/jzyong/TcpMonitor.git

# 2. 构建项目
cd TcpMonitor
CGO_ENABLED=0
GOOS=linux
GOARCH=amd64
go build

# 3. 查看网卡及配置config/ApplicationConfig_develop_gate.json 中的device
./TcpMonitor -m device
  [INFO]net_manager.go(105)--> 网卡:eth0 ==>

# 4 运行网络工具 访问:http://127.0.0.1:5041 
./TcpMonitor --config config/ApplicationConfig_develop_gate.json

运行TCP服务器、客户端

# 1.运行测试服务器代码
cd service\gate\example
go test

常见问题

1. error while loading shared libraries: libpcap.so.1: cannot open shared object file: No such file or directory

sudo yum install libpcap

Web使用

仪表盘

  首页仪表盘统计了最近24小时的socket连接情况,详细如图所示 仪表盘1 仪表盘2

套接字

  套接字展示最近30天所有socket创建列表。可通过玩家Id和客户端Ip进行模糊查询,创建时间和结束时间进行排序。 每个socket连接断开时会进行预警检测,发送到sentry中,具体逻辑如下:

  1. 失败数>10&&失败率>0.1 ==> 网络监控:玩家%v ip=[] 消息=[%v=%v] 请求=%v次 失败=%v次 失败率=%v
  2. 请求数>10&&平均延迟>200 ==> 网络监控:玩家%v ip=[%v] 消息=[%v=%v] 请求=%v次 平均延迟=%vms 最大延迟=%vms
  3. 请求数>100&&(重复请求>10||重复返回>10) ==> 网络监控:玩家%v ip=[%v] 消息=[%v=%v] 请求=%v次 重复请求=%v 重复返回=%vms

  点击详细按钮可查看每个socket的详细消息请求,可进行线上玩家Bug排查辅助,判断服务器有没有给客户端反消息或消息是否正确。
  点击统计按钮可查看每个socket的消息统计:延迟、数量、重复请求、字节大小、rps...... 套接字连接1 套接字连接2 套接字连接3

消息

  展示net-service启动到现在所监控网关所有收发消息的统计,包括延迟、数量、重复请求、字节大小、rps等。 消息1

服务器

  可查看服务器启动到现在或最近24小时的负载、CPU百分比、内存、连接数、带宽。 服务器信息

控制台

  控制台可事实查看网关消息,可选择Socket关闭或打开``基础日志``详细日志三种模式,可过滤ip和玩家Id 控制台

国家&城市

  国家和城市分别根据范围大小进行统计分析,最近24小时的数据。

  • 列表
    展示国家或城市所有的详细统计,可在搜索栏查询国家或城市关键字。 国家列表
  • 图表
    国家或城市关键信息柱状图对比线上,只显示用户数最多的前50条数据。 国家图表
  • 地图
    国家或城市用户地图分布状况,主要查看玩家所在区域,人数,延迟等。 标记圆圈半径=socket连接数*100m;颜色表示延迟,绿色<100ms,黄色<200ms,红色>200ms 国家地图

实现原理

  使用gopacket直接在网卡上拦截服务器或客户端所有请求消息,beego做网页展示统计。流程如下: 消息拦截流程

TCP协议

  示例代码使用如下TCP自定义协议。
消息长度(4B)+消息ID(4B)+Ack(4B)+Seq(4B)+Protobuf消息体