http://www.kernelchina.org/?q=node/565
Android上的流量监控思路
看了一下linux提供的API以及相关代码,基本有一些结论。
1.协议栈对于每socket并不维护统计信息,因为没有必要添加相关信息,一则影响性能,二则无处保存。
通过NetLink的 NETLINK_TCPDIAG无法实现,该接口被iproute2中的工具使用,提供一些系统快照信息。其中2.6的实现是读取tcp_info结构获取tcp connection的快照信息,相关信息中也没有包含统计信息。
有关netlink,有网文描述下面RFC是其标准定义,
RFC 3549 Linux Netlink as an IP Services Protocol
简单的看了一下这个RFC,其实是将netlink作为网络协议使用的一个informational RFC。作为IETF是从来不care主机内部实现的,因此这个RFC也一定不能称为linux netlink的定义。
2.可行思路之一是通过netfilter架构采集信息,但是Android的Netfilter没有被编译到标准的kernel。
看了一下有些大侠已经实现的类似工具,基本上要刷系统,内核中添加netfilter编译支持来实现。
3.可行思路之二是在Java层面对于应用收发流量进行获取,尚不知Java是否提供相关接口用于监控虚拟机。另外Android的虚拟机也是非标准的Google自己的,功能有待研究。