7

我想知道是否有一种编程方式来测量通过 TCP 流发送数据时使用的全部带宽。由于我似乎不知道网络堆栈如何将流分成数据包,或者它何时发送 TCP SYN 或 ACK 或它在后台为您所做的许多事情,所以我只能对此进行粗略估计。

我能想到的唯一解决方案是实际嗅探接口,但我想认为堆栈已经可以为我收集这些统计信息。

这是在 Windows 或 Linux 下的 Java 中运行的(当然,首选可移植的解决方案),但我可以 JNI 化 C/C++ 答案,这样(和 OS API 调用)也是一个很好的答案。谢谢!

4

7 回答 7

2

[Windows 特定答案]

在 Windows 上,您可以考虑查看 ETW(Windows 事件跟踪)。通常,ETW 是用于在 Windows 上提供跟踪/日志记录信息的技术,并且大多数 Microsoft 软件已经配备了您可以使用的 ETW 提供程序。在您的情况下,我认为 Microsoft-Windows-TCPIP 提供程序具有可能对您有帮助的信息(例如本地/远程地址和端口、操作、发送/接收的字节数等)。

例如,我能够开始使用以下命令将 TCPIP 事件收集到文件中:

logman start MyTcpipLog -p Microsoft-Windows-TCPIP -ets

并停止

logman stop MyTcpipLog -ets

然后可以使用许多不同的工具(例如 xperf)打开 MyTcipipLog.etl 文件,但是您可以使用 API 自行解析该文件。

如果您想在运行时执行此操作,您可以创建一个“实时”ETW 会话来处理传入的事件。

如果您是 ETW 的新手,请参阅我在 MSDN 上使用的一篇有用的文章

于 2011-04-12T02:00:47.687 回答
1

不能代表 Windows,但从 2.6.37 开始,Linux 内核没有收集您正在寻找的统计数据。每个套接字的统计信息必须在struct sock或其后代中,我在那里看不到任何传输/接收计数器:

http://lxr.linux.no/linux+v2.6.37.3/include/net/sock.h#L224

于 2011-03-08T07:01:42.610 回答
0

您可以考虑使用 Perfmon 计数器。网络接口/当前带宽计数器可能是您需要的。您可以从 .NET 代码创建和使用性能计数器。

于 2011-04-26T23:56:33.287 回答
0

应该可以使用 conntrack 记帐来测量每个连接的数据包和字节。然后应该使用 netlink 套接字查询信息。使用 getsockname 和 getpeername 获取有关您的套接字的信息,并使用此信息查找连接跟踪条目。

这需要足够新的内核、加载的 conntrack 模块和 libnetfilter_conntrack。

此外,在 /proc/net/nf_conntrack 中提供了相同的信息,但该文件不应被过于频繁地解析。

还有一个名为“conntrack”的工具,可以让您从命令行访问这些信息。

于 2011-04-26T11:45:44.027 回答
0

在 Linux 上,这对于 root 来说是相当微不足道的信息(只需创建一个匹配您的流量的 netfilter 链,您可以使用进程 id 匹配,例如,稍后读取与该链关联的计数器)。以有限的权限来做这件事很可能是不可能的。

不确定是否适用于 Windows。

于 2011-04-12T02:14:39.150 回答
-1

那么TCP是由MTU指定的固定数据报。如果你知道你的 MTU,你就可以计算出你必须传输多少数据包,并且 TCP 遵循标准模型进行确认。

这是一篇很好的文章,有助于计算数据传输的开销,其中包括以太网和堆栈的其他层的开销。

于 2010-02-03T16:11:59.080 回答
-1

如果这个 TCP 流是唯一通过你的接口的东西,你可以只查询接口统计信息(发送/接收的字节数)并自己测量时间(+做数学)。

于 2010-10-21T22:53:37.120 回答