UDP передача пакетов в правильном порядке, насколько моя идея адекватная?
Доброго времени суток!
Скажу сразу, гуглить пробовал но нашел только информацию в виде "TCP vs UDP" и все в таком духе, но знаю что она где то есть.
Пишу приложение использующее протокол UDP, и насколько знаю при отправке пакетов по протоколу UDP они могут придти не в правильном порядке, появилась необходимость доставлять пакеты в правильном порядке, на потерянные пакеты вообще все равно, главное что бы порядок был верным.
Собственно если сделать так:
В момент разбития данных на блоки, каждый блок пронумеровывать вначале (например так: блок1 "1;сооб"; блок2 "2;щение") и при получении пакетов, расставлять их по возрастанию, к примеру:
Сервер отправляет клиенту пакеты (цифрами я обозначаю пакеты и их правильную позицию): 1..2...3..4..5..6..7
Клиент получает: 2..3..6..4..7
При получении пакетов:
2 - ок
3 - ок
6 - ок
4 - пропускаем, т.к. уже получен пакет с более новой информацией
7 - ок
На сколько это адекватно и может есть более простые методы как прикрутить к UDP одно из качеств TCP, может framework есть какой ( пишу на C# ).
P.S. Всем спасибо!
P.P.S. Пожалуйста, не предлагайте использовать другие протоколы помимо UDP.
Разве я просил что то лучше UDP или TCP? Мне нужна лишь 1 качество TCP и все, а Вы предлагаете технологию которая безопаснее TCP, наверное она еще и медленнее TCP из за множества проверок. Мне нужна скорость а не надежность....
Senture, посмотрите ещё флаги для tcp, вроде есть возможность слать без рукопожатия на установку коннекта.
Типа half-connect, чтобы пакеты слались и собирались сами в нужном порядке, но без подтверждения доставки.
xmoonlight, хорошая идея, спасибо, но у меня уже реализован основной механизм, переносить его на другой протокол займет немало времени, мне бы не меняя протокол просто добавить последовательность, наверное буду делать так как и написал в вопросе.
Senture, Я бы так сделал:
1. Ловите асинхронно,
2. Следите за временем отправки (вместо счётчика, указываете в каждом пакете).
3. Просроченные (по таймеру внутри) - игнорируете.
Senture, Не за что...
Хотел добавить, что может быть ситуация, когда два или более пакетов вышли в одну и ту же микросекунду!
Вот, здесь уже, обязательно надо добавлять ко времени каунтер (или просто игнорировать такие пакеты).
В нем используется логика передачи посылка-подтверждение. Пока не будет получено подтверждение получения пакета, пакет со следующим номером не посылается. Таким образом, проблема перепутывания пакетов в данном протоколе решена. И ещё это стандарт и классика...
beerchaser, так же используется в tcp, пакеты которые я отправляю очень быстро приходят в непригодность, поэтому если пакет потерялся то и фиг с ним, а вот порядок мне желателен
В tcp не так. Там квитирование идёт на окно. В tftp - квитирование с ожиданием. Но это протоколы гарантированной доставки. Если Вам гарантированная доставка не нужна (имеется возможность потери пакетов без ущерба для системы), то вполне подходит выбранный Вами метод. Единственно, что при таком методе надо помнить о переходе счётчика пакетов через ноль и учитывать это в приемнике. Т.е. на двух байтах счетчика максимальный номер пакета будет 65535, а потом сразу станет 0.