在GNU Linux中如何得到一个进程当前的流量

/*********************************************************************
 * Author  : Samson
 * Date    : 11/19/2014
 * Test platform:
 *              3.13.0-24-generic
 *              GNU bash, 4.3.11(1)-release
 * *******************************************************************/

主要分为以下几个步骤:   

(1)、通过使用抓包Libpcap库技术,对网络流量包进行获取,从而可以得到每个网络通信包的五元组(源地址、目标地址、源端口、目标端口、协议号)信息和当前包的流量大小,得到这些信息后建立一个表,此表中的同一会话的包大小信息会随着此会话的不断交互而累加数据包的大小。   

(2)、通过对/proc/下的所有进程的fd/目录下的所有链接进行遍历查看link的值,将遍历到的所有包含socket:开头的连接,将进程号与遍历所得的对应进程号、进程对应的所有socket fd对应的inode号进行建表。在命令行可以输入以下命令进行某一进程的当前网络连接情况查看,如下(以firefox为例):

#get PID of firefox

[email protected]:~$ ps aux | grep firefox

v0id       2143  7.8 21.0 1138824 433960 ?      Sl   11:19  44:36 /usr/lib/firefox/firefox

得到firefox的进程号为2143,那么查看此进程的fd下的文件描述符,使用以下命令即可看到此进程下目录下的有关socket的文件描述符信息,readlink后的结果中有socket开头的即为网络连接使用的fd(文件描述符),紧接在socket:后的即为fd的inode号,执行命令如下:

[email protected]:~$ ll /proc/2143/fd/ | grep socket

lrwx------ 1 v0id v0id 64 11月 19 11:19 10 -> socket:[27273]

lrwx------ 1 v0id v0id 64 11月 19 20:48 101 -> socket:[3726782]

lrwx------ 1 v0id v0id 64 11月 19 11:19 13 -> socket:[27336]

lrwx------ 1 v0id v0id 64 11月 19 11:19 14 -> socket:[27337]

lrwx------ 1 v0id v0id 64 11月 19 11:19 21 -> socket:[28264]

lrwx------ 1 v0id v0id 64 11月 19 20:48 30 -> socket:[29375]

lrwx------ 1 v0id v0id 64 11月 19 20:48 31 -> socket:[29692]

lrwx------ 1 v0id v0id 64 11月 19 20:48 32 -> socket:[30810]

lrwx------ 1 v0id v0id 64 11月 19 20:48 33 -> socket:[30812]

lrwx------ 1 v0id v0id 64 11月 19 20:48 36 -> socket:[31803]

lrwx------ 1 v0id v0id 64 11月 19 11:19 4 -> socket:[26607]

lrwx------ 1 v0id v0id 64 11月 19 20:48 40 -> socket:[31071]

lrwx------ 1 v0id v0id 64 11月 19 20:48 41 -> socket:[31073]

lrwx------ 1 v0id v0id 64 11月 19 20:52 44 -> socket:[5245647]

lrwx------ 1 v0id v0id 64 11月 19 20:52 69 -> socket:[5244897]

lrwx------ 1 v0id v0id 64 11月 19 20:52 71 -> socket:[5248187]

lrwx------ 1 v0id v0id 64 11月 19 20:52 72 -> socket:[5246226]

lrwx------ 1 v0id v0id 64 11月 19 20:52 75 -> socket:[5246227]

lrwx------ 1 v0id v0id 64 11月 19 20:52 76 -> socket:[5246228]

lrwx------ 1 v0id v0id 64 11月 19 20:52 77 -> socket:[5248188]

lrwx------ 1 v0id v0id 64 11月 19 20:52 78 -> socket:[5248189]

lrwx------ 1 v0id v0id 64 11月 19 20:52 79 -> socket:[5246239]

lrwx------ 1 v0id v0id 64 11月 19 20:48 80 -> socket:[3726781]

lrwx------ 1 v0id v0id 64 11月 19 20:52 81 -> socket:[5248214]

lrwx------ 1 v0id v0id 64 11月 19 20:52 82 -> socket:[5248217]

lrwx------ 1 v0id v0id 64 11月 19 20:52 83 -> socket:[5246330]

lrwx------ 1 v0id v0id 64 11月 19 20:52 84 -> socket:[5248215]

lrwx------ 1 v0id v0id 64 11月 19 20:52 85 -> socket:[5246331]

lrwx------ 1 v0id v0id 64 11月 19 20:52 86 -> socket:[5248216]

lrwx------ 1 v0id v0id 64 11月 19 20:52 87 -> socket:[5248218]

lrwx------ 1 v0id v0id 64 11月 19 20:52 88 -> socket:[5249212]

lrwx------ 1 v0id v0id 64 11月 19 20:48 89 -> socket:[37239]

lrwx------ 1 v0id v0id 64 11月 19 11:19 9 -> socket:[27820]

lrwx------ 1 v0id v0id 64 11月 19 20:52 90 -> socket:[5248222]

lrwx------ 1 v0id v0id 64 11月 19 20:52 92 -> socket:[5248223]

lrwx------ 1 v0id v0id 64 11月 19 20:52 93 -> socket:[5249279]

lrwx------ 1 v0id v0id 64 11月 19 20:48 94 -> socket:[37240]

lrwx------ 1 v0id v0id 64 11月 19 20:48 96 -> socket:[38308]

lrwx------ 1 v0id v0id 64 11月 19 20:48 97 -> socket:[37345]

lrwx------ 1 v0id v0id 64 11月 19 20:52 98 -> socket:[5249281]

lrwx------ 1 v0id v0id 64 11月 19 20:52 99 -> socket:[5249282]

(3)、通过对网络连接状态文件/proc/net/tcp中的当前通信连接进行实时读取,通过得到连接的源地址、目标地址、源商品、目标端口即可在抓包表中找到对应的可以查看到每个进程所连接的网络通道的信息,通过和抓包所得的五元组信息进行比较,即可在步骤(1)中建立的表中找出对应的每个程序所对应的网络流量,再通过把每个连接对应的inode与步骤(2)中遍历进程所得到的表进行对比,即可找出连接对应的进程;这里就能够把每个进程对应的流量统计出来了,通过累加每个进程的网络流量即可得到总的网络流量。

[email protected]:~$ ll /proc/2143/fd/ | grep socket ; cat /proc/net/tcp

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

0: 0101007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 12396 1 00000000 100 0 0 10 0

1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 11404 1 00000000 100 0 0 10 0

2: 9707A8C0:8BB9 0C7CB5DC:0050 02 00000001:00000000 01:00000166 00000002  1000        0 5243074 2 00000000 400 0 0 2 5

3: 9707A8C0:86F7 DF08A8C0:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5245647 1 00000000 21 4 8 10 -1

4: 9707A8C0:BFC9 E99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248217 1 00000000 20 4 24 10 -1

5: 9707A8C0:85FC AE2ED0CB:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248218 2 00000000 20 4 24 10 -1

6: 9707A8C0:9052 C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5246239 2 00000000 20 4 20 10 -1

7: 9707A8C0:9281 925C4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5246331 1 00000000 20 4 8 10 -1

8: 9707A8C0:DFB3 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5249212 2 00000000 21 4 24 10 -1

9: 9707A8C0:DFB5 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248223 2 00000000 20 4 24 10 -1

10: 9707A8C0:A614 E19D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5246330 1 00000000 20 4 24 10 -1

11: 9707A8C0:9051 C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248189 2 00000000 20 4 1 6 -1

12: 9707A8C0:904B C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5244897 1 00000000 20 4 8 10 -1

13: 9707A8C0:DFA5 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248187 2 00000000 20 4 8 10 -1

14: 9707A8C0:A613 E19D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248214 1 00000000 20 4 24 10 -1

15: 9707A8C0:905E C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5249281 3 00000000 20 5 3 10 -1

16: 9707A8C0:EAFE DF08A8C0:0050 08 00000000:00000001 00:00000000 00000000  1000        0 2102209 1 00000000 20 4 6 50 16

17: 9707A8C0:DFB0 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248216 2 00000000 20 4 24 10 -1

18: 9707A8C0:904E C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5246227 2 00000000 20 4 20 10 -1

19: 9707A8C0:DFB6 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5249279 2 00000000 21 0 0 10 -1

20: 9707A8C0:905F C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5249282 2 00000000 20 4 9 10 -1

21: 9707A8C0:C8CF 8805E29F:0050 08 00000000:00000001 00:00000000 00000000  1000        0 273820 1 00000000 20 4 6 43 16

22: 9707A8C0:975D 525D58DE:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5246226 1 00000000 21 4 24 10 -1

23: 9707A8C0:9055 C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248215 1 00000000 20 4 20 10 -1

24: 9707A8C0:DFB4 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248222 2 00000000 20 4 24 10 -1

25: 9707A8C0:DFA9 DD5D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5248188 2 00000000 21 4 8 10 -1

26: 9707A8C0:904F C99D4F75:0050 01 00000000:00000000 00:00000000 00000000  1000        0 5246228 2 00000000 20 4 11 10 -1

可以在发上的内容中找到inode号与(2)中列出的socket:[inode]一样的值了吧,例如inode为5248222的连接,相同的即是说这个连接是属于firefox进行的了。

时间: 2024-10-26 21:29:44

在GNU Linux中如何得到一个进程当前的流量的相关文章

在GNU Linux中怎样得到一个进程当前的流量

/*********************************************************************  * Author  : Samson  * Date    : 11/19/2014  * Test platform:  *              3.13.0-24-generic  *              GNU bash, 4.3.11(1)-release  * ************************************

Linux中强制结束一个进程的终极方法

在 Linux Ubuntu 服务器上用 dnx 基于 Kestrel 成功运行一个 ASP.NET 5 站点后,怎么也无无法退出. 运行的命令如下: /data/git/dnx/artifacts/build/dnx-coreclr-linux-x64/bin/dnx . kestrelStarted 但运行之后,怎么也退不出.不管是按回车,还是按ctrl-C,还是按ctrl-Z. Started ^C^Z 直接关闭客户端 ssh 窗口,命令依然在运行,站点依然可以正常访问. 然后重新用 ss

在Linux中定时执行一个程序的方法之at命令

/*********************************************************************  * Author  : Samson  * Date    : 04/29/2014  * Test platform:  *              3.11.0-12-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

在Linux中通过Top运行进程查找最高内存和CPU使用率

按内存使用情况查找前15个进程,在批处理模式下为“top” 使用top命令查看有关当前状态,系统使用情况的更详细信息:正常运行时间,负载平均值和进程总数. 分类:Linux命令操作系统 2016-07-27 00:00:00 类似于前面的技巧有关找出由RAM和CPU使用率最高的进程 ,还可以使用top命令来查看相同的信息. 也许有相比前一个这种方法的一个额外的优势:顶级的“头”,提供有关当前状态和使用该系统的额外信息:正常运行时间,平均负载和进程总数,仅举几例例子. 按顶部查找按内存使用的进程

linux中如何清空一个文件的内容

方法1: echo "" > /www.jbxue.com /xxx.log 方法2: echo "" >> /www.jbxue.com /xxx.log 方法3: 此命令能与“echo > /var/log/big.log”达到相同效果,不过,命令执行后,需要用“Ctrl + d”结束 方法4: clear > /opt/log/big.log 此命令会把big.log文件内容清空,而不删除文件 方法5: 同样的效果,用true.f

linux中使用top获取进程的资源占用信息

在linux中使用top获取进程的资源占用信息: Cpu(s):  1.0%us,  0.0%sy,  0.0%ni, 98.3%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0%st Mem: 8057964k total, 7938708k used, 119256k free, 132132k buffers 输入h获取帮助信息 o:改变列的先后顺序 F或O:选择由大到小排序的列 f:查看每列代表的含义 按cup大小排序,列出所有进程:top -ab -n 1 查看某

linux中内核的一个不错的参数somaxconn

导读:在linux中,/proc/sys/net/core/somaxconn这个参数,linux中内核的一个不错的参数somaxconn 看下其解析: 对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后, 我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了. 每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度,与如下两方面有关: - somaxconn参数. - 使用该端口的

GNU Linux中的SO_RCVLOWAT和SO_SNDLOWAT说明

/*********************************************************************  * Author  : Samson  * Date    : 07/12/2015  * Test platform:  *              gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2  *              GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu)

Linux中如何搭建一个ftp服务服务器-超详细

ftp工作是会启动两个通道: 控制通道 , 数据通道 在ftp协议中,控制连接均是由客户端发起的,而数据连接有两种模式:port模式(主动模式)和pasv(被动模式) PORT模式: 在客户端需要接收数据时,ftp_client(大于1024的随机端口)-PORT命令->ftp_server(21)  发送PORT命令,这个PORT命令包含了客户端是用什么端口来接收数据(大于1024的随机端口),在传送数据时,ftp_server将通过自己的TCP 20 端口和PORT中包含的端口建立新的连接来