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

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

Это нормально? Я думал, что, поскольку ни одна датаграмма не должна проходить через какой-либо маршрутизатор или любое сетевое устройство, этого не должно происходить.


person Bilthon    schedule 28.03.2010    source источник
comment
Хороший вопрос, меня также интересуют возможные причины этого.   -  person isti_spl    schedule 20.11.2013


Ответы (4)


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

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

person Jack    schedule 28.03.2010

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

person Thomas M. DuBuisson    schedule 28.03.2010

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

Если они вам нужны последовательно, попробуйте TCP.

person Jack    schedule 28.03.2010

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

person user207421    schedule 29.03.2010
comment
Неа. Вероятно, это связано с многопроцессорной обработкой пакетов. - person Zan Lynx; 21.06.2010
comment
Вау, только что заметил этот комментарий. Вы не отметили мое имя, так что никакого уведомления. В любом случае: операционные системы, которые ускоряют обработку пакетов, распределяя работу между несколькими ядрами, могли обрабатывать пакеты UDP на разных ядрах и помещать их в очередь чтения приложения не по порядку. - person Zan Lynx; 05.01.2011
comment
Еще пища для размышлений: у TCP может быть та же проблема, о которой говорит Зан. Если более чем один поток обрабатывает отправку данных, данные могут передаваться в другом порядке, чем вы написали. - person William Morrison; 18.03.2014
comment
Комментарий Зана на самом деле лучше любого из ответов; это единственное, что здесь дает возможное объяснение вопроса: ПОЧЕМУ это происходило. - person Dax Fohl; 31.10.2014