09 监控网卡流量趋势图
wireshark的软件起始页能够实现实时监控网卡数据,这能告诉用户每个适配器当前的流量情况,我们来实现类似的功能。
想要实时输出网卡流量数据,那就要实时获取当前的流量信息。tshark是否可以做到呢?
可以用如下命令:
tshark -i WLAN -q -z io,stat,1
这个命令的作用是使用静默模式 在线抓取某个适配器的流量
- -z io, stat 1用来执行统计,统计每秒的数据包数量。
但是这个方法的问题是统计是事后统计的,没办法做到实时统计。
要做到实时统计,我们可以使用如下方法:和抓包类似,但是只输出两个和流量统计相关的数据
tshark -i WLAN -T fields -e frame.time_epoch -e frame.len
如此,我们将上述的数据按秒聚合即可。就能知道每一秒的数据流量大小了,那每一个Adapter都开启一个线程来统计。
class AdapterMonitorInfo
{
public:
AdapterMonitorInfo() {
monitorTsharkPipe = nullptr;
tsharkPid = 0;
}
std::string adapterName;
std::map<long, long> flowTrendData;
std::shared_ptr<std::thread> monitorThread;
FILE* monitorTsharkPipe = nullptr;
PID_T tsharkPid;
};
每一个网卡都需要用AdapterMonitorInfo
来记录其属性,而所有的AdapterMonitorInfo
对象都需要再统一的保存起来,放到TsharkManager
中。
/* monitor the flow trend */
std::map<std::string, AdapterMonitorInfo> adapterFlowTrendMonitorMap;
/* protect trend map */
std::recursive_mutex adapterFlowTrendMapLock;
监控网卡数据
既然每个网卡都需要启线程去capture,那么拆解任务目标:
- 获取现在的网卡适配器列表
- 每个网卡启动一个线程,统计对应网卡的数据
- 统计每一秒种的包数,而后汇总
- 在等待一定时间后,杀掉tshark让管道破裂结束
- 输出数据
相关命令:
tsharkPath + ” -i \”” + adapterName + “\” -T fields -e frame.time_epoch -e frame.len”
10 查看数据包详情和协议构建
wireshark中可以获取数据包的详细协议树信息,我们也需要做到类似的功能
如何实现呢?我们可以用
tshark -T pdml
tshark -r capture.pcap -Y “frame.number==1” -T pdml > packets.xml
命令获取协议树的详细信息
packets.xml文件内容如下: