Как измерить время отклика между сервером и клиентом, которые общаются по протоколу UDP? - PullRequest
2 голосов
/ 06 марта 2009

Целью теста является проверка формы времени отклика сети между двумя хостами (клиент и сервер). Ответ сети = время прохождения сигнала в обоих направлениях, необходимое для отправки пакета данных и получения его обратно. Я использую протокол UDP. Как я могу вычислить время отклика? Я мог бы просто вычесть TimeOfClientRequest - TimeOfClientResponseRectained. Но я не уверен, что это лучший подход. Я не могу сделать это только из кода, и я думаю, что загрузка ОС и компьютера может помешать процессу измерения, инициированному клиентом. Кстати, я использую Java.

Я бы хотел выслушать ваши идеи.

Ответы [ 7 ]

2 голосов
/ 12 марта 2009

Просто используйте ping - RTT (время приема-передачи) является одной из стандартных вещей, которые он измеряет. Если размер пакетов, которые вы отправляете, имеет значение, тогда ping также позволяет вам указать размер данных в каждом пакете.

Например, я только что отправил 10 пакетов с полезной нагрузкой 1024 байта на мой шлюз, отображающий только сводную статистику:

ping -c 10 -s 1024 -q 192.168.2.1

PING 192.168.2.1 (192.168.2.1) 1024 (1052) байта данных.

--- 192.168.2.1 пинг статистика ---

10 переданных пакетов, 10 принятых, потеря пакета 0%, время 9004 мс

rtt мин / ср / макс / мдев = 2,566 / 4,921 / 8,411 / 2,035 мс

Последняя строка, начинающаяся с rtt (время поездки туда и обратно), - это информация, которую вы, вероятно, ищете.

1 голос
/ 06 марта 2009

Если у вас есть доступ к коду, тогда да, просто измерьте время между отправкой запроса и получением ответа. Имейте в виду, что стандартный таймер в Java имеет разрешение только в миллисекундах.

В качестве альтернативы используйте Wireshark для захвата пакетов на проводе - это программное обеспечение также записывает временные метки для пакетов.

Очевидно, что в обоих случаях измеренное время зависит от того, как быстро другой конец отвечает на ваш первоначальный запрос.

Если вы действительно хотите измерить сеть задержку и самостоятельно контролировать удаленный конец, используйте что-то вроде службы echo 7/udp, которую по-прежнему поддерживают многие серверы UNIX (хотя обычно она отключена, чтобы предотвратить ее использование в DDoS-атаки).

1 голос
/ 06 марта 2009

Я думаю, что метод, который вы упоминаете, в порядке. Загрузка ОС и компьютера может помешать, но их влияние, вероятно, будет незначительным по сравнению со временем, которое требуется для отправки пакетов по сети.

Чтобы немного выровнять ситуацию, вы всегда можете отправить несколько пакетов назад и вперед и усреднить время ожидания.

0 голосов
/ 13 января 2016

Хотя ping является хорошим началом для измерения задержки, он использует протокол ICMP вместо UDP. Пакеты с разными протолами обычно имеют разные приоритеты на маршрутизаторах и т. Д.

Вы можете использовать netperf, чтобы измерить время приема-передачи UDP: http://www.netperf.org/netperf/training/Netperf.html#0.2.2Z141Z1.SUJSTF.9R2DBD.T

0 голосов
/ 18 декабря 2014

Помимо нескольких упомянутых ответов об использовании ICMP-пинга для измерения времени RTT, это хороший способ.

Я бы хотел предоставить другой способ измерения RTT через UDP, если вы можете контролировать как сервер, так и клиент. Основной поток следующим образом:

  1. Отправка UDP-пакета P1 с отметкой времени C1 с клиента на сервер
  2. Сервер помещает текущую метку времени S1 в пакет при получении P1.
  3. Обработка на стороне сервера
  4. Сервер помещает текущую метку времени S2 в пакет перед отправкой обратно клиенту.
  5. Клиент помещает текущую метку времени C2 в пакет при получении P1.

После этого мы можем вычислить RTT = (C2-C1) - (S2-S1).

Он может быть не точным в качестве ping ICMP и требует дополнительного контроля как на стороне клиента, так и на стороне сервера, но он управляем.

0 голосов
/ 14 марта 2009

Сначала используйте ping, но вы можете измерить RTT, отправив пакет, а другой конец отправит пакет обратно.

Важно, чтобы вы измеряли, когда ящики находятся под типичной нагрузкой, потому что это скажет вам RTT, который вы обычно можете получить.

Вы можете усреднить задержки для многих пакетов, миллионов или даже миллиардов, чтобы получить согласованное значение.

0 голосов
/ 06 марта 2009

было бы неплохо, если бы вы могли отправлять пакеты ICMP - я полагаю, потому что на них непосредственно отвечает сетевой уровень, ваш ответ не потеряет время в пользовательском режиме на сервере.

Отправка пакетов ICMP в Java, однако, представляется невозможной. Вы могли бы:

 boolean status = InetAddress.getByName(host).isReachable(timeOut)

это отправит пакет ICMP, но это не то, что вам нужно.

Однако, если вы включите ответчик на стороне сервера с более высоким приоритетом, вы уменьшите влияние нагрузки на сервер.

На самом деле загрузка сервера не играет роли, если она ниже 100% ЦП.

...