Как определить, отбрасывает ли сеть UDP-пакеты?


8

У меня есть приложение для потокового видео, которое отлично работает в моем офисе, но с треском проваливается на месте клиента. Симптом заключается в том, что каждые пару секунд я прекращаю прием пакетов UDP на 2 секунды, затем поток возобновляется, как будто ничего не происходит.

Я запустил http://www.pingtest.net/ на месте клиента, и он вернулся отлично. Нет отброшенных пакетов и низкая задержка. Единственное различие, которое я заметил между нашими двумя местоположениями, состоит в том, что ping google.caтайм-аут в их местоположении, но работает в моем.

Как проверить, блокирует ли сеть, в которой я нахожусь, входящие пакеты UDP? Есть ли способ для меня, чтобы изолировать, кто отбрасывает пакеты?


Похоже, проблема с брандмауэром для меня. У вас есть программные или аппаратные брандмауэры?
Питто

Вы не можете спросить клиента, на что настроена его сетевая конфигурация?
Ramhound

@ Ramhound, в идеале нет. Я не хочу копаться в настройках маршрутизатора потенциального клиента каждый раз, когда хочу продемонстрировать свой продукт :)
Gili

2
Ребята, объясните, пожалуйста, ваши отрицательные голоса, иначе я не смогу ответить.
Гили

Ответы:


4

Вы можете попытаться установить соединение UDP с netcat.

На машине A вне сети потребителя запустите:

nc -u -l -p 1234            # if using netcat-traditional
nc -u -l 1234               # if using netcat-openbsd (as pointed out by @JamesHaigh)

Обратите внимание, -uкоторый инструктирует netcat использовать UDP. (Также имейте в netcatвиду , что существуют разные версии , для которых параметр будет нужен -pили нет; приведены варианты для двух наиболее распространенных (?), Оба включены в Debian.)

На потребительском месте: nc -u [addr of machine A] 1234.

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


Ваша удаленная команда не работает для меня. На man-странице написано -l« It is an error to use this option in conjunction with the -p, -s, or -z options.», поэтому я исправил команду на ту, которую протестировал на работу. Кроме того, я изменил «ip» на «addr», потому что имена хостов также могут использоваться и в некотором смысле являются «адресом».
Джеймс Хай

@JamesHaigh: я согласен с тобой в отношении точки addrпротив ip. Но теперь с вашей командой я получаю сообщение об ошибке: listen needs -p arg(Я также проверил мои команды, приведенные в ответе ;)). Существуют различные nc, если вы дадите более подробную информацию, такую ​​как nc version и / или ваш дистрибутив, я добавлю примечание к своему ответу.
mpy

Ах да, обидно, что они не совместимы друг с другом! :-( Хорошо, значит, моя удаленная машина - Debian. По умолчанию ncэто символическая ссылка, /bin/nc -> /etc/alternatives/nc -> /bin/nc.openbsdпредоставляемая пакетом Debian netcat-openbsd. Моя локальная машина с Ubuntu также имеет nc.openbsdпо умолчанию. Ни один из них не примет -l -p. Я также установил ncatна обе машины из nmapпакета Ubuntu / Debian. Вкл. старая машина Debian ncatотказывается -l -p, но ncatв Ubuntu принимает оба пути, хотя версия Debian должна быть древней, поскольку у нее досадно нет --sctpвозможности: - /
James Haigh

Ps какой у тебя дистрибутив и ncвариант? Я заметил, что есть также и netcat-traditionalпакет, но я не пробовал.
Джеймс Хей

@JamesHaigh: я действительно использую netcat-traditional(v 1.10-38), так как он поставляется с Debian. Спасибо за подсказку, теперь я включил оба варианта в ответ.
mpy

13

на стороне сервера установите сервер UPD с

iperf -s -u

на стороне клиента проверьте соединение UDP с

iperf -u -c <IP Address of Server>

1
Это настоящий ответ. Это требует наличия доступа к серверу на другой стороне. Но это дает вам прямую обратную связь потери пакета. И вы также можете использовать его для проверки пропускной способности TCP.
DragonFax

0

Эти netcatкоманды в ответе МРЕТ являются полезными для диагностических целей, но я дополняющая этот ответ с другим подходом к вашей основной проблеме.

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

И SCTP, и TCP имеют контроль над перегрузкой и прекрасно работают с QoS, но SCTP имеет дополнительное преимущество по сравнению с TCP, которое было разработано для потоковых приложений в реальном времени, что делает его хорошей заменой как для TCP, так и для UDP. По сути, SCTP является лучшим из двух наиболее распространенных транспортных протоколов.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.