|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Делаю прогу для копирования файла по UDP. Отправитель разбивает файл на блоки и шлет получателю. ТЗ кратко: Отправитель каждые 20 мс отправляет один пакет с запросом подтверждения (MSG_TYPE_DATA_ASK) и окно из N (размер окна) пакетов MSG_TYPE_DATA (в каждом очередной блок файла, если есть запрос потерянных то сначала их). Отправка может начаться раньше, если придет подтверждение последнего MSG_TYPE_DATA_ASK. В этом случае отсчет 20 мс начинается с отправки первого пакета. Получатель сохраняет принятые блоки и следит за порядком их поступления. Если получен блок не по порядку, то пропущенные заносятся в таблицу пропущенных. При получении ранее пропущенного он убирается из таблицы. Получатель отправляет подтверждение MSG_TYPE_COMMIT (номер последнего принятого и список пропущенных) при получении MSG_TYPE_DATA_ASK и при последнего блока (прием завершен). Схему уже тестил, в целом она рабочая, потери происходят в основном последних блоков окна, т.е. первый пакет окна доходит практически всегда. Теряются как правило несколько последних пакетов подряд, что ожидаемо, т.к. окно пакетов прилетает на очередной шлюз, начало входит, а что не входит - рубится, т.е. хвост. Вопрос: как управлять размером окна? Надо придумать какую-то функцию или алгоритм, который в момент получения очередного подтверждения (MSG_TYPE_COMMIT) рассчитает на сколько увеличить/уменьшить текущее значение N. При расчете можно использовать: Текущее значение размера окна (N). Сколько пакетов доставлено на текущий момент. Количество потерянных пакетов в подтверждении. Количество потерянных пакетов всего. Возможно еще какая-то статистика накопленная отправителем в процессе отправки. Пока придумал просто уменьшать размер окна на кол-во потерянных пакетов. В случае если потерь нет - увеличивать на 10%. На коротких расстояниях (< 2 мс) оно нормально должно заработать. Подтверждение доставки предыдущего окна будет приниматься сразу после отправки текущего окна. Самая большая проблема с большими расстояниями (> 20 мс). Там поправочные изменения будут приходить раз в 20 мс, интервал отправки окон, т.е. корректировка N будет происходить в десятки раз реже, чем на коротких. Понимаю что надо как-то учесть время, но тут есть проблемы точных замеров из-за дискретности штатных часов 1-10 мс, а так же из-за вытесняющей многозадачности ОС, т.е. измеряющий поток может банально ожидать получения своего кванта процессорного времени. Поэтому при измерении времени вводим погрешность 10 мс (или +/- 5 мс) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 14:13 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
В гитхабе есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 14:22 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
maytonВ гитхабе есть? Пока нет, не доделал еще. Закончу - выложу. Будет с акторами :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 14:28 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Я заранее скажу в чём мой интерес. Мне интересно посмотреть на протокол DNS (как подмножество UDP). Я хотел приспособить локальный DNS сервер для раздачи каких-то своих сведений не имеющих отношения к почте и доменам. А ... ну вобщем какие-то свои сведенья. Твою разработку я поддерживаю на уровне энтузиазма, но не очень понимаю что получится в конце. Будет ли это твой транспортный протокол поверх протокола коротких сообщений? Или что-то другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 14:37 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
maytonЯ хотел приспособить локальный DNS сервер для раздачи каких-то своих сведений не имеющих отношения к почте и доменам. Не имеющие отношения к доменам это вряд ли: у него на входе имя хоста/домена. А так https://ru.wikipedia.org/wiki/Типы_ресурсных_записей_DNS и раздавай ТХТ записи сколько пожелаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 15:01 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
maytonТвою разработку я поддерживаю на уровне энтузиазма, но не очень понимаю что получится в конце. Будет ли это твой транспортный протокол поверх протокола коротких сообщений? Или что-то другое? Я решил есть слона по частям :) Конкретно это - создание транспортного протокола передачи сообщений поверх UDP. Плюс побаловаться с акторами. Заодно еще раз попытаться выжать гигабит в локалке . На одном конце запускаем ожидание приема на заданном порту и сохранение принятого в заданную папку Код: sql 1.
На другом отправляем Код: sql 1.
Потом запущу прием дома на cubie и буду слать туда бэкапы. Почти продакшн :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 15:02 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Dima TНа одном конце запускаем ожидание приема на заданном порту и сохранение принятого в заданную папку Код: sql 1.
На другом отправляем Код: sql 1.
Потом запущу прием дома на cubie и буду слать туда бэкапы. Почти продакшн :) Ну это круть. Но я-бы посоветовал считать MD5 в конце и проверять. Так. Навсякий. Вдруг битик потеряешь в пути. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 15:28 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Я бы сказал, что "всё украдено до нас", но "прям щас" не могу найти RFC-шки, где расписано управление потоком, быстрое восстановление при потерях и т.п. Общий смысл примерно такой: стартуем с оценки RTT в одну секунду и адаптируемся к фактическим задержкам в канале. P.S. Не исключено, что можно, не изобретая велосипед, просто адаптировать для своих нужд TFTP (с учётом уже сделанных расширений). Даже если "не подойдёт" - можно почерпнуть немало полезного. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 15:38 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Рекомендую сделать поиск в RFC Index по слову "Congestion" и посмотреть, например, RFC3649 и RFC3124 . P.S. Очень полезно знать о Path MTU Discovery , чтобы не гадать про оптимальный размер блока. UDP-Lite , опять-таки. Хотя это если уж совсем упороться по оптимизации ... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 15:57 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Вот какая-то сравнительная статья есть. Может пригодится. https://www.bizety.com/2016/02/03/open-source-udp-file-transfer-tool-comparison/ ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 16:03 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 16:21 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, спасибо за ссылки. Натолкнул на мысль. Мысль такая: я хочу слать максимально быстро, но с минимальным количеством потерь по дороге, т.к. это лишние перезапросы, подготовка к отправке и т.д. и т.п. С другой стороны отсутствие потерь говорит о том что скорость скорее всего можно повысить. В итоге напрашивается решение что я должен управлять потерями, т.е. держать скорость такой, чтобы потери были, но в рамках допустимого. Думаю надо отталкиваться от доли потерь, но не с начала отправки (например гигабайт отправляется и в конце резко потери возросли), а за последние 1-2 секунды, может даже меньше. Т.е. вычисляем долю потерь, если она ниже нормы - увеличиваем окно, выше - уменьшаем. Тут встает вопрос подбора нормы потерь, думаю можно будет подобрать методом научного тыка. Буду думать в этом направлении. PS MTU учел, есть проверка хэша всего файла и каждого пакета в отдельности, есть шифрование, есть рандомная составляющая для разнообразия шифрованных пакетов с одинаковым содержимым. Т.к. это за рамками вопроса топика, поэтому не стал усложнять ненужными подробностями. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 17:27 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
maytonВ гитхабе есть? Сделал папку , пока там только описаловка основных моментов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 18:38 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Dima TmaytonВ гитхабе есть? Сделал папку , пока там только описаловка основных моментов. Хм... не знаю. У меня LibreOffice и он открывает этот документ как минимум странно. Ты мог-бы его .. экспортировать в что-то очень простое. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.01.2019, 22:36 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
maytonDima Tпропущено... Сделал папку , пока там только описаловка основных моментов. Хм... не знаю. У меня LibreOffice и он открывает этот документ как минимум странно. Ты мог-бы его .. экспортировать в что-то очень простое. Перепробовал все варианты. Не заточен гитхаб на форматированный текст, только их самодельное форматирование. В PDF`е показывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2019, 10:27 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Dima Tmaytonпропущено... Хм... не знаю. У меня LibreOffice и он открывает этот документ как минимум странно. Ты мог-бы его .. экспортировать в что-то очень простое. Перепробовал все варианты. Не заточен гитхаб на форматированный текст, только их самодельное форматирование. В PDF`е показывает. Для ведения документиции онлайн мы обычно используем Atlassian Confluence. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2019, 11:29 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Можешь эскпортнуть в PDF ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2019, 16:44 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Я кстати придумал подход при котором тебе вообще никакое окно не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2019, 16:46 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2019, 19:31 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Dima TPS MTU учел, есть проверка хэша всего файла и каждого пакета в отдельности, есть шифрование, есть рандомная составляющая для разнообразия шифрованных пакетов с одинаковым содержимым. Т.к. это за рамками вопроса топика, поэтому не стал усложнять ненужными подробностями.MTU это делитель твоего блока UDP, чтобы его избежать тебе придётся либо "сырые сокеты" использовать, т.е. самому генерить блок либо увеличивать его в настройках системы вся оптимизация у тебя будет лишь в уменьшении переотправки потерявшихся блоков ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2019, 21:51 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Да. Дима выложил PDF. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 14:43 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
maytonЯ кстати придумал подход при котором тебе вообще никакое окно не нужно. Делись. Только учти с таймерами все плохо, погрешность 10 мс. Т.е. я могу быстро послать окно пакетов и долгая пауза. Я выбрал 20 мс, т.к. это будет относительно стабильная частота срабатывания. Моя мысль в том чтобы нащупать максимальный размер окна, который можно за раз отправить и придерживаться его. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 18:14 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
kealon(Ruslan)Dima TPS MTU учел, есть проверка хэша всего файла и каждого пакета в отдельности, есть шифрование, есть рандомная составляющая для разнообразия шифрованных пакетов с одинаковым содержимым. Т.к. это за рамками вопроса топика, поэтому не стал усложнять ненужными подробностями.MTU это делитель твоего блока UDP, чтобы его избежать тебе придётся либо "сырые сокеты" использовать, т.е. самому генерить блок либо увеличивать его в настройках системы вся оптимизация у тебя будет лишь в уменьшении переотправки потерявшихся блоков Для учета MTU я просто ограничиваю размер UDP пакета. Никакими raw-сокетами MTU ты не увеличишь, это жестко зашитое ограничение. В случае превышения происходит фрагментация или пакет теряется. Все сетевое оборудование оперирует пакетами в единицу времени, поэтому пакет надо максимально наполнить чтобы получить максимальную скорость передачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 18:23 |
|
Пятничная передача файла по UDP. Алгоритм управления размером окна
|
|||
---|---|---|---|
#18+
Dima TmaytonЯ кстати придумал подход при котором тебе вообще никакое окно не нужно. Делись. Только учти с таймерами все плохо, погрешность 10 мс. Т.е. я могу быстро послать окно пакетов и долгая пауза. Я выбрал 20 мс, т.к. это будет относительно стабильная частота срабатывания. Моя мысль в том чтобы нащупать максимальный размер окна, который можно за раз отправить и придерживаться его. Да к чорту окна и таймеры. У тебя - задача другая. Тебе вообще не нужен поточный протокол. Стоит задача засинхронизировать два файла. Это можно делать так-же как делают p2p клиенты. Заполнять их (чанки) в том порядке в каком прилетают пакеты. По сути у тебя должно быть две роли. Sender, Receiver. Они должны протокольно сообщить о намерениях. Они должны контролировать heartbeat. Тоесть раз в несколько секунд слать ping-pong. Если долго нет хертбита то сеанс завершается. Они должны отвечать статистикой. Тоесть - принято 20 пакетов за единицу времени. Sender должен принимать решение о скорости. Receiver должет запрашивать те chunks которые пустые или с битыми CRC32 суммами. Sender по завершении сеанса должен сказать что дескыть я всё отправил. И нет-ли еще каких-то потерянных пакетов. Чанк может быть равным размеру UDP_DATA а может быть и нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2019, 18:36 |
|
|
start [/forum/topic.php?fid=16&msg=39759023&tid=1339944]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
140ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 231ms |
total: | 474ms |
0 / 0 |