почему эта Java-программа вызывает потерю пакетов UDP? - PullRequest
0 голосов
/ 10 октября 2011

Я провожу эксперименты на моей машине A и B, оба с Ubuntu Server 11.04 установлены. A и B подключены к одному и тому же коммутатору 1000M / bps.

A является отправителем:

время (всего <= 10000) send_udp_datagramPacket (новый байт [100]) в B </p>

B - получатель:

в то время (правда) получить ()

Но, наконец, я получил менее 10 000 (около 9960) в B. Почему это происходит? Куда делись потерянные пакеты? Не были ли они фактически отправлены на провод к коммутатору? Или выключатель их потерял? Или они действительно добрались до Б, но ОС Б отказалась от них? Или они достигли Java, но Java выбросила их из-за полного буфера?

Любой ответ будет оценен.

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Помните, UDP не обеспечивает надежную связь, он предназначен для ситуаций, в которых потеря данных допустима (например, потоковое мультимедиа). Скорее всего, это переполнение буфера (я полагаю, не полагайтесь на это), но дело в том, что если эта потеря данных неприемлема, используйте вместо нее TCP.

Если это только для экспериментов, попробуйте добавить задержку (Thread.sleep()) в цикл и увеличивать ее до тех пор, пока не получите максимальное количество полученных пакетов.

EDIT: Как упомянуто в комментарии, sleep () НЕ является исправлением и в конечном итоге потеряет пакеты ... это всего лишь UDP.

2 голосов
/ 10 октября 2011

Но, наконец, я получил менее 10000 (около 9960) в B. Почему это происходит?

UDP - протокол с потерями. Даже если вы получили 10000 в этом тесте, вам все равно придется кодировать вероятность того, что некоторые пакеты будут потеряны. Они также могут быть фрагментированы (если их размер превышает 532 байта) и / или могут быть выведены из строя.

Куда делся потерянный пакет?

Они были сброшены.

Не были ли они фактически отправлены на провод к коммутатору?

Их можно сбросить где угодно. Я не верю, что в Java есть какая-либо логика для отбрасывания пакетов (но это не гарантируется во всех реализациях). Это может быть сброшено ОС, сетевым адаптером, поврежденным на проводе, сброшенным коммутатором.

Или коммутатор их потерял?

Это будет сделано, если пакет каким-то образом был поврежден или заполнен буфер.

Или они действительно добрались до Б, но ОС Б отказалась от них?

Да, или операционная система А. могла бы их удалить.

Или они достигли Java, но Java выбросила их из-за полного буфера?

У Java нет собственных буферов. Он использует базовые буферы от ОС. Но пакеты могут быть потеряны на этом этапе.

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

1 голос
/ 10 октября 2011

Почему эта Java-программа вызывает потерю пакетов UDP?

Вопрос плохо сформулирован. Ни Java, ни ваша программа не вызывают потерю пакетов UDP. UDP вызывает потерю пакетов UDP. Нет никаких гарантий, что какой-либо UDP-пакет когда-либо прибудет. См. RFC 768 .

...