Протокол Mux.Cool - это мультиплексирующий транспортный протокол, используемый для передачи нескольких независимых потоков данных по одному установленному потоку данных.
Одно соединение Mux.Cool может передавать несколько подсоединений, каждое из которых имеет свой собственный идентификатор и состояние. Процесс передачи состоит из кадров (Frame), каждый из которых используется для передачи данных определенного подсоединения.
Когда требуется соединение и нет доступного существующего соединения, клиент инициирует новое соединение с сервером, которое далее называется "главным соединением".
1. Одно главное соединение может использоваться для отправки нескольких подсоединений. Клиент может самостоятельно определять количество подсоединений, которое может нести главное соединение.
2. Для нового подсоединения клиент должен отправить состояние `New`, чтобы уведомить сервер о создании подсоединения, а затем использовать состояние `Keep` для передачи данных.
3. Когда подсоединение завершается, клиент отправляет состояние `End`, чтобы уведомить сервер о закрытии подсоединения.
4. Клиент может самостоятельно решать, когда закрыть главное соединение, но должен убедиться, что сервер также поддерживает соединение.
5. Клиент может использовать состояние KeepAlive, чтобы предотвратить закрытие главного соединения сервером.
- 0x01: TCP, указывает, что трафик текущего подсоединения должен быть отправлен на целевой адрес по TCP.
- 0x02: UDP, указывает, что трафик текущего подсоединения должен быть отправлен на целевой адрес по UDP.
- Тип адреса T:
- 0x01: IPv4
- 0x02: доменное имя
- 0x03: IPv6
- Адрес A:
- Если T = 0x01, A - это 4-байтовый адрес IPv4;
- Если T = 0x02, A - это 1 байт длины (L) + L байт доменного имени;
- Если T = 0x03, A - это 16-байтовый адрес IPv6;
- Global ID (XUDP):
- Клиент вычисляет глобально уникальный идентификатор исходного кортежа UDP, который сервер использует, чтобы гарантировать, что при переподключении XUDP будет использоваться тот же порт для связи с целевым адресом.
- Если Opt(D) включена, данные, переносимые этим кадром, должны быть отброшены.
- ID может быть случайным значением.
## Применение
Протокол Mux.Cool не зависит от базового протокола и теоретически может использовать любое надежное потоковое соединение для передачи данных протокола Mux.Cool.
В протоколах, ориентированных на целевой адрес, таких как Shadowsocks и VMess, при установлении соединения должен быть указан целевой адрес.
Для обеспечения совместимости протокол Mux.Cool определяет адрес "v1.mux.cool". То есть, если целевой адрес главного соединения совпадает с этим адресом, пересылка осуществляется в режиме Mux.Cool, в противном случае пересылка осуществляется традиционным способом. (Примечание: это внутренняя метка программы, VMess и VLESS не отправляют адрес "v1.mux.cool" в пакетах данных).