Может ли UDP ретранслировать потерянные данные? - PullRequest
3 голосов
/ 30 марта 2011

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

Ответы [ 4 ]

5 голосов
/ 30 марта 2011

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

В общем, вы захотите использовать надежный UDP, только если есть срочные причины(требуется очень низкая задержка и высокая скорость, например, для игры с подергиванием).В каждом «нормальном» случае простое использование TCP будет служить вам одинаково хорошо или лучше.
Также обратите внимание, что легко реализовать собственный стек поверх UDP, который работает на хуже , чем TCP.

См. enet для примера библиотеки, которая реализует надежность (и некоторые другие функции) поверх UDP (другие примеры - Raknet или HawkNL).

2 голосов
/ 31 марта 2011

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

2 голосов
/ 30 марта 2011

Конечно. Вы можете создать надежный протокол (например, TCP) поверх UDP.

Пример

Представьте, что вы создаете файловый сервер: * читать файл, используя блоки по 1024 байта * создать пакет UDP с полезной нагрузкой: 4 байта для «позиции» в файле, 4 байта для «длины» содержимого пакета.

Получатель теперь получает пакеты UDP. Если он получает следующие пакеты: * 0-1024: ДАННЫЕ * 1024-2048: ДАННЫЕ * 3072-4096: ДАННЫЕ

он понимает, что пакет пропал, и просит отправляющее приложение повторно отправить часть между 2048 и 3072.

Это очень простой пример, объясняющий код вашего приложения должен иметь дело с конструкцией пакета и интерпретацией полезной нагрузки. Не используйте его, он не учитывает крайние случаи (последний пакет, контрольные суммы для поврежденных пакетов, ...).

0 голосов
/ 26 октября 2018

Краткий ответ: Нет.

Длинный ответ: UDP не заботится о потере пакетов. Если пакет UDP приходит и имеет неправильную контрольную сумму, он просто отбрасывается. Ни отправитель пакета не проинформирован об этом, ни получатель не проинформирован. Это только отброшено, вот и все, что происходит. Также UDP-пакеты не нумеруются, поэтому, если вы отправляете четыре пакета и только три приходят к получателю, получатель не может знать, что раньше было четыре, а один отсутствует. И последнее, но не менее важное: пакеты не подтверждаются, поэтому отправитель никогда не узнает, отправил ли он пакет получателю или нет.

В отличие от этого, TCP разбивает данные на сегменты, каждый сегмент нумеруется, чтобы получатель мог знать, отсутствует ли сегмент. Также все сегменты должны быть подтверждены отправителю. Если отправитель не получает подтверждения для сегмента по истечении определенного периода времени, он будет считать, что сегмент был потерян, и отправит его снова.

Конечно, вы можете добавить собственный заголовок фрейма поверх каждого фрагмента данных, который вы отправили по UDP, таким образом код вашего приложения может нумеровать отправленные фрагменты, и вы можете реализовать в своем коде стратегию повторного подтверждения, но вопрос в том, : Будет ли это действительно лучше, чем то, что TCP уже предлагает бесплатно? Даже если это будет одинаково хорошо, сэкономьте время и просто используйте TCP. Многие люди уже думали, что могут добиться большего успеха, чем TCP, и обычно они понимают, что на самом деле они не могут. У TCP есть свои недостатки, но в целом он довольно хорош в своих действиях.

...