目标是显示出进程的上传和下载流量和速度。好比Firfox: 累计上传1MB,累计下载23MB,上传速度0KB/s,下载速度121KB/s。node
实时监控应用程序的流量,包括应用程序的下载速度,上传速度,下载总量和上传总量。数组
实现过程分为3个主要步骤。数据结构
步骤1:Libpcap经过抓包实时统计网口流量,统计sip+sport+dip+dport和payload的键值结构。socket
步骤2:获取Socket Status,经过解析/proc/net/(tcp6?|udp6?),获得local_ip+local_port+remote_ip+remote_port和inode的键值结构。tcp
步骤3:获取Process Status,经过解析/proc/xx/fd/,获得inode和process_name的键值结构。spa
经过上面3个步骤把payload和process_name关联起来,再经过运算获得下载速度,上传速度,下载总量和上传总量等相关数值。进程
经过解析/proc/net/(tcp6?|udp6?)获得的IP四元组和Inode的键值结构,这个文件获得的IP四元组组合是socket层面地址,为了判断方向,须要使用IPGroup-Dir存储方向信息,{local_addr+remote_addr : 1}表示上行(上传)和{remote_addr+local_addr : 2}表示下行(下载)。事件
经过Pcap抓包解析获得的IP四元组和包负载的键值结构,本方法获取的IPGroup是TCP/IP协议层的IPGroup,获得{src_addr+dest_addr : payload},利用IPGroup-Dir获得该数据包的方向,而后把payload累加到对应地方。ip
经过解析/proc/xx/fd/获得。rem
目标是获得PName-Payload,同时计算实时网速。
1.初始化存储空间,初始化PID-Inode,Pname-PID,IPGroup-Payload和IPGroup-Inode关系数组。
2.Pcap开始抓包而且监听’package‘事件,统计package到IPGroup-Payload数组。
3.设置定时器,定时更新PID-Inode,Pname-PID和IPGroup-Inode,其中根据/proc/xx/fd/更新PID-INode和PName-PID,根据/proc/net/[tcp6?|udp6?]统计出IPGroup-Inode。更新完后结合IPGroup-Payload根据“数据转换图”转换成PName-Payload数组,同时计算出即时速度。