Существует ли протокол на основе UDP, который обеспечивает более надежную отправку больших элементов данных без надежности дейтаграмм? - PullRequest
2 голосов
/ 21 октября 2011

На одном конце у вас есть TCP, который гарантирует, что пакеты прибывают и что они приходят в порядке. Он также предназначен для обычного интернета с алгоритмами управления перегрузкой, которые «хорошо играют» в трафике. На другом конце спектра у вас есть UDP, который не гарантирует время прибытия и порядок пакетов, а также позволяет отправлять большие данные получателю. Где-то посередине у вас есть надежные программы на основе UDP, такие как UDT , которые предлагают индивидуальные алгоритмы и надежность управления перегрузкой, но с большей скоростью и гибкостью.

Однако мне нужна возможность отправлять большие порции данных по UDP (больше, чем размер UDP-датаграммы 64 КБ), но без учета надежности каждой отдельной дейтаграммы. Идея состоит в том, что большие данные разбиваются на дейтаграммы определенного размера (<= 64 000 байтов), вероятно, с некоторыми данными заголовка, прикрепленными спереди и отправленными по сети. На принимающей стороне эти дейтаграммы считываются и сохраняются. Если датаграмма не поступает, все датаграммы, связанные с этой передачей, просто выбрасываются клиентом. </p>

Большинство реализаций "надежного UDP" пытаются поддерживать надежность каждой дейтаграммы, но меня интересует только целое, и если я не получаю целое, это не имеет значения - отбросьте все это и ждать следующего. Мне придется копать глубже, но это может быть возможно с помощью пользовательских алгоритмов контроля заторов в UDT. Однако есть ли протоколы с таким подходом?

1 Ответ

0 голосов
/ 21 октября 2011

Вы можете попробовать ENet, хотя он не предназначен специально для того, что вы пытаетесь сделать, он имеет концепцию «фрагментированных блоков данных», при которой вы отправляете данные, размер которых превышает его MTU, и он отправляет в виде последовательности дейтаграмм своего MTU. с деталями заголовка, которые связывают одну часть последовательности с остальной. Версия, которую я использую, поддерживает только «надежные» фрагменты (т. Е. Слой надежности ENet будет активирован для повторной отправки пропущенных фрагментов), но я, кажется, помню, как видел обсуждение в списке рассылки о ненадежных фрагментах, которые, скорее всего, будут именно тем, что вы хотите; т.е. доставить всю полезную нагрузку, если она все прибудет, и выбросить биты, если она не поступит.

См. http://enet.bespin.org/

В качестве альтернативы взгляните на ответы на этот вопрос: Что вы используете, когда вам нужен надежный UDP?

...