【问题标题】:Timing sending and receiving the same packet定时发送和接收同一个数据包
【发布时间】:2011-11-22 02:44:37
【问题描述】:

我想通过发送具有与源 IP 相同的目标 IP 的数据包来计算系统延迟的速度。这是相对简单的做法吗?

您将如何自定义构建数据包?

设置这两个 IP 地址能达到我想要的效果吗?

最好的计时方法是什么?

任何低/高级别的提示/想法将不胜感激。我打算在 Unix 上使用带有 boost 库和 libpcap 的 C/C++。

编辑:我应该补充一点,我将在路由器后面的家庭网络上执行此操作。如果我要使用 192.168.2.1(我系统的本地 IP)作为源地址和目标地址,我认为数据包会到达路由器并直接返回。

【问题讨论】:

  • 它可能根本不会击中路由器。网络驱动程序可能会注意到它们是相同的并复制到其中,因此甚至无法物理到达网络。

标签: c++ c unix boost


【解决方案1】:

您可以尝试 ping 到您自己的 IP。这将产生 ICMP 数据包。有些库还允许您从应用程序中执行相同操作。

如果您想自己创建数据包,可以使用套接字 API。请记住,您可以发送相同的源 IP 地址和目标 IP 地址,但端口号需要不同。

对于您需要的时间,可以使用gettimeofday 函数。

编辑: 您可以从您的 C++ 程序 ping。请参阅:http://verplant.org/liboping/ 或查看其他论坛。我强调 ping 的原因是因为它直接从网络堆栈返回。另一方面,如果您发送一个 UDP 数据包,期望应用程序返回并回显,那么侦听服务器上数据包的处理时间就会增加。

如果您 p​​ing 到本地机器 ip(甚至是 lo),它会返回而不去切换或下一跳路由器。即使您移除 eth 电缆或 wifi,它也会响应。

您正在尝试做的是使用 NTP 协议在 NTP 守护进程中实现。

【讨论】:

  • 所以我从我的 C++ 程序“ping”? ICMP 数据包将保留在网络堆栈上还是去路由器并返回?
  • 将我的回答附加到您的查询中。
  • 谢谢迪潘。出于好奇,您知道我上面对 Joachim 的最后评论的答案吗?
【解决方案2】:

您不需要为此定制包。只需创建一个连接到与服务器相同的 IP 地址的套接字,然后开始发送包。请注意,这些包永远不会离开网络堆栈,因此您将测量的基本上是系统在用户空间和内核空间之间复制数据的速度。

对于计时,您可以使用clock 函数,它可能是最广泛用于此类事情的一个。

【讨论】:

  • 嗨 Joachim,您是说我唯一不会测量的是数据包在介质上的实际物理传输吗?如果是这样,那不是什么大问题。
  • 最后一个问题:我问这个的原因是因为我想了解更多关于高频交易的知识。从寻找额外速度的角度来看,Linux 网络堆栈是否已经进行了高度优化。换句话说,你认为这是 linux HF 开发者重写的部分之一吗?或者,像 TCP 一样,这是否已经发展到尽可能高效?
  • 我没有资格这么说,但从任何应用程序的角度来看,我相信 Linux 的网络堆栈是最有效的。大部分性能和更重要的可扩展性将通过在应用层有效处理响应(设计最容易处理消息)和通过有效路由创建更多资源(服务器)来实现。
  • 感谢 Dipan,这很好,因为我不太确定我是否会陷入重写 Linux 的困境!
猜你喜欢
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2012-10-03
  • 2012-05-20
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多