我想查找给定文件描述符或给定接口的TCP有效负载活动的计数器(接收的总字节数)。优选地,给定文件描述符,但对于接口就足够了。理想情况下,我真的很想知道任何已被识别的字节,甚至是那些我还没有读入用户空间的字节(但是?)。
我已经看到了TCP_INFO
的{{1}}功能,但是据我所知,没有一个字段似乎存储“接收的总字节数”或“传输的总字节数(例如,acked)”
我还看到了getsockopt()
netlink
+ IFLA_STATS
和RTNL_TC_BYTES
+ SIOCETHTOOL
ETHTOOL_GSTATS
(ioctl()
字段)对于接口,这些很好,但我不认为他们能够区分其他层的开销/头和实际的有效负载字节。
rx_bytes
有procfs
,但这似乎不包含我正在寻找的内容。
有没有办法获得这些特定数据?
编辑:混杂模式对吞吐量产生了无法忍受的影响,因此我无法利用任何使用它的东西。更不用说实现IP堆栈的大部分以确定哪些数据包是合适的超出了我的预期范围。
目标是对recvmsg()存储的值进行总体/不信任/第二次猜测。
正确的事情要做的是正确地跟踪这些值,但是有一个简单的“嘿OS?在这个套接字上我真正接收了多少字节?”是很有价值的。
答案 0 :(得分: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”来基于每个接口查找统计信息。
答案 1 :(得分:2)
您希望将其用于诊断或开发吗?
如果诊断,tcpdump可以准确地告诉您网络上发生了什么,通过端口和主机详细信息进行过滤。
如果要进行开发,或许有关您正在尝试实现的内容的更多信息会有所帮助......
ifconfig给出了RX和TX总数。
ifconfig从/ proc / net / dev获取这些详细信息(通过strace ifconfig可以看到)。
还有netstat -t给出的Send / Receive-Q值,如果它更接近你想要的值。
答案 2 :(得分:1)
也许/ proc / net / dev中的统计信息可以提供帮助。我不熟悉计算有效载荷与包括标题的完整数据包,因此这使得问题更难回答。
至于个别文件描述符的统计数据,我不知道获取该信息的任何标准方法。
如果可以控制需要统计信息的程序的启动,则可以使用“拦截器”库来实现其自己的read(),write(),sendto()和recvfrom()调用,直接调用标准C库(或直接调用系统调用),保留活动的计数器,并找到发布这些值的方法。
答案 3 :(得分: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 kernel(procfs只使用此信息)。所有这一切当然意味着您需要特定的流程来跟踪。
您可以仔细阅读/proc
中提供的信息,或者如果您需要更稳定的信息,那么专门为您的应用复制net-procfs功能可能是有意义的。