如何在不嗅探的情况下测量TCP / IP开销?

时间:2010-02-03 16:03:57

标签: performance networking tcp measurement

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

我能想到的唯一解决方案是实际嗅探界面,但我想认为堆栈已经可以为我收集这些统计数据了。

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

7 个答案:

答案 0 :(得分: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来解析此文件。

如果您想在运行时执行此操作,可以创建"real-time" ETW session来处理事件进入时。

如果您是ETW的新手,请参阅我使用的a helpful article on MSDN

答案 1 :(得分:1)

不能代表Windows,但Linux内核(从2.6.37开始)并未收集您正在寻找的统计信息。每插槽统计信息必须位于 struct sock 或其后代中,我没有看到任何发送/接收计数器:

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

答案 2 :(得分:0)

在Linux上,这是root获取的相当简单的信息(只需创建一个与您的流量匹配的netfilter链,您可以使用进程ID匹配,例如,稍后读取与链相关联的计数器)。使用有限的权限执行它可能是不可能的。

对Windows不确定。

答案 3 :(得分:0)

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

这需要最近的内核,加载的conntrack模块和libnetfilter_conntrack。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

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

Here is a good article有助于找出数据传输的开销,其中包括以太网和堆栈其他层的开销。

答案 6 :(得分:-1)

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