2013-05-22 3 views
0

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

По сравнению с гарантией TCP, является ли решение выше для UDP-эквивалента?

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

ответ

1

Единственным недостатком является то, что вы теряете несколько байтов пространства данных.

Однако сам по себе это не решение. Вы должны добавить ACK-сообщения в свой протокол, чтобы отправитель знал, что у вас есть и не получил; вам нужно буферизовать отправленные датаграммы в отправителе до тех пор, пока они не будут ACK'd, если вам нужно повторно передать; и вам нужно либо выгрузить из датаграммы последовательности или выбросить их, чтобы вы могли правильно восстановить последовательность. Зайдя так далеко, было бы разумно, чтобы отправитель реализовал некоторую форму управления потоком или шага, если он требует много повторной передачи.

Это хороший способ реализации TCP. Большинство людей сдаются в этот момент и используют TCP.

+0

UDP может предложить преимущества по сравнению с TCP, если сообщения используются для сообщения о текущем состоянии чего-либо, а получатель не заинтересован ни в чем, кроме текущего состояния. Предположим, что Боб отправляет сообщения «Дверь закрыт» или «дверь открыта», когда дверь открывается или закрывается, и будет периодически ретранслировать состояние двери, если она не получит подходящую «Я слышал, дверь закрыта» или «Я слышал, что дверь открыта».Если вскоре после того, как Боб отправит «Дверь закрыта», дверь откроется, Боб отправит «Дверь открыта» и не заботится о подтверждении того, что предыдущее сообщение «дверь закрыто». – supercat

+0

Проблема в том, что если «Дверь закрыта» и «дверь открыта», сообщения меняются местами, сообщение «дверь закрыто» может быть последним, которое слышит Боб. Джо мог бы успешно отправить сообщение «Я слышал, что дверь открыта» в ответ на сообщение «открыто», но его сообщение «Я слышал, что дверь закрыта» отбрасывается. В этом случае Джо подумает, что дверь закрыта, но Боб подумает, что Джо подумал, что это открыто. К сожалению. Добавление порядковых номеров позволит избежать этого. Джо не пришлось бы обрабатывать какие-либо пакеты, полученные без последовательности - просто убедитесь, что он не обрабатывает их. – supercat

0

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

Если вам нужен TCP, вы должны его использовать. UDP предназначен для пакетов, где вам все равно, если они потерялись (например, VOIP, Gameserver и т. Д.).

1

Использование UDP в этом модуле делает приложение необходимым для обработки и восстановления пакетов. Это создает накладные расходы в прикладном уровне сети. TCP, вероятно, более эффективен при обработке этого в транспортном уровне.

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

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

https://en.wikipedia.org/wiki/User_Datagram_Protocol

1

Это звучит, как вы хотите форму частичной надежности, TCP и между ними UDP.

Опция заключается в использовании SCTP-over-UDP (SCTP, портативное пользовательское пространство & ядро ​​source). SCTP позволяет вам устанавливать порядок ненадежных потоков, подобных UDP, а также для частично надежных потоков (ограниченное время или количество повторных передач) .

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