Как рассчитать время приема-передачи в реализации утилиты Ping в UnetStack - PullRequest
2 голосов
/ 05 октября 2019

Я разработал утилиту ping, аналогичную примеру ping, доступному в UnetStack1.3 (/samples/ping), для проверки связи с удаленным узлом по многопереходной ссылке, но не могу рассчитать время кругового обхода (RTT) при передачеping-пакет с использованием агента маршрутизации со статической информацией о маршруте, добавленной в таблицу маршрутизации с использованием RouteDiscoveryNtf, поскольку в уведомлениях верхнего уровня отсутствует информация о синхронизации (DatagramNtf или DatagramDeliveryNtf или DatagramFailureNtf).

Расчет времени прохождения туда и обратно представляет собой разницу rxtime и txtime, доступную с TxFrameNtf и RxFrameNtf, как это реализовано в clousure (fshrc.groovy) в примере проверки связи.

Я также попытался проанализировать утилиту ping, реализованную в UnetStack3, но не смог разобраться. Пожалуйста, дайте мне знать, как рассчитывается RTT .

1 Ответ

1 голос
/ 09 октября 2019

Вот упрощенная версия реализации команды ping в UnetStack3:

  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"
  }
...