如何在UnetStack中的Ping实用程序实现中计算往返时间

时间:2019-10-05 10:46:11

标签: unetstack

我已经开发了类似于UnetStack1.3(/samples/ping中可用的ping示例的ping实用程序,用于通过多跳链接ping远程节点,但是当出现以下情况时无法计算往返时间(RTT):我使用路由代理传输ping数据包,并使用RouteDiscoveryNtf将静态路由信息添加到路由表中,因为上层通知(DatagramNtfDatagramDeliveryNtfDatagramFailureNtf中没有可用的定时信息)。

往返时间的计算是rxtimetxtimeTxFrameNtfRxFrameNtf可用的差值,如ping中的Clousure(fshrc.groovy)所实现的例子。

我还尝试分析了UnetStack3中实现的ping实用程序,但无法进行显示。请让我知道RTT的计算方式

1 个答案:

答案 0 :(得分:1)

这是UnetStack3中ping命令实现的简化版本:

  def ping(int n, int m = 3, long timeout = 30000) {
    println "PING $n"
    AgentID router = agentForService(Services.ROUTING)
    int p = 0
    m.times { count ->
      def t0 = currentTimeMillis()
      router << new DatagramReq(to: n, reliability: true)
      def ntf = receive({
        it instanceof DatagramDeliveryNtf || it instanceof DatagramFailureNtf
      }, timeout)
      def t = currentTimeMillis()-t0
      if (ntf == null || ntf instanceof DatagramFailureNtf) {
        println "Request timeout for seq $count"
      } else {
        p++
        println "Response from $n: seq=$count rthops=2 time=$t ms"
      }
      delay(5000)
    }
    println "$m packets transmitted, $p packets received, ${Math.round(100*(m-p)/m)}% packet loss"
  }