Files
XTLS_Xray-docs-next/docs/ru/config/transports/mkcp.md
T

8.2 KiB

mKCP

mKCP использует UDP для имитации TCP-соединения.

mKCP жертвует пропускной способностью ради уменьшения задержки. При передаче одного и того же контента mKCP, как правило, потребляет больше трафика, чем TCP.

::: tip Убедитесь, что на хосте правильно настроена конфигурация брандмауэра. :::

KcpObject

KcpObject соответствует элементу kcpSettings в StreamSettingsObject.

{
  // outbound example; also applies to inbound
  "outbounds": [
    {
      // ...
      "streamSettings": {
        "method": "mkcp",
        // [!field focus]
        "kcpSettings": {
          "mtu": 1350,
          "tti": 20,
          "uplinkCapacity": 5,
          "downlinkCapacity": 20,
          "cwndMultiplier": 1,
          "maxSendingWindow": 2097152
        }
      }
    }
  ]
}

::: tip Поля header и seed были удалены, пожалуйста, используйте FinalMask для настройки.

Также была удалена стандартная обфускация mKCP; для подключения к старым версиям серверов необходимо настроить mkcp-legacy в FinalMask (если оставить settings.header и settings.value пустыми, будет использоваться стандартная обфускация XOR из старых версий). :::

mtu: number

Максимальный размер передаваемого блока (maximum transmission unit).

Выберите значение от 576 до 1460.

По умолчанию 1350.

tti: number

Интервал передачи (transmission time interval), в миллисекундах (ms), mKCP будет отправлять данные с этой частотой.

Выберите значение от 10 до 100.

По умолчанию 50.

uplinkCapacity: number

Пропускная способность канала отправки, то есть максимальная полоса пропускания, используемая хостом для отправки данных, в МБ/с (обратите внимание это байты, а не биты).

Может быть установлено в 0, что означает очень маленькую пропускную способность.

По умолчанию 5.

downlinkCapacity: number

Пропускная способность канала приема, то есть максимальная полоса пропускания, используемая хостом для приема данных, в МБ/с (обратите внимание что это байты, а не биты).

Может быть установлено в 0, что означает очень маленькую пропускную способность.

По умолчанию 20.

::: tip uplinkCapacity и downlinkCapacity определяют скорость передачи mKCP.

В качестве примера, если клиент отправляет данные, то uplinkCapacity клиента определяет скорость отправки данных, а downlinkCapacity сервера определяет скорость приема данных. Значение, меньшее из двух, будет использоваться в качестве определяющего.

Рекомендуется установить downlinkCapacity в большое значение, например, 100, а uplinkCapacity - в фактическое значение скорости сети. Когда скорость недостаточна, можно постепенно увеличивать значение uplinkCapacity до примерно двух раз больше, чем фактическая скорость сети. :::

cwndMultiplier: number

Множитель окна перегрузки, применяемый к количеству отправляемых пакетов «в полёте», которое вычисляется из uplinkCapacity, mtu и tti. Минимальное значение — 1.

По умолчанию 1.

maxSendingWindow: number

Максимальное окно отправки в байтах. Фактически пересчитывается в количество пакетов «в полёте» как maxSendingWindow / mtu, поэтому не должно быть меньше mtu.

По умолчанию 2097152.

Благодарности

  • @skywind3000 изобрел и реализовал протокол KCP.
  • @xtaci перевел реализацию KCP с C на Go.
  • @xiaokangwang протестировал интеграцию KCP с Xray и внес первый PR.

Улучшения протокола KCP

Более компактный заголовок протокола

Протокол KCP использует заголовок размером 24 байта, а mKCP уменьшил его до 18 байт для пакета данных и 16 байт для пакета подтверждения. Более компактный заголовок помогает избежать обнаружения по признакам и ускоряет передачу данных.

Кроме того, в оригинальном KCP каждый пакет подтверждения может подтвердить только один пакет данных, то есть, если KCP нужно подтвердить получение 100 пакетов данных, он отправит 24 _ 100 = 2400 байт данных. В этом случае многократно повторяются заголовки, что приводит к ненужному расходу полосы пропускания. mKCP сжимает несколько пакетов подтверждения, 100 пакетов подтверждения занимают всего 16 + 2 + 100 _ 4 = 418 байт, что в шесть раз меньше, чем в оригинальном KCP.

Передача пакетов подтверждения

В оригинальном KCP пакет подтверждения отправляется только один раз, если пакет подтверждения потерян, то обязательно произойдет повторная передача данных, что приводит к ненужному расходу полосы пропускания. mKCP будет повторно отправлять пакеты подтверждения с определенной частотой, пока отправитель не получит подтверждение. Размер одного пакета подтверждения составляет 22 байта, что значительно меньше, чем размер пакета данных, который составляет более 1000 байт, поэтому повторная передача пакета подтверждения имеет гораздо меньшую цену.

Управление состоянием соединения

mKCP может эффективно управлять состоянием соединения. Когда удаленный хост инициализирует закрытие соединения, соединение будет закрыто в течение двух секунд; когда удаленный хост теряет соединение, соединение будет закрыто в течение максимум 30 секунд.

Оригинальный KCP не поддерживает этот сценарий.