LINUX.ORG.RU

Надежный UDP


0

1

Кто нибудь находил или использовал Java библиотеки, которые реализуют надежную передачу данных (packet loss, reordering, duplication handing, congestion control) на основе UDP.

Дело в том, что STUN и ICE реализованы только для UDP, реализации костылей для TCP очень зачаточны.

Встречал ли кто-то такое?

★★★★★

Не совсем понятна мотивация, если необходимо обеспечить высокоскоростную гарантированную доставку в заведомо надежной сетевой среде, на это есть патчи ТСР, как пример, вот это: http://www.stanford.edu/~alizade/Site/DCTCP.html

Ну и еще пару ссылок: http://udt.sourceforge.net/doc/udt-design-sc04-v8.pdf http://www.stanford.edu/~alizade/Site/DCTCP_files/dctcp-final.pdf

Интересная подборка по ultra-low latency messaging: http://www.250bpm.com/

Еще есть направление - оптимизация стандартного ТСР протокола в надежной среде для очень серьезного снижения его латентности, попадалось HOWTO от 29West, вроде как на их сайте есть, это одни из ведущих в части ультранизколатентного networking.

westtrd
()
Ответ на: комментарий от vertexua

В libjingle есть реализация «pseudo TCP», которая очень легко портируется, т.к. абсолютно не привязана к остальному коду. Можно вытащить ее оттуда как есть и использовать через JNI. Или поискать готовые привязки libjingle или libnice (там тот же код используется для TCP-over-UDP) для Java.

mannaz
()
Ответ на: комментарий от mannaz

Болезненно, но вариант. JNI не подходит, ибо Pure Java, но портировать на Java можно будет попробовать, когда будет время

vertexua ★★★★★
() автор топика
Ответ на: комментарий от mannaz

В libjingle есть реализация «pseudo TCP», которая очень легко портируется

А вы как-то с этим работали?

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

> портировать на Java можно будет попробовать, когда будет время

Там реально работы на полтора дня. Один класс, pure ANSI C++, никакие системные вызовы, включая работу с сокетами, не используются - все через колбеки.

mannaz
()
Ответ на: комментарий от mannaz

И как произвоидительность под нагрузкой по сравнению с TCP? А какая у вас была причина юзать UDP?

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Для TCP реализованы унылые зачатки. Для UDP - куча избитых алгоритмов

Можно поподробнее? Ты имеешь в виду hole punching?

true_admin ★★★★★
()
Ответ на: комментарий от vertexua

> И как произвоидительность под нагрузкой по сравнению с TCP?

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

А какая у вас была причина юзать UDP?


Такая же, как у тебя :)

mannaz
()
Ответ на: комментарий от mannaz

Такая же, как у тебя :)

О, ништяк, значит работает задумка. Наверное через STUN? Тоже сделаю такое, правда уж такие выверты как pseudo tcp в Java тяжело найти. Ну уж этот компонент если портирую, то выложу в опенсорц под Apache License

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

> О, ништяк, значит работает задумка.

Конечно, работает. В частности, разработчики libnice (реализация ICE под GLib) тот же код позаимствовали.

Наверное через STUN?


STUN или TURN, в зависимости от обстоятельств. Я не знаю, как сделано в NatTrav, но во всех реализациях ICE, которые я видел, всегда использовалась некая абстракция сокета, т.е. в клиентском коде не всегда известно, как именно доставляются данные.

mannaz
()
Ответ на: комментарий от mannaz

STUN или TURN, в зависимости от обстоятельств.

Простите что отвлекаю, но раз у вас есть опыт работы с этим... В каком случае у вас переход на TURN? Почему STUN не достаточно?

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

У них там еще лицензия такая, надо с этим вопросом разобраться если опенсорсить. Нельзя упоминать автора, вообще мутный вопрос. Если портирую, то нужны ссылки на libjingle и Google?

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

> В каком случае у вас переход на TURN? Почему STUN не достаточно?

Hole-punching, применяемый в STUN не сработает, если один из пиров находится за симметричным NAT'ом (встречается, к сожалению). В этом случае нужен какой-нибудь relay-сервер, в частности TURN.

mannaz
()
Ответ на: комментарий от vertexua

> Если портирую, то нужны ссылки на libjingle и Google?

Да, нужно повторить их копирайт, условия и дисклеймер где-нибудь в документации к программе.

mannaz
()
Ответ на: комментарий от mannaz

Меня сбило с толку

The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission.

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Это означает, что, грубо говоря, ты не можешь написать «Google одобряет» про свою программу, будь то реклама или документация, только потому что ты использовал их код.

mannaz
()
Ответ на: комментарий от mannaz

Еще один вопрос, если не тяжело. Вы просто используете STUN и TURN. Я так понял что ICE - это какое-то более комплексное и совершенное решение. Есть смысл использовать? Или STUN подойдет?

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

ICE - это только название соответствующего RFC и описываемой в нем техники «обхода» NAT, которая опирается на STUN и TURN. Т.е. есть отдельные RFC и для STUN, и для TURN, а ICE описывает, как использовать их в комплексе: сбор адресов-кандидатов и прочее. Собственно, алгоритм выбора «STUN или TURN» описан как раз там. Смысла детально вникать во все это нет, т.к. наверняка и для Java должна быть полная реализация ICE, а не только STUN (может NetTrav - это оно и есть, я не в курсе)

mannaz
()

На джаве нет, но на Си есть enet

http://enet.bespin.org/

Именно что гарантия доставки + порядок для udp

Либа живая, проверенная и ее используют некоторые игрушки.

Waterlaz ★★★★★
()
Ответ на: комментарий от vertexua

> Есть IcedJava. Там немного с документацие туговато, но вообще можно поковырять

Ты смотри по возможностям. TURN потребует от тебя наличия сервера с прямым IP, через который будет гоняться трафик для особо запущенных клиентов (тех, что за симметричным NAT'ом). Я использовал p2p в двух своих проектах, причем в одном из них, если требовался TURN, просто выводилось сообщение о невозможности установления соединения (т.е. было достаточно только реализации STUN), т.к. не всегда целесообразно, например, предоставлять для всех желающих relay-сервера бесплатно. Это уже зависит от специфики твоей программы. В скайпе, например, в качестве TURN-сервера выступает каждая супер-нода, т.е. и собственные сервера скайпа не используются и все счастливы.

mannaz
()
Ответ на: комментарий от mannaz

В скайпе, например, в качестве TURN-сервера выступает каждая супер-нода, т.е. и собственные сервера скайпа не используются и все счастливы.

У меня есть возможность применить такое решение.

vertexua ★★★★★
() автор топика

Встречал. В недрах всяких p2p прокси-туннелей для прозрачного пробоя NAT. Там как транспорт использовались обычно сторонние лицензированые реализации slingshot или RTP. (клиентские TCP сессии заворачивали в это и радовались) Была так же либа, реализующая UDT. Самопалами народ редко заморачивается.

slackwarrior ★★★★★
()
Ответ на: комментарий от bbk123

>UDP ненадёжный по определению.

Ну что за бред? Всегда поверх udp можно нагородить протокол не менее надежный чем tcp

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

А в TCP один хер куча умников отключает алгоритм Нейгла, где-то прочитав ключевую фразу «потому что тормоза» или.... «для повышения параллелизма вычислений на клиенте и сервере» (с) http://www.rsdn.ru/forum/network/3475612.flat.aspx#3475612

slackwarrior ★★★★★
()
Ответ на: комментарий от Waterlaz

> Ну что за бред? Всегда поверх udp можно нагородить протокол не менее надежный чем tcp

Бред у тебя. Автору темы необходимо полключиться к уже существующим сервисам, работающим через UDP без всяких костылей.

bbk123 ★★★★★
()
Ответ на: комментарий от bbk123

> Автору темы необходимо полключиться к уже существующим сервисам, работающим через UDP без всяких костылей.

Ты бы хоть в суть проблемы вник немного перед постингом.

mannaz
()
Ответ на: комментарий от bbk123

>> Ну что за бред? Всегда поверх udp можно нагородить протокол не менее надежный чем tcp

Бред у тебя. Автору темы необходимо полключиться к уже существующим сервисам, работающим через UDP без всяких костылей.

Мне кажется, что если бы ты прочитал хоть одно сообщение ТС, то понял, что это не так.

Waterlaz ★★★★★
()
Ответ на: комментарий от LamerOk

В Java не бывает «только для платформы Х» ))

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

Я правильно понимаю что сейчас самая распространнёная техника обхода NAT это hole punching(для выбора портов используется stun-сервис)?

А turn это тупо сервак с внешним ip который проксирует трафик клиентов через себя?

true_admin ★★★★★
()

хорошую тему подняли - тоже вот начал вникать в эти технологии, пока в теории, но начинаю переходить к тестовым примерам

x905 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.