Короткий ответ: в xhttp нет «магического» параметра extra, который бы внутри одного подключения делил трафик на отдельные потоки upload и download. Если вам нужно явное разделение, то делается не на уровне «extra», а на уровне двух отдельных подключений (двух путей/endpoint’ов) — сервер слушает два xhttp‑пути, клиент делает два outbound’а и вы направляете нужный трафик на тот или иной outbound.
Ниже — что важно понимать и как это реализовать.
1) Что технически возможно и что — нет
- Одно TCP/QUIC/HTTP‑подключение всегда двунаправленное; «upload» и «download» идут по одним и тем же потокам протокола. Нельзя внутри одного xhttp-подключения заставить сервер создавать два отдельных направления и затем разделять их в настройках extra.
- Можно создать два разных соединения (разные HTTP path / разные порты / разные подписки Reality) и отправлять часть трафика в одно соединение, а часть — в другое. Это и называется «отдельные потоки» в практическом смысле.
2) Как реализовать (схема)
- На сервере: создать два inbound (или один inbound, который обрабатывает несколько path’ов и распределяет) / или настроить один vless inbound, но обрабатывать разные xhttp path’ы как разные «каналы» (удобнее — два входа с разными path/port).
- На клиенте: создать два outbound (например, vless-up и vless-down) с разными streamSettings.xhttpSettings.path (и при необходимости разными realitySettings).
- Маршрутизация: в конфиге клиента направлять нужный трафик на соответствующий outbound. Важно: вы не можете автоматически по «направлению пакета» перенаправлять — нужно иметь правило, основанное на приложении / портах / IP / доменах или ручном выборе клиента.
3) Пример идеи (упрощённо, псевдо‑конфиг)
- Сервер (два path):
- inbound A: network = "xhttp", xhttpSettings.path = "/up", realitySettings = { ... }
- inbound B: network = "xhttp", xhttpSettings.path = "/down", realitySettings = { ... }
- Клиент (два outbound):
- outbound "vless-up": vless -> адрес:сервер, streamSettings.network = "xhttp", xhttpSettings.path = "/up", realitySettings = { ... }
- outbound "vless-down": аналогично, path = "/down"
- Маршрутизация на клиенте:
- правила routing -> outboundTag = "vless-up" для трафика, который вы считаете «upload» (например, исходящие подключения от вашего приложения A или определённые порты)
- outboundTag = "vless-down" для остальных
4) Что такое поле extra
- В разных форках (v2ray/xray/xtls) структура конфигурации немного отличается. Обычно «extra» — это место для дополнительных полей, специфичных для реализации, например шаблонов request/response в xhttp, параметры reality (serverNames/privateKey) и т.п. Но оно не управляет разделением направлений трафика. Конкретные допустимые подполя зависят от версии core (xray/v2ray) — лучше смотреть документацию вашей версии.
5) Резюме и предложение
- Если вы хотите именно «отдельные потоки upload/download», делайте два пути/две конфигурации и маршрутизируйте трафик между ними.
- Если хотите, пришлите: 1) версию (xray или v2ray и версия), 2) полный пример вашего текущего server/client config и 3) что вы понимаете под «upload» и «download» (какие приложения/порты/условия). Тогда пришлю конкретный рабочий пример конфигурации (сервер + клиент) с reality + xhttp и поясню, какие поля и где ставить (включая пример «extra» для вашей версии).