【发布时间】:2013-08-22 15:07:54
【问题描述】:
我想查找给定文件描述符或给定接口的 TCP 有效负载活动计数器(接收的总字节数)。最好是给定的文件描述符,但对于接口就足够了。理想情况下,我真的很想知道任何已确认的字节,即使是我尚未读入用户空间的字节(还没有?)。
我已经看到 getsockopt() 的 TCP_INFO 功能,但据我所知,似乎没有一个字段存储“接收的总字节数”或“传输的总字节数(例如确认)”。
我还看到了接口的 netlink IFLA_STATS+RTNL_TC_BYTES 和 SIOCETHTOOL+ETHTOOL_GSTATS ioctl()(rx_bytes 字段),这些都很棒,但我没有不认为他们能够区分其他层的开销/标头和实际有效负载字节。
procfs 有 /proc/net/tcp 但这似乎也不包含我要查找的内容。
有什么方法可以获取这些特定的数据吗?
编辑:混杂模式对吞吐量有无法承受的影响,所以我无法利用任何使用它的东西。更不用说实现大部分 IP 堆栈来确定哪些数据包是合适的,这超出了我对这个解决方案的预期范围。
目标是对我从 recvmsg() 存储的值有一个总体/不信任/第二次猜测。
正确的做法是正确跟踪这些值,但如果有一个简单的“嘿操作系统?我在此套接字上真正收到了多少字节?”会很有价值。
【问题讨论】:
-
您可以使用
iptables进行计数。这个答案很有趣:superuser.com/a/264651 -
你可以使用 libpcap 吗?您可以设置监控接口并准确捕获您想要的数据包类型,然后如果这些数据包符合您的条件,只需增加一个计数器。
标签: linux networking tcp