Нахождение, когда пакет UDP фактически передан на маршрутизаторе OpenWrt

393
Nisheeth Lahoti

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

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

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

0
Широковещательная / многоадресная передача по WiFi является особой в отношении шифрования и приоритета. Что бы вы ни делали, это, вероятно, не оптимально, учитывая WiFi. Daniel B 6 лет назад 0
Я считаю, что UDP разработан как протокол, где это было бы невозможно. Ramhound 6 лет назад 0

1 ответ на вопрос

0
pim

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

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.

Похожие вопросы