2013-02-25 4 views
14

Хорошо, поэтому я программирую для своего сетевого курса, и мне нужно реализовать проект на Java, используя UDP. Мы реализуем HTTP-сервер и клиент вместе с функцией «gremlin», которая развращает пакеты с определенной вероятностью. HTTP-сервер должен разбить большой файл на несколько сегментов на уровне приложения, который будет отправлен клиенту через UDP. Клиент должен собрать собранные сегменты на уровне приложения. Однако мне интересно, если UDP по определению ненадежен, почему мне приходится имитировать ненадежность?Каковы шансы потерять UDP-пакет?

Моя первая мысль заключается в том, что, возможно, это просто потому, что мой инструктор вычисляет в нашем случае, и клиент, и сервер будут работать на одном компьютере и что файл будет перенесен из одного процесса в другой на 100% надежно даже над UDP, поскольку он находится между двумя процессами на одном компьютере.

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

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

Большое значение для всех, кто может пролить свет на любой из этих вопросов для меня.

+1

Угадайте, что у вас никогда не было плохой интернет-связи; p UDP в основном используется в сценарии, где невозможно ответить получателю. Пример передачи данных по спутнику, радиоволнам и т. Д. – leppie

+0

Вместо «где невозможно ответить получателю» я бы сказал, что он используется в сценариях, где потеря пакета не имеет большого значения (много), например аудио/видео потоковая передача, видеоконференции и т. д. – Trap

+0

Говоря из опыта здесь, у меня есть проект, в котором две программы обмениваются данными через UDP, и время от времени происходит потеря пакетов, я не могу себе представить, почему они работают на одном компьютере и общаются через петлевой интерфейс. Так что да, хорошо, что вам нужно было реализовать функцию gremlin, потому что даже если надежность высока (у меня нет статистики, но я думаю выше 99,9% или даже выше по петле), потеря пакетов по-прежнему происходит , – soger

ответ

7

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

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

Здесь вы говорите также о полезности полезной нагрузки, а не только о потере пакетов.

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

Очевидно, что это менее вероятно по переходному кольцу, но это невозможно.

Я нашел несколько сообщений на форуме по теме here и here.

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

Этот вопрос, вероятно, нужно будет немного сузить. Существует несколько факторов как уровня приложения (размер и частота пакета), так и ограничения/трафик маршрутизаторов и коммутаторов по пути.

Я не мог найти никаких жестких цифр на этом, но он кажется довольно низким ... как sub 5%.

Возможно, вас заинтересует The Internet Traffic Report и, возможно, такие страницы, как this.

7

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

Потеря связи из-за ошибок в ссылке очень низкая, когда ссылки работают правильно. Менее 0,01% не является чем-то необычным.

Потеря пакетов из-за перегруженности, очевидно, зависит от того, насколько занята ссылка. Если есть запасная емкость по всему пути, это число будет 0%. Но по мере того как сеть становится занятой, это число будет увеличиваться. Когда управление потоком выполнено правильно, это число не будет очень высоким. Пару потерянных пакетов, как правило, достаточно, чтобы кто-то снизил скорость их передачи, чтобы остановить потеря пакетов из-за перегруженности.

Если потеря пакетов достигает 1%, что-то не так. Это может быть ошибкой в ​​том, как ваш алгоритм управления перегрузкой реагирует на потерю пакетов. Если он продолжает отправлять пакеты с одинаковой скоростью, когда сеть перегружена и потеряет пакеты, потеря пакетов может быть значительно выше, 99% потери пакетов возможны, если программное обеспечение плохо себя ведет. Но это зависит от типа используемых связей. Gigabit Ethernet использует противодавление для управления потоком, поэтому, если путь от источника к месту назначения является одним сегментом Gigabit Ethernet, приложение-отправитель может просто замедлиться и никогда не увидеть фактическую потерю пакетов.

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

  1. На каждом пакете поместите его с вероятностью 10%, и передает его с вероятностью 90%
  2. передавать до 100 пакетов в секунду или до 100 КБ в секунду, и падение остального, если приложение отправит больше.
+3

Источник для чисел здесь будет полезен. –

Смежные вопросы