8

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

据我所知,我已经看到了的TCP_INFO功能,getsockopt()但似乎没有一个字段存储“接收的总字节数”或“传输的总字节数(确认,例如)”。

我还看到了接口的netlink IFLA_STATS+RTNL_TC_BYTESSIOCETHTOOL+ ETHTOOL_GSTATS ioctl()rx_bytes字段),它们很棒,但我认为它们无法区分其他层的开销/标头和实际的有效负载字节。

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

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

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

目标是对我从 recvmsg() 存储的值有一个总体/不信任/第二次猜测。

Right Thing™ 要做的是正确跟踪这些值,但如果有一个简单的“嘿操作系统?我在这个套接字上真正收到了多少字节?”将是有价值的。

4

4 回答 4

4

还可以使用带有 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”来查找每个接口的统计信息。

于 2013-08-29T23:38:01.227 回答
2

你想要这个用于诊断,还是用于开发?

如果进行诊断,tcpdump 可以准确地告诉您网络上发生了什么,并通过端口和主机详细信息进行过滤。

如果为了发展,也许更多关于你想要达到的目标的信息会有所帮助......

ifconfig 给出 RX 和 TX 的总数。

ifconfig 从 /proc/net/dev 获取这些详细信息(您可以通过 strace ifconfig 看到)。

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

于 2013-08-29T12:16:01.903 回答
1

也许 /proc/net/dev 中的统计数据可以提供帮助。我不熟悉计算有效载荷与包括标头在内的完整数据包,因此这使问题更难回答。

至于单个文件描述符的统计信息,我不知道有任何标准方法可以获取该信息。

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

于 2013-08-28T04:21:59.033 回答
1

如果您不想只计算每个接口的总 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

如果您开始查找,信息net/core/net-procfs.c来自Linux 内核 (procfs 仅使用此信息)。当然,所有这些都意味着您需要特定的流程来跟踪。

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

于 2013-08-31T00:31:55.897 回答