目標是顯示出進程的上傳和下載流量和速度。好比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數組,同時計算出即時速度。