Поиск и устранение неисправностей при приеме UDP

UDP (User Datagram Protocol) - протокол обмена данными в локальных сетях или Internet, с минимальными задержками и минимальной стабильностью.

Программное обеспечение для анализа проблемы

Анализ UDP с помощью Astra MPEG-TS Analyzer

С помощью Astra можно анализировать любой поддерживаемый источник. Просто запустите в консоли следующую команду:

astra --analyze "udp://[email protected]:1234"

Для остановки анализатора Astra нажмите Ctrl+C. Подробнее о Astra MPEG-TS Analyzer

Анализ UDP с помощью Tcpdump

Tcpdump является распространенным инструментом для проверки сетевого трафика. Например, команда для проверки приема UDP-мультикаста в группу 239.255.1.1 на интерфейсе eth0:

tcpdump -pnni eth0 udp and host 239.255.1.1

Если вы не знаете фактического интерфейса, то можете найти его с помощью команды:

ip route get 239.255.1.1

Вывод tcpdump выглядит как множество строк с информацией об источнике пакетов, их назначении и длине. Например:

21:38:42.143839 IP 192.168.88.100.33610 > 239.255.1.1.1234: UDP, length 1316
21:38:42.143868 IP 192.168.88.100.33610 > 239.255.1.1.1234: UDP, length 1316

Для остановки tcpdump нажмите Ctrl+C

UDP Не работает вообще

Не работает означает нулевой битрейт на выходе Astra MPEG-TS Analyzer. Например:

Jan 27 09:00:00: INFO: Bitrate: 0 Kbit/s
Jan 27 09:00:01: INFO: Bitrate: 0 Kbit/s

Отсутствие UDP-пакетов на интерфейсе

В первую очередь проверьте трафик на сетевом интерфейсе с помощью утилиты tcpdump. Если информация о входящих пакетах отсутствует, то необходимо проверить конфигурацию сети или конфигурацию источника.

  1. Неверная конфигурация маршрутов. Если у вас несколько интерфейсов, проверьте, правильно ли настроен маршрут к многоадресной группе или определите имя интерфейса в udp-адресе.
  2. Проблемы с подключением. Проверьте, что сервер подключен к интерфейсу ethernet или vlan.
  3. Несовместимая версия IGMP. Например, ваш сервер использует IGMPv3, а сетевое оборудование поддерживает только IGMPv2: Настроить версию IGMP

Программное обеспечение не может получить UDP-пакеты

Если tcpdump показывает информацию о UDP-пакетах, то возможны следующие проблемы:

  1. UDP отброшен правилами брандмауэра. Проверьте конфигурацию брандмауэра
  2. Если сервер имеет многопользовательские интерфейсы, то добавьте маршрут к многоадресной группе или настройте RP-фильтр: RP-фильтр и многоадресное получение в Linux

Слишком много ошибок при получении UDP

Ошибки CC (Continuity Counter) указывают на нарушение целостности пакетов. Ошибка может быть вызвана потерей или избытком пакетов. Пример вывода с ошибками CC в анализаторе Astra MPEG-TS Analyzer:

Jan 27 09:00:00: INFO: Bitrate: 13259 Kbit/s
Jan 27 09:00:00: ERROR: CC: PID:18=3 PID:20=3 PID:256=24
Jan 27 09:00:01: INFO: Bitrate: 13261 Kbit/s
Jan 27 09:00:01: ERROR: CC: PID:18=5 PID:20=2

Существует две распространенные проблемы: потеря пакетов или их превышение.

Избыток пакетов

Избыточные пакеты выглядят в выводе tcpdump как пакеты от разных источников к одному и тому же адресату:

21:38:42.143839 IP 192.168.88.100.33610 > 239.255.1.1.1234: UDP, length 1316
21:38:42.143868 IP 192.168.88.100.24081 > 239.255.1.1.1234: UDP, length 1316

Причин может быть две:

  • Если адрес источника один и тот же, но порты разные (в примере это 33610 и 24081), то сервер-источник посылает один и тот же канал дважды
  • Если адреса источников различны, то более одного сервера посылают пакеты в одну группу

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

Потеря пакетов

В первую очередь необходимо проверить потери и ошибки на сетевом интерфейсе:

ip -s link show eth0

Необходимо посмотреть на RX Errors. Некоторые сетевые карты предоставляют более подробную информацию о характере потерь:

ethtool -S eth1

Потери могут быть не только на сетевых картах вашего сервера. Они могут быть и в порту сетевого оборудования. Информацию о том, как это увидеть, можно найти в документации производителя сетевого оборудования. Где eth0 - имя интерфейса. После RX-ряда будет идти ряд с номерами. Третье число - это ошибки приема UDP.