linux下有什么办法可以获得进程的udp流量
如题,
我目前可以得到使用tcp协议的进程的流量, 使用netstat 得到一个 localip:port remoteip:port pid 对作为键值,
通过抓包获得localip:port remoteip:port databyte, 然后用抓包获得的localip:port remoteip:port与netstat的做比较, 遇到相同的 就 将databyte归入 该pid下,
但是 使用udp协议的进程 因为netstat无法获得remoteip:port 因此 上面的方法对udp协议无效. ps: 我用nc 使用udp 传送一个文件. netstat是可以看见该pid的. 但是对于QQ.exe 这种的udp , 只是发送一个很小的字节或者接收一个很小的字节. netstat就看不见了.
我也在/proc/pid/net/udp 下找过 也没有收获.
百合曾经告诉过我. 可以通过写内核模块来实现, 我也知道 所有进程的通信, 内核是肯定知道的, 但是我不知道如何 从内核获得这个信息.
如果可以的话. 你们帮我让我做一个伸手党吧 :D,
btw 我尝试用systamtap 可以获得QQ.exe的udp流量. 但是我总不能将systemtap包含进我的程序里面吧 :D
Answers
你可以参考一下,atop作者开发的一个用于监控进程的网络通信的内核模块netatop:
编译安装最新版atop:
http://www.atoptool.nl/downloadatop.php
wget
http://www.atoptool.nl/download/atop-2.1-1.tar.gz
tar xzf atop-2.1-1.tar.gz && cd atop-2.1
make && sudo make install
atop
atop交互命令:
t(手动刷新,默认刷新间隔为10秒,i可以修改时间间隔) g(默认输出) d(磁盘) m(内存)
s(调度) v(可变) c(命令行) p(进程统计) u(用户统计) n(网络,需要内核模块netatop支持)
C(按CPU排序) M(按内存MEM排序) D(按磁盘DSK排序) N(按网络NET排序)
编译安装atop的网络内核模块netatop:
http://www.atoptool.nl/downloadnetatop.php
wget
http://www.atoptool.nl/download/netatop-0.3.tar.gz
make && sudo make install
sudo service netatop start
atop里按n即可输出网络相关的信息.
模块位置: /lib/modules/
uname -r
/extra/netatop.ko
服务脚本: /etc/init.d/netatop
调用关系: netatop.ko => netatopd => atop