2010-09-19 3 views
7

im с использованием 2 компьютеров с приложением для отправки и получения дейтаграмм udp.
Нет управления потоком (ICMP отключен)
Часто, когда я отправляю файл в виде udp-дейтаграмм через приложение, я получаю 2 пакета, изменяя их порядок, а потому - пакетный лот.обеспечение порядка пакетов в UDP

есть ли способ убедиться, что winsock и send() отправят пакеты так же, как они туда попали?
или это ОС? ive отключен и вид брандмауэра, и между компьютерами не подключен аппаратный коммутатор (они напрямую подключены). Необходима настройка сетевого устройства?
спасибо

ответ

10

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

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

Если вы ограничены использованием UDP, вам придется разработать метод идентификации пакетов из последовательности и повторного их соответствия.

+0

вы можете объяснить, что это [UDP для заказов] (http://www.nasdaqtrader.com/ content/technicalsupport/Specifications/TradingProducts/UFO.pdf)? – Sajuuk

+0

@Sajuuk. Похож на документ в формате pdf. Если у вас есть вопрос, лучше спросить новый вопрос. – PaulG

7

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

+0

из-за причин, по которым я не могу описать их только для udp. редкий пакетный слот один раз, а затем он доступен.это просто, что 1 из 3 файлов получает убыток. мне просто нужно найти способ отправки отправителем пакетов в правильном порядке, остальное не имеет значения для меня. спасибо – Davidallencoe

+1

Это не столько вопрос отправителя, отправляющего пакеты в правильном порядке, как для получателя, чтобы собрать их в правильном порядке. Как я уже сказал, добавьте маркеры последовательности на определенном уровне. – crazyscot

+0

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

4
есть ли способ убедиться, что winsock и send() отправят пакеты так же, как они попали туда?

Это называется TCP.

В качестве альтернативы можно попробовать надежный протокол UDP, такой как UDT. Я предполагаю, что вы можете быть на небольшой встроенной платформе, поэтому вам нужен более компактный протокол, например, Bell Lab's RUDP.

0

есть нет контроля потока (ICMP отключен)

Вы можете реализовать свой собственный контроль потока с помощью UDP:

  • Отправить один или несколько UDP пакетов
  • Дождитесь подтверждения (отправляется как другие UDP-пакеты от получателя к отправителю)
  • Повторите, как указано выше

Для получения дополнительной информации см. Sliding window protocol.

[Это было бы в дополнение к, имеющий порядковый номер в пакетах, которые вы посылаете.]