Я использую маршрутизатор Linksys WRT 1900 ACS с OpenWrt 15.05.1. Я запускаю на нем программу C, которая посылает определенные пакеты WiFi UDP Multicast через равные промежутки времени (по 16 мс), а затем печатает системное время на стандартный вывод. Я четко вижу неровности на приемном конце, но они не отображаются в напечатанных значениях времени.

Это наводит меня на мысль, что некоторый уровень буферизации / ожидания происходит даже после возврата системного вызова sendto(). Как я могу получить время, в которое пакет фактически испускается?

Примечание. Неравномерности одинаковы для всех получателей в этой многоадресной сети, поэтому проблема не на стороне получателя.

1 ответ1

0

К сожалению, вы не можете.

TL; DR

Функция sendto возвращается, как только пакет был отправлен в стек IP. IP-стек ядра обработает его и попытается отправить пакет через интерфейс WiFi.

В этом и заключается проблема: задержка передачи по WiFi большая (по сравнению с проводным Ethernet) и нерегулярная. Вот пример того, какую задержку вы должны ожидать:

Wifi VS Проводной журнал времени пинга

Этот логарифмический график показывает задержку пинга между моим сервером и маршрутизатором, а также между моим сервером и беспроводным клиентом. Поскольку ping является двунаправленным, однонаправленная задержка, вероятно, составляет примерно половину от этого.

Проводная связь показывает время пинга около 300 мкс, в то время как беспроводная связь показывает в среднем 7 мс (в 23 раза больше задержки).

Теперь почти тот же график, на этот раз линейный, чтобы выделить неровности:

Wifi VS Проводной пинг, время линейное

Время Wi-Fi варьируется от 6 до 45 мс.

Решения

Поскольку функция sendto возвращается раньше, чем вы ожидаете, вы не можете точно определить, в какое время пакеты отправляются. Если вас действительно интересует время отправки пакета, вы, вероятно, можете оценить его, подождав ответа от клиента и сократив время вдвое.

Но, как вы уже поняли, все WiFi-клиенты получают пакет одновременно, так как это многоадресная рассылка.

Итак, настоящий вопрос здесь: чего вы пытаетесь достичь?

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

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

И если вы хотите добиться высокой производительности в режиме реального времени , вам, вероятно, стоит просто забыть о Wi-Fi.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .