Как обернуть соединение UDP, чтобы улучшить сопротивление потери пакетов?

1164
Vi.

Предположим, что есть UDP-соединение, которое не ожидает большой потери пакетов.

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

Ожидаемое использование:

host1$ someprogram --listen-udp 127.0.0.1:1234 host1$ reedsolomon_udp --listen 0.0.0.0:1235 --connect 127.0.0.1:1234  host2$ reedsolomon_udp --connect host1:1235 --listen 127.0.0.1:1234 host2$ someprogram --connect-udp 127.0.0.1:1234 

Ожидается, что решение не устранит потери напрямую, оно должно уменьшить их, особенно если теряется более 50% пакетов.

2
Было написано несколько статей по этому вопросу, но я никогда не видел реальной реализации: https://tools.ietf.org/html/rfc6865 и http://www.mai.ru/science/trudy/eng/published .php? ID = 14801 & eng = Y, который, к сожалению, является просто абстрактным AaronLS 9 лет назад 0

2 ответа на вопрос

2
John

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

Программа UDP может ожидать некоторую потерю, например, около 2%. А фактические потери могут составлять, например, 70%. Мне нужно "забить мысль" очень ненадежной сети. Ожидается, что рассматриваемая программа не устранит убытки, а уменьшит их количество. Vi. 11 лет назад 0
На самом деле в туннеле UDP будет TCP. Но TCP работает плохо, когда теряются многие пакеты. Я подумываю о реализации «reedsolomon_udp» сам, но сначала спрашиваю здесь, потому что, может быть, кто-то где-то что-то уже реализовал. Vi. 11 лет назад 0
TCP внутри UDP-туннеля? Вы спрашиваете о проблемах. Если вам нужно уменьшить потерю пакетов, вам нужно очистить грязную сеть. Оборачивание TCP-соединения внутри UDP-туннеля (на самом деле такого нет), а затем попытка переобмотать его, чтобы уменьшить потерю пакетов, очень быстро приведет вас в состояние бесконечного ожидания из-за экспоненциального отката свойства сеанса TCP. John 11 лет назад 0
Я хочу использовать это как решение для «очистки грязной сети», которое я не могу контролировать (как обходной путь). А что не так с "TCP внутри UDP туннеля"? Это не TCP внутри TCP. Например, Teredo использует это и, похоже, не беспокоит ... Vi. 11 лет назад 0
То, что вы хотите, не существует. TCP внутри UDP плохой. Teredo предназначен для IPv6-inside-IPv4, который находится на другом уровне стека протоколов, поэтому он на самом деле не применяется. Вы застряли. Очистите сеть, или очистите ее, или справьтесь с потерей пакетов. Это ваш единственный практический выбор. John 11 лет назад 0
Это будет TCP внутри TUN / TAP внутри UDP. `Очистить сеть` -> не всегда возможно. `То, что вы хотите, не существует. -> ОК. Я просто не хочу через некоторое время обнаруживать, что программа на самом деле уже написана (но я не знал об этом). Vi. 11 лет назад 0
Реализация протокола надежности на уровне приложений через UDP иногда работает лучше, чем TCP. TCP сильно страдает от небольших потерь пакетов, потому что весь поток задерживается, в то время как таймеры повторной передачи истекают для повторной отправки потерянных пакетов, окно часто заполняется в течение этого периода, и поэтому вы получаете огромные потери производительности. Внедрение прямого исправления ошибок позволяет допустить небольшую потерю пакетов и потенциально получить более высокий уровень производительности. Конечно, такая реализация, которая обрабатывает все, что делает TCP, будет очень сложной. AaronLS 9 лет назад 0
0
Beel

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

Например, при потоковой передаче видео UDP может использоваться, чтобы избежать накладных расходов TCP. Различные ARQ используются в некоторых случаях для повышения надежности транспортного потока MPEG, передающего видео через Интернет. Такое разнообразие ARQ предназначено для создания более низких служебных данных, чем TCP, и в то же время позволяет повысить надежность приема видеопотока.

См. Эту статью в Википедии для более полного обсуждения и списка ссылок: https://en.wikipedia.org/wiki/Automatic_repeat_request