# SplitHTTP Используется для загрузки с помощью HTTP-фрагментированной передачи, загрузка осуществляется с помощью нескольких HTTP POST-запросов. Может использоваться через CDN, не поддерживающие WebSocket, но есть несколько требований: - CDN должен поддерживать HTTP-фрагментированную передачу и потоковые ответы без буферизации. Ядро будет отправлять `X-Accel-Buffering: no` и `Content-Type: text/event-stream`, чтобы сообщить CDN об этом, но CDN должен соблюдать этот заголовок. Если промежуточный сервер не поддерживает потоковые ответы и зависает, передача, скорее всего, не будет работать. Цель та же, что и у V2fly Meek, но благодаря использованию фрагментированной загрузки скорость загрузки выше, а скорость отдачи оптимизирована, но все еще очень ограничена, поэтому к HTTP-прокси предъявляются более высокие требования (см. выше). `SplitHTTP` также принимает заголовок `X-Forwarded-For`. ## SplitHttpObject `SplitHttpObject` соответствует элементу `splithttpSettings` в конфигурации транспорта. ```json { "path": "/", "host": "xray.com", "headers": { "key": "value" }, "maxUploadSize": 1000000, "maxConcurrentUploads": 10 } ``` > `path`: string Путь HTTP-протокола, используемый SplitHTTP, значение по умолчанию — `"/"`. > `host`: string Хост, отправляемый в HTTP-запросе SplitHTTP, по умолчанию пуст. Если значение на стороне сервера пустое, значение хоста, отправленное клиентом, не проверяется. Если это значение указано на стороне сервера или `host` указан в `headers`, то проверяется соответствие хоста запроса клиента. Приоритет выбора хоста для отправки клиентом: `host` > `headers` > `address`. > `headers`: map \{string: string\} Пользовательские HTTP-заголовки, пары ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение является строкой. > `maxUploadSize`: int Максимальный размер фрагмента загрузки в байтах, по умолчанию 1 МБ. Это значение должно быть меньше максимального размера тела запроса, разрешенного CDN или другим обратным HTTP-прокси, иначе будет выдаваться ошибка HTTP 413. Увеличение этого значения может увеличить скорость загрузки. > `maxConcurrentUploads`: int Максимальное количество одновременных загрузок, по умолчанию 10, соединения будут использоваться повторно, насколько это возможно. Если соединение нестабильно или потребление памяти на сервере слишком велико, попробуйте уменьшить это значение. Значение, установленное клиентом, должно быть меньше, чем на сервере, иначе это может привести к проблемам с подключением. ## Детали протокола Подробное обсуждение см. [#3412](https://github.com/XTLS/Xray-core/pull/3412) и [#3462](https://github.com/XTLS/Xray-core/pull/3462). Ниже приведено краткое описание и требования к совместимой реализации: 1. Загрузка начинается с `GET /`. Сервер немедленно отвечает `200 OK` и `Transfer Encoding:chunked` и немедленно отправляет двухбайтовую полезную нагрузку, чтобы принудительно обновить заголовки HTTP-прокси. 2. Отправка данных начинается с `POST //`. `seq` действует как порядковый номер TCP, начиная с 0, пакеты данных могут отправляться одновременно, сервер должен пересобрать данные по порядковому номеру. Порядковый номер не следует сбрасывать. Клиент может свободно выбирать порядок открытия исходящих и нисходящих запросов, любой из них может инициировать сеанс, но соединение `GET` должно быть открыто в течение 30 секунд, иначе сеанс будет разорван. 4. Запрос `GET` будет оставаться открытым до тех пор, пока соединение не будет разорвано, и сервер, и клиент могут закрыть соединение. Конкретное поведение зависит от версии HTTP. Рекомендации: * Не ожидайте, что CDN будет правильно передавать все заголовки, цель этого протокола — обойти CDN, не поддерживающие WS, а поведение этих CDN обычно не очень дружелюбное. * Следует предполагать, что все HTTP-соединения не поддерживают потоковые запросы, поэтому размер каждого пакета, отправляемого исходящим соединением, должен определяться с учетом задержки, пропускной способности и ограничений самого промежуточного сервера (аналогично MTU TCP и алгоритму Нейгла). * Что касается версий HTTP, ядро временно не поддерживает h2c, поэтому при отсутствии HTTPS Xray отправляет только запросы http/1.1. Во избежание дополнительных сложностей, связанных с согласованием ALPN, клиент Xray использует h2 при использовании HTTPS. Вы также можете вручную указать alpn как http/1.1 или h3 в настройках TLS клиента, чтобы использовать соответствующую версию HTTP для отправки запросов. Сервер Xray, с другой стороны, совместим со всеми типами входящих соединений, включая h2c (h3 пока не поддерживается), поскольку входящие соединения могут использовать различные типы запросов из-за перенаправления через промежуточные узлы. ## BrowserDialer При использовании HTTPS этот транспорт также поддерживает [BrowserDialer](../features/browser_dialer.md).