Как реализовать RFC 3393 (изменение задержки пакетов Ipdv) в C?
Я создаю приложение Ethernet, в котором я буду отправлять пакеты с одной стороны и получать его с другой стороны. Я хочу вычислить задержку в пакетах на стороне получателя, как в RFC 3393. Поэтому я должен поместить метки времени в пакет на стороне отправителя, а затем взять метки времени на стороне получателя, как только я получу пакет. Вычитая значения, я получу разницу во временных метках, а затем вычтя это значение с последующей разницей, получу одностороннюю задержку ipdv. Обе часы не синхронизированы. Так что любая помощь очень ценится. Спасибо.
1 ответ
RFC 3393 предназначен для измерения дисперсии задержки пакета, а не для измерения самой задержки.
Для примера: вы пишете приложение для потокового видео. Вы хотите буферизовать как можно меньше видеоданных (чтобы воспроизведение началось как можно скорее). Предположим, что для передачи данных с компьютера A на компьютер B всегда всегда требуется 20 мс. В этом случае (и при условии, что компьютер A может отправлять видеоданные так же быстро, как и при воспроизведении), вам вообще не нужен буфер. Как только вы получите первый кадр, вы можете начать воспроизведение, будучи уверенным в том, что к тому моменту, когда потребуется следующий кадр, он прибудет (потому что для получения данных всегда требуется ровно 20 мс, а машина A отправляет по крайней мере как быстро как ты играешь).
Это работает независимо от того, как долго эти 20 мс, если это всегда одинаково. Это может быть 1000 мсек - первый кадр занимает 1000 мсек, чтобы прибыть, но вы все равно можете начать воспроизведение, как только он прибудет, потому что следующий фрейм также займет 1000 мсек и был отправлен сразу за первым фреймом - другими словами, он уже на своем путь и будет здесь на мгновение. Очевидно, что реальный мир не такой.
Возьмите другую крайность: в большинстве случаев данные поступают в течение 20 мс. За исключением иногда, когда это занимает 5000 мс. Если у вас нет буфера и задержка на кадрах с 1 по 50 составляет 20 мс, тогда вы можете воспроизвести первые 50 кадров без проблем. Затем для кадра 51 требуется 5000 мс, и вы останетесь без видеоданных на 5000 мс. Пользователь заходит и посещает другой сайт со своими симпатичными кошачьими видео. Что вам действительно нужно, так это буфер 5000 мс данных - тогда все будет в порядке.
Длинный пример, короткий момент: вас не интересует абсолютная задержка пакетов, вас интересует, какова разница в этой задержке - насколько большим должен быть ваш буфер.
Чтобы измерить абсолютную задержку, вам нужно синхронизировать часы на обеих машинах. Машина A будет отправлять пакет с отметкой времени 12337849227 28, и когда он прибудет на машину B в момент времени 12337849227 48, вы будете знать, что для получения пакета понадобилось 20 мс.
Но поскольку вас интересует дисперсия, вам нужно (как описано в RFC 3393) несколько пакетов с машины A. Машина A отправляет пакет 1 с отметкой времени 1233784922 72 8, затем через 10 мс отправляет пакет 2 с отметкой времени 1233784922 73 8, а затем через 10 мс отправляет пакет 3 с отметкой времени 1233784922 74 8.
Машина B получает пакет 1 с временной отметкой 1233784922 12 8. В этом случае односторонняя задержка между машиной A и машиной B (с точки зрения машины B) составляет -600 мс. Это явно полная чушь, но нам все равно. Машина B получает пакет 2 с отметкой времени 1233784922 15 8. Задержка в одну сторону составила -580 мс. Машина B получает пакет 3 с отметкой времени 1233784922 16 8. Задержка в одну сторону снова составила -580 мс.
Как и выше, нас не волнует, что такое абсолютная задержка - поэтому нам даже не важно, будет ли она отрицательной, три часа или что-то еще. Мы заботимся о том, чтобы величина задержки варьировалась на 20 мс. Таким образом, вам нужен буфер 20 мс данных.
Обратите внимание, что здесь я полностью закрываю вопрос о смещении часов (то есть, часы на машинах A и B работают с немного разными скоростями, так что, например, время машины A увеличивается со скоростью 1,00001 секунды за каждую секунду, что на самом деле прошло). Хотя это вносит неточность в измерения, его практический эффект вряд ли будет проблемой в большинстве приложений.