Протокол mKCP

mKCP - это потоковый транспортный протокол, основанный на протоколе KCPОткрыть в новой вкладке, который может передавать любые потоки данных по порядку.

Версия

Протокол mKCP не имеет номера версии, совместимость между версиями не гарантируется.

Зависимости

Базовый протокол

mKCP - это протокол, основанный на UDP, все коммуникации осуществляются по UDP.

Функции

  • fnv: хэш-функция FNV-1aОткрыть в новой вкладке
    • Входные данные: строка произвольной длины;
    • Выходные данные: 32-битное беззнаковое целое число;

Процесс коммуникации

  1. mKCP разбивает поток данных на несколько пакетов для отправки. Каждый поток данных имеет уникальный идентификатор, который используется для различения разных потоков данных. Каждый пакет данных в потоке данных несет один и тот же идентификатор.
  2. У mKCP нет процесса рукопожатия. При получении пакета данных определяется, является ли это новым вызовом или текущим вызовом, на основе идентификатора потока данных, который он несет.
  3. Каждый пакет данных содержит несколько сегментов (Segment), которые делятся на три типа: данные (Data), подтверждение (ACK) и пульс (Ping). Каждый сегмент обрабатывается отдельно.

Формат данных

Пакет данных

4 байта2 байтаL байт
Информация для аутентификации AДлина данных LСегментная часть

Где:

  • Информация для аутентификации A = fnv(сегментная часть), big endian;
  • Сегментная часть может содержать несколько сегментов;

Сегмент данных

2 байта1 байт1 байт4 байта4 байта4 байта2 байтаLen байт
Идентификатор ConvКоманда CmdОпция OptВременная метка TsПорядковый номер SnНеподтвержденный порядковый номер UnaДлина LenДанные

Где:

  • Идентификатор Conv: идентификатор потока данных mKCP
  • Команда Cmd: константа 0x01
  • Опция Opt: возможные значения:
    • 0x00: пустая опция
    • 0x01: другая сторона отправила все данные
  • Временная метка Ts: время отправки текущего сегмента с удаленной стороны, big endian
  • Порядковый номер Sn: позиция сегмента данных в потоке данных, порядковый номер начального сегмента равен 0, каждый последующий сегмент увеличивается на 1
  • Неподтвержденный порядковый номер Una: минимальный Sn, который отправляется удаленным хостом и еще не получил подтверждение

Сегмент подтверждения

2 байта1 байт1 байт4 байта4 байта4 байта2 байтаLen * 4 байта
Идентификатор ConvКоманда CmdОпция OptОкно WndСледующий порядковый номер для приема SnВременная метка TsДлина LenПодтвержденные порядковые номера

Где:

  • Идентификатор Conv: идентификатор потока данных mKCP
  • Команда Cmd: константа 0x00
  • Опция Opt: как указано выше
  • Окно Wnd: максимальный порядковый номер, который может принять удаленный хост
  • Следующий порядковый номер для приема Sn: минимальный порядковый номер сегмента данных, который не получил удаленный хост
  • Временная метка Ts: временная метка последнего полученного сегмента данных удаленным хостом, может использоваться для расчета задержки
  • Подтвержденные порядковые номера: каждые 4 байта указывают, что данные с этим порядковым номером получены и подтверждены

Комментарий:

  • Удаленный хост ожидает получения данных с порядковыми номерами в диапазоне [Sn, Wnd)

Сегмент пульса

2 байта1 байт1 байт4 байта4 байта4 байта
Идентификатор ConvКоманда CmdОпция OptНеподтвержденный порядковый номер UnaСледующий порядковый номер для приема SnЗадержка Rto

Где:

  • Идентификатор Conv: идентификатор потока данных mKCP
  • Команда Cmd: возможные значения:
    • 0x02: удаленный хост принудительно завершает сеанс
    • 0x03: обычный пульс
  • Опция Opt: как указано выше
  • Неподтвержденный порядковый номер Una: тот же, что и Una в сегменте данных
  • Следующий порядковый номер для приема Sn: тот же, что и Sn в сегменте подтверждения
  • Задержка Rto: задержка, рассчитанная самим удаленным хостом