Russian Qt Forum
Ноябрь 23, 2024, 21:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: p2p, udp, nat и связанные проблемы  (Прочитано 4747 раз)
Atan
Гость
« : Январь 11, 2011, 20:06 »

Доброго времени суток.

Пишем тут с другом клиент одноранговой p2p-сети на QT, общающийся по UDP. Вопросов по архитектуре (и не только) накопилось много.

1. Как грамотно организовать очереди? Дело в том, что если делать 1 общую очередь на все пиры, то возможны абьюзы, когда кто-то один забивает всю очередь сообщениями. Делать для каждого активного пира по своей очереди, или есть более изящные варианты?
Если очередь реализована отдельно для каждого пира, то можно устанавливать специально для этого пира скорость отдачи. Но если активных пиров много, и много создано очередей (скажем, 1024) - это сильно повлияет на производительность?
Вообще, как это делают белые люди?

2. Нумерование пакетов (запросов), подразумевающих то, что на них должен прийти ответ - есть ли способ лучше, чем подстановка sequence-id для каждого пакета, нуждающегося в подтверждении доставки?

3. Ограничение скорости. Как мне знать с какой скоростью пир может принимать данные? Это понятно, что если пакет потеряется, то его попросят еще раз. В качестве тупого варианта:
a) отослать 2048 пакетов получателю подряд, без задержек
б) сообщений о доставке придет N
в) зная время, кол-во пакетов и их размер, можно посчитать скорость.
Но это тупо.

4. MTU. Как его определить для конкретно взятого пира? Или взять с потолка какое-то не очень большое значение? Есть, конечно и эмпирический вариант, типа:
а) отправляем датаграмму длиной 100500 байт
б) принимающая сторона проверяет целостность пакета, отвечает "битый/не битый"
в) отправляем датаграмму длиной 100500/2 байт
г) ...

Есть ли другие варианты? Просто втупую трафик создавать не хочется. Да и потом, все эти прелести эмпирического определения любой величины X подразумевают организацию эдаких "стадий" общения пиров. А это все сильно усложняет.

5. NAT. uPnP, STUN, .. ? На upnp я не смог найти четкой спецификации и логики работы этого протокола, нашел только какую-то одноименную qt-либу. А от stun (http://tools.ietf.org/html/rfc3489) становится страшно. Может ли кто подкинуть дровишек?
Просто фишка эта обязательно нужная, поскольку много юзеров всегда сидят за домашним натом. А в самом плохом случае - за двумя натами, если провайдер изначально дает серый айпишник.

И в целом, что бы кто мог посоветовать, в какую сторону посмотреть, на какие грабли наступить? Ибо с сетевым кодингом я знаком по принципу "пришло A, сделай B", что-то более серьезное писать не приходилось.

Спасибо.
Записан
crashsp
Гость
« Ответ #1 : Январь 11, 2011, 20:20 »

С логикой самого проекта не помогу...(
в данный момент сам пытаюсь настроить коннект через NAT вот эти статьи хорошо раскрывают работу через STUN тут и тут а вот
 хорошая про NAT

и еще вот исходники stun клиента на C++ под VC http://sourceforge.net/projects/stun/files/stun/0.96/stund_0.96_Aug13.tgz/download
и вот что то еще клиент http://www.codeproject.com/KB/IP/stunner.aspx
« Последнее редактирование: Январь 11, 2011, 20:25 от crashsp » Записан
SimpleSunny
Гость
« Ответ #2 : Январь 11, 2011, 21:25 »

Почитайте про протокол TCP, к примеру у Стивенса, более детально, тогда часть вопросов прояснится.

2. Нумерация пакетов нормальный метод.
3. http://book.itep.ru/4/44/tcp_443.htm с "синдрома узкого окна"
4. http://www.linux.org.ru/forum/development/4853358
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 20.