Написать пост

Надежность UDP протокола

Аватар Типичный программист

UDP – это передача данных без установления соединения, которое не имеет подтверждения связи и, таким образом, не дает никаких гарантий относительно доставки или порядка получения пакетов.  Но что это означает на практике?

Карл Сегин (Karl Seguin) провел эксперимент, чтобы выяснить, какова же надежность  такого способа передачи данных.

Он создал 5 VPS для отправки друг другу нескольких UDP-пакетов  в течение 7 часов. Карл не посылал много трафика (хотя, как он отмечает,  это, конечно, стоит попробовать).  Каждый сервер с периодом в 9-11 секунд случайно выбирал получателя и посылал 5-10 пакетов размером от 16 до 1016 байт.

Два сервера располагались в одном центре обработки данных в Нью-Джерси (НД 1 и НД 2) и по одному в Лос-Анджелесе (ЛА), Амстердаме (Нидерланды/НЛД) и Токио (Япония/ЯПН).

 Надежность

Первое, что Карл решил проверить — это надежность UDP.  Он предполагал, что показатели частоты доставки будут варьироваться от 25% до 75%.

Надежность UDP протокола 1
Таблица переданных/полученных пакетов
Надежность UDP протокола 2
Таблица переданных/полученных пакетов (процентное соотношение)

Однако, как отмечает сам Карл, результаты превзошли его ожидания.  Он предполагал, что потери при передаче данных из Амстердама в Японию и обратно,  будут больше нормы, но, как оказалось, потерь не было вообще.  Кажется, что данные, посылаемые из Лос-Анджелеса, в частности к двум серверам в Нью-Джерси,  передаются будто с трудом.  Есть в этом какая-либо закономерность?

Автор эксперимента полагал, что проблема заключается в размере пакета данных.  Пакет состоял из 16 байт заголовка и от 0 до 1000 байт полезных данных:

Надежность UDP протокола 3
Потери пакетов в зависимости от размера (в байтах)

В общем-то, ничего очевидного. Произошла ли потеря пакетов примерно в одно и то же время? К сожалению, Карл не сохранил временные метки, но с каждой парой серверов был ассоциирован соответствующий счетчик. Если проанализировать полученные данные, то можно заметить, что из 43 пакетов, которые не дошли из Лос-Анджелеса до второго сервера в Нью-Джерси, 29 были потеряны во время 1 ~ 2-минутных промежутков времени. Потеря пакетов, передаваемых первому серверу, также в значительной степени произошла в 2 коротких периода времени.

Порядок

Второй аспект, интересовавший Карла, – это порядок получения пакетов.
Изначально, автор эксперимента решил измерить инверсию массива. По сути, это число пар, в которых элементы расположены не по порядку. Если у вас есть массив со значениями 10, 8, 3, 7, 4, то вам в конечном итоге придется сделать 8 перестановок ((10,8), (10,3), (10,7), (10,4), (8,3), (8,7), (8,4), (7,4)).

Надежность UDP протокола 4
Инверсия

Карл засомневался в полезности данного метода, которая на первый взгляд кажется высокой. Одна из причин использовать UDP – это возможность отбрасывать некоторые пакеты данных. Если вы посылаете 10 000 пакетов, и они все пришли по порядку, а последний пакет каким-то образом оказался на месте первого, то вы можете просто отбросить его, а не делать 9999 перестановок.
Что если отбросить любой пакет, который придет после более позднего, уже обработанного пакета (т.е. после пакета с большим порядковым номером)? Например, если мы получим 1, 5, 4, 3, 6, 7 , мы бы отбросили 4 и 3, так как мы уже получили 5. Сколько “хороших” пакетов в итоге будет проигнорировано?

Надежность UDP протокола 5
Количество упорядоченных пакетов
Надежность UDP протокола 6
Количество упорядоченных пакетов (процентное соотношение)

В качестве небольшой настройки, мы можем объединить 5 пакетов вместе, отсортировать их, а затем вновь применить вышеуказанный код для отбрасывания ненужных пакетов:

Надежность UDP протокола 7
Количество упорядоченных пакетов с группировкой
Надежность UDP протокола 8
Количество упорядоченных пакетов с группировкой (процентное соотношение)

 Вывод

Трудно делать какие-либо выводы, так как необходимо проводить тестирование в течение большего периода времени и с большим количеством данных.  Тем не менее, кажется, что надежность UDP довольно высока.  Расстояние обычно включает в себя больше «прыжков» (Каждое встречающееся на пути пакета промежуточное сетевое устройство заставляет пакет «перепрыгивать»  на очередное соединение (следующий сетевой сегмент), и каждый «прыжок» увеличивает риск того, что что-то пойдет не так, но если все будет налажено, то расстояние не будет проблемой.

Что касается порядка: в данном случае расстояние играет большую роль.  Группируя пакеты, мы видим значительное и ожидаемое улучшение.  Во многих случаях, порядок не имеет значение.  Если вы используете потоковую передачу данных, то вполне достаточно сохранять временную метку и выполнять повторное упорядочение на принимающей стороне.

Перевод статьи: «How unreliable is UDP

Следите за новыми постами
Следите за новыми постами по любимым темам
5К открытий5К показов