如何使用 C 对 TCP 和 UDP 进行基准测试?

Posted

技术标签:

【中文标题】如何使用 C 对 TCP 和 UDP 进行基准测试?【英文标题】:How can I benchmark TCP and UDP using C? 【发布时间】:2011-01-21 21:08:09 【问题描述】:

我想使用 C 套接字为 TCP 和 UDP 测量 消息延迟吞吐量。我正在编写一个运行在不同服务器上的 client.c 和 server.c(问题 1:我必须这样做吗?)来完成此任务。我必须使用不同的数据包大小和多次试验进行多次测量并绘制我的结果。

对于消息延迟: 发送一个不同大小的数据包并测量往返时间并除以 2 以获得延迟。 问题 2:我发送一个大小为 x 的数据包,然后从 server.c 将数据包发回。所以在客户端我启动计时器,发送数据包,然后等到我收到数据包然后停止计时器。 timer/2 是我的延迟? 衡量这个的步骤是什么?

对于吞吐量: 问题 3:我将如何衡量两者的吞吐量? 执行此操作的步骤是什么?

我是 C 中 Unix 套接字编程的初学者,所以详细信息会很有帮助,重点是基准方面。

编辑:我不能使用已经存在的工具。我需要自己写。

谢谢!

【问题讨论】:

您好!在一个程序中测量 TCP、UDP 和 SCTP 怎么样? 【参考方案1】:

问题 1:您可能可以通过使用 Google 找到现有的测试用例。但是,如果您需要处理特殊情况,那么编写自己的代码以便将其考虑在内可能是有意义的。

问题2:也许官方对网络运营的“延迟”有一个定义,但我认为真正重要的是往返成本。所以我不会除以 2。总往返成本是用户(客户)的体验。这就是他们看到的延迟。

问题 3:我认为您使用不同数据包大小的计划有利于测量吞吐量。有与此相关的another SO question。我发布了该问题的答案,并提供了一些我自己测试的 UDP 与 TCP 的数字。这些可能作为“理智”检查点感兴趣。

啊 - 我忘了我要提到的一件事。如果您使用 UDP 编写一个非常简单的测试用例,这可能有点不切实际。如果直接使用 UDP,则需要添加自己的错误处理、数据包验证等。这会增加成本。最终,我们发现 UDP 在大多数情况下对我们来说更快,因为我们已经根据自己的用途对其进行了定制。但它肯定需要更多的代码才能让一切正常运行。

【讨论】:

对于问题 2:我该怎么做?我的 Server.c 只会抓取数据包并重新发送它来自哪里?我就是这样测试往返时间的吗? @NewSocketUser:是的——我会这样做。例如,对于 UDP,recvfrom() 调用(如果我没记错的话)会返回数据以及发送方的网络地址。然后,您可以将其发送回去。但是 UDP 比较棘手,因为有一个可以发送的最大数据包大小。所以你基本上需要为每个发送的数据包做一个 recvfrom 调用(所以你可能需要在第一个数据包中发送数据长度)。 所以往返时间是基于每个数据包完成的,吞吐量是基于每个消息完成的,最多可能需要多个数据包吗? 这可能取决于应用程序以及您如何定义它。我认为大多数涉及大量数据的网络对话主要是向一个方向发送大量数据(例如,流式传输视频、将巨大的图像写入数据库等)。因此,您可能希望通过向一个方向发送大量数据来衡量吞吐量……这只是基于我熟悉的使用场景的我的看法。【参考方案2】:

已经存在一个名为ttcp 的程序,用于测试 TCP 和 UDP 性能:

描述

Ttcp 乘以两个之间的数据传输和接收 使用 UDP 或 TCP 协议的系统。

它不计算延迟,但您可以查看该程序的源代码以了解它如何进行其他计算。如果您不想自己编写两者,您也可以将其用作客户端或服务器。

更新:其他类似的 TCP 测试程序

nuttcp tcping echoping hping3 iperf

以及相关程序

tcpdump tcpflow tcpick tcpjunk tcpreplay tcptraceroute tcptrack netcat

【讨论】:

所以你是说我可以使用它的源代码作为起点? 即使您从头开始编写源代码,您仍然可以使用ftp.sgi.com/sgi/src/ttcp/ttcp.c 作为参考来查看事情是如何完成的。【参考方案3】:

您可能想查看已经存在的用于此类事物的工具。也许D-ITG 或iperf 结合tcpdumpwireshark?除非目的是进一步了解套接字编程本身。

【讨论】:

【参考方案4】:

您可能还对this related question:"How to measure network performance (how to benchmark network protocol)" 感兴趣。

【讨论】:

以上是关于如何使用 C 对 TCP 和 UDP 进行基准测试?的主要内容,如果未能解决你的问题,请参考以下文章

SPDY Web 服务器基准测试工具

如何对C ++代码的性能进行基准测试? [关闭]

如何对你的Python代码进行基准测试

如何测量网络性能(如何对网络协议进行基准测试)

Ceph:网络性能基线测试

如何对 Matlab 流程进行基准测试?