Skip to content

Транспорт — mihomo

mihomo распределяет параметры транспорта по блокам *-opts на каждой записи прокси. Консолидированной структуры транспорта нет: транспорт выбирается полем network прокси, и читается соответствующий блок параметров.

Селектор network

У каждого mihomo-прокси с поддержкой TLS есть поле network:. Значения:

ЗначениеСмысл
tcp (по умолчанию)Чистый TCP; все блоки *-opts игнорируются.
wsWebSocket — читается ws-opts.
httpПростая HTTP-маскировка (без upgrade) — читается http-opts.
h2HTTP/2 — читается h2-opts.
grpcgRPC поверх HTTP/2 — читается grpc-opts.
xhttpHTTP-кадрирование XTLS (совместимо с Xray) — читается xhttp-opts.

У ряда протоколов есть особенности (например, Trojan поддерживает только ws и grpc; VMess добавляет http и h2). Матрица документируется на странице каждого протокола.

ws-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
pathstring//<path>Путь WebSocket. Поддерживается query-параметр ранних данных `?ed=N`, совпадающий с конвенцией Xray.
headersmap[string]string{}{<header>: <value>}Дополнительные HTTP-заголовки в запросе upgrade.
max-early-dataint0<bytes>Максимум байтов ранних данных 0-RTT, буферизуемых до завершения WS-рукопожатия.
early-data-header-namestring(unset)<header name>Заголовок для передачи ранних данных в base64, когда сервер ожидает их под нестандартным именем.
v2ray-http-upgradeboolfalsetrue | falseИспользовать транспорт V2Ray HTTP-upgrade вместо настоящего WebSocket — экономит накладные расходы на кадрирование после рукопожатия.
v2ray-http-upgrade-fast-openboolfalsetrue | falseОтправлять полезную нагрузку клиента вместе с самим запросом HTTP-upgrade, экономя один RTT.

Исходный код: adapter/outbound/vmess.go:165-172 · зафиксировано на v1.19.29 (e26714a)

http-opts — HTTP-маскировка

ПолеТипПо умолчаниюДопустимые значенияОписание
methodstringGET<HTTP method>HTTP-метод, используемый маскирующим транспортом.
path[]string[/][/<path>]Список путей для ротации. Клиент выбирает один на каждый запрос.
headersmap[string][]string{}{<header>: [<value>]}Отображение имени заголовка в список значений. Клиент выбирает одно значение на каждый запрос.

Исходный код: adapter/outbound/vmess.go:145-149 · зафиксировано на v1.19.29 (e26714a)

h2-opts — HTTP/2

ПолеТипПо умолчаниюДопустимые значенияОписание
host[]string[][<hostname>]Список значений заголовка Host. Клиент случайно выбирает одно на каждый запрос.
pathstring//<path>HTTP-путь.

Исходный код: adapter/outbound/vmess.go:151-154 · зафиксировано на v1.19.29 (e26714a)

grpc-opts

ПолеТипПо умолчаниюДопустимые значенияОписание
grpc-service-namestring(required)<service name>Путь имени сервиса gRPC.
grpc-user-agentstring(unset)<UA string>Переопределить User-Agent gRPC-клиента.
ping-intervalint0<seconds>Интервал PING-кадров HTTP/2. 0 отключает.
max-connectionsint0<int>Максимум одновременных gRPC-каналов (веер мультиплексирования).
min-streamsint0<int>Минимум потоков на канал, прежде чем выделяется новый канал.
max-streamsint0<int>Максимум потоков на канал.

Исходный код: adapter/outbound/vmess.go:156-163 · зафиксировано на v1.19.29 (e26714a)

xhttp-opts

Блок XHTTP несёт 23 поля, совпадающих со SplitHTTP в Xray. Чаще всего используются path, host, mode, а также поля x-padding-* и поля сессий для шейпинга трафика. Настройки переиспользования лежат во вложенном подблоке reuse-settings; асимметричная конфигурация загрузки — в download-settings. Полная структура — на странице VLESS — mihomo (она общая для VLESS и остальных прокси с поддержкой XHTTP).

Примеры

WebSocket — типичная форма для VMess:

yaml
proxies:
  - name: vmess-ws
    type: vmess
    server: example.com
    port: 443
    uuid: <UUID>
    cipher: auto
    network: ws
    tls: true
    servername: example.com
    ws-opts:
      path: /vm
      headers:
        Host: example.com
      max-early-data: 2048
      early-data-header-name: Sec-WebSocket-Protocol

gRPC + REALITY (VLESS):

yaml
proxies:
  - name: vless-grpc-reality
    type: vless
    server: example.com
    port: 443
    uuid: <UUID>
    flow: xtls-rprx-vision
    tls: true
    servername: www.cloudflare.com
    client-fingerprint: chrome
    network: grpc
    reality-opts:
      public-key: <base64>
      short-id: <hex>
    grpc-opts:
      grpc-service-name: GunService

V2Ray HTTP-upgrade (альтернатива WS, меньше нагрузка на CPU):

yaml
proxies:
  - name: vmess-httpupgrade
    type: vmess
    server: example.com
    port: 443
    uuid: <UUID>
    cipher: auto
    network: ws
    tls: true
    servername: example.com
    ws-opts:
      path: /up
      v2ray-http-upgrade: true
      v2ray-http-upgrade-fast-open: true

Примечания

  • network: ws в mihomo покрывает и стандартный WebSocket, и транспорт HTTP-upgrade в стиле V2Ray (через переключатель v2ray-http-upgrade в ws-opts). Отдельного значения network: httpupgrade не существует.
  • network: http — это устаревшая V2Ray HTTP-маскировка (чистый HTTP/1.1 с фиктивными методами). Не путайте с network: h2 (настоящий HTTP/2) и network: xhttp (современное XTLS-кадрирование Xray).
  • http-opts.path и http-opts.headers рандомизируются на каждый запрос — mihomo выбирает по одному значению из каждого списка для каждого нового соединения.
  • ws-opts.v2ray-http-upgrade-fast-open экономит один RTT, отправляя полезную нагрузку клиента вместе с запросом upgrade. Серверы, буферизующие весь upgrade до ответа (некоторые балансировщики нагрузки), отклонят такой запрос; проверьте оба варианта перед развёртыванием.
  • xhttp-opts — путь совместимости с Xray для клиентов, которым нужно общаться с серверами Xray network: splithttp. Имена полей в точности совпадают со SplitHTTP в Xray (в kebab-case).

Сравнение с другими ядрами

  • Xray-core использует streamSettings.network плюс блок *Settings для каждого транспорта. Есть варианты TCP с обфускацией заголовков, mKCP и SplitHTTP, которые mihomo под этими именами не предоставляет. См. Транспорт — Xray-core.
  • sing-box использует полиморфный блок transport: { type, ... }, встроенный в каждый прокси. См. Транспорт — sing-box.

Исходный код: adapter/outbound/vmess.go:145-172 · v1.19.29 (e26714a)

Core Tutorial от Argsment