确定TCP有效负载活动/统计信息

我想查找给定的文件描述符或给定接口的TCP有效负载活动(接收到的总字节数)的计数器。 最好是给定的文件描述符,但对于接口来说就足够了。 理想情况下,我真的很想知道所有已经被确认的字节,即使是我还没有读入用户空间的字节(还有?)。

我已经看到了getsockopt()TCP_INFO特性,但是就我TCP_INFO ,没有一个字段存储“接收到的总字节数”或者“传输的总字节数(例如acked)”。

我也看到了接口的netlink IFLA_STATS + RTNL_TC_BYTESSIOCETHTOOL + ETHTOOL_GSTATS ioctl()rx_bytes字段),这些都很好,但我不认为他们能够区分开销/标题其他层和实际的有效载荷字节。

procfs/proc/net/tcp但是这似乎并不包含我正在寻找的东西。

有什么办法可以得到这个特定的数据?

编辑:混杂模式对吞吐量有一个难以忍受的影响,所以我不能利用任何使用它。 更不用说,实施IP堆栈的大部分来确定哪些数据包是合适的,这超出了我对此解决scheme的预期范围。

目标是对我从recvmsg()存储的值进行总体/不信任/猜测。

Right Thing™要做的是正确地跟踪这些值,但是有一个简单的“Hey OS?我真的在这个套接字上收到了多less字节?

也可以使用SIOCINQ的ioctl调用来获取接收缓冲区中排队的未读数据量。 以下是手册页中的用法: http : //man7.org/linux/man-pages/man7/tcp.7.html

 int value; error = ioctl(tcp_socket_fd, SIOCINQ, &value); 

对于接口TCP统计,我们可以使用“netstat -i -p tcp”来查找每个接口的统计信息。

你想要这个诊断或发展?

如果诊断,tcpdump可以准确地告诉你网络上发生了什么事情,通过端口和主机细节进行过滤。

如果为了发展,也许有关你想要达到什么的更多信息将有助于…

ifconfig给出RX和TX总数。

ifconfig从/ proc / net / dev中获取这些详细信息(如通过strace ifconfig所示)。

还有netstat -t给出的Send / Receive-Q值,如果这更接近你想要的。

也许/ proc / net / dev中的统计信息可以提供帮助。 我不熟悉计算有效负载与包括头文件在内的完整数据包,所以这个问题很难回答。

至于个别文件描述符的统计数字,我不知道有任何标准的手段来获得这些信息。

如果可以控制需要统计的程序的启动,可以使用实现自己的read(),write(),sendto()和recvfrom()调用的“拦截器”库,通过调用标准的C库(或直接调用系统调用),保持活动的计数器,并找到一种方法来发布这些值。

如果你不想只计算每个接口的总RX / TX(这已经在ifconfig / iproute2工具中可用)…

如果你再看一下/ proc,你可以得到更多的信息。 更具体地说/proc/<pid>/net/dev

示例输出:

  Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed eth0: 12106810846 8527175 0 15842 0 0 0 682866 198923814 1503063 0 0 0 0 0 0 lo: 270255057 3992930 0 0 0 0 0 0 270255057 3992930 0 0 0 0 0 0 sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

如果你开始看,信息来自Linux内核的 net/core/net-procfs.c (procfs只是使用这个信息)。 所有这些当然意味着你需要特定的过程来跟踪。

您可以仔细阅读/proc提供的信息,或者如果您需要更稳定的信息,则专门为您的应用程序复制net-procfs功能可能是有意义的。