Skip to content

Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, brutalDown, udpHop (ports & interval), etc.#5772

Merged
RPRX merged 20 commits intoXTLS:mainfrom
LjhAUMEM:quicParams
Mar 9, 2026
Merged

Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, brutalDown, udpHop (ports & interval), etc.#5772
RPRX merged 20 commits intoXTLS:mainfrom
LjhAUMEM:quicParams

Conversation

@LjhAUMEM
Copy link
Copy Markdown
Contributor

@LjhAUMEM LjhAUMEM commented Mar 7, 2026

No description provided.

@RPRX RPRX changed the title quicParams Hysteria transport: Move congestion, etc. to Finalmask's quicParams Mar 7, 2026
@RPRX RPRX changed the title Hysteria transport: Move congestion, etc. to Finalmask's quicParams Hysteria & XHTTP/3: Use Finalmask's quicParams to set congestion, etc. Mar 7, 2026
@RPRX RPRX changed the title Hysteria & XHTTP/3: Use Finalmask's quicParams to set congestion, etc. Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, etc. Mar 7, 2026
@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

@LjhAUMEM 解决一下 conflict

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 7, 2026

@LjhAUMEM 解决一下 conflict

done

null added 2 commits March 8, 2026 01:18
@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

Ready 了吗

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 7, 2026

有点唐突不过 ready 还是没问题,现在默认 MemoryStreamConfig.QuicParams 不为 nil,有几个 nil 的判断可以去掉,但是先这样吧

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 7, 2026

不对 test 还是失败,让我再看看

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

要不要给原配置项 congestion up down 的位置加个 warning 提示没起作用,主要是 v2rayN 还没适配

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 7, 2026

要不要给原配置项 congestion up down 的位置加个 warning 提示没起作用,主要是 v2rayN 还没适配

done,已经是第二次 break hy 的配置了

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

刚加的东西 break 一下很正常,不然时间久了更不好改

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

这个 PrintRemovedFeatureError 会返回错误,改成手写 Warning 吧,可连通性比暴力发包更重要吧我觉得

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

https://t.me/projectXtls/1642

该来的终究还是会来,把 Hy2 传输层的 udphop 改成 Finalmask 的 porthop 吧,支持 TCP 与 UDP,或许另开一个 PR?

至于 addresshop 暂时没必要吧,Finalmask v4/v6 分流后又出现了 v4/v6 之分

@Fangliding
Copy link
Copy Markdown
Member

我没记错的话这个hy udp hop还是魔改过quic库的连接迁移机制才让它好使的

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

那应该是要依赖魔改 quic-go 库的,不知道到 Finalmask 这里搞它方不方便,ctx 一切皆有可能

总之 porthop 这功能还是放到 fm、让所有协议都能用比较合适

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 7, 2026

REALITY 版 quic-go 也可以提上日程了,不过偷别人的话特征会比较明显,大多数网站并不用 quic-go,以及其它一些问题

@LjhAUMEM LjhAUMEM closed this Mar 8, 2026
@LjhAUMEM LjhAUMEM reopened this Mar 8, 2026
@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 8, 2026

往下滑怎么点到 close 了

udphop 也移了,待我测试下

顺便在这里 bump 了 quic

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 8, 2026

好消息,udphop 移植成功了,坏消息,congestion 实际并没有生效,似乎是和客户端使用的不是 stream 有关

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 8, 2026

奇怪,OnPacketSent 打印又都触发了,但是速度为什么相差这么大

@LjhAUMEM LjhAUMEM closed this Mar 8, 2026
@LjhAUMEM LjhAUMEM reopened this Mar 8, 2026
@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 8, 2026

这个网页,怎么 tab 切换回来又关了

先这样吧,congestion 谁想 debug 再配置 debug: true 对比下

测试 udphop 的配置

{
  "log": { "loglevel": "debug" },
  "inbounds": [
    {
      // "listen": "127.0.0.1",
      "port": 1081,
      "protocol": "hysteria",
      "settings": {
        "version": 2,
        "clients": [
          {
            "auth": "5783a3e7-e373-51cd-8642-c83782b807c5"
          }
        ]
      },
      "streamSettings": {
        "network": "hysteria",
        "hysteriaSettings": {
          "version": 2
        },
        "security": "tls",
        "tlsSettings": {
          "alpn": ["h3"],
          "certificates": [
            {
              "certificateFile": "ca.crt",
              "keyFile": "ca.key"
            }
          ]
        },
        "finalmask": {
          "quicParams": {
            "congestion": "force-brutal",
            "debug": true,
            "brutalUp": "100mbps"
          }
        }
      }
    },
    {
      // "listen": "127.0.0.1",
      "port": 1082,
      "protocol": "hysteria",
      "settings": {
        "version": 2
      },
      "streamSettings": {
        "network": "xhttp",
        "security": "tls",
        "tlsSettings": {
          "alpn": ["h3"],
          "certificates": [
            {
              "certificateFile": "ca.crt",
              "keyFile": "ca.key"
            }
          ]
        },
        "finalmask": {
          "quicParams": {
            "congestion": "force-brutal",
            "debug": true,
            "brutalUp": "100mbps"
          }
        }
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    }
  ]
}

/*
iptables -t nat -L -n -v --line-numbers

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:21000 -j REDIRECT --to-ports 1081
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 21000:22000 -j REDIRECT --to-ports 1082

iptables -t nat -D PREROUTING 1

iptables -t nat -F
*/
{
  "log": { "loglevel": "debug" },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 1080,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "hysteria",
      "settings": {
        "version": 2,
        "address": "127.0.0.1",
        "port": 1081
      },
      "streamSettings": {
        "network": "hysteria",
        "hysteriaSettings": {
          "version": 2,
          "auth": "5783a3e7-e373-51cd-8642-c83782b807c5"
        },
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com",
          "alpn": ["h3"],
          "pinnedPeerCertSha256": "f91e9cf7e75e42b020eb974e44302430157bd665a2c402e6dc3c7fd9fb7d7e1b"
        }
        ,"finalmask": {
          "quicParams": {
            "congestion": "reno",
            "udpHop": {
              "ports": "20000-21000",
              "interval": "5-10"
            }
          }
        }
      }
    }
  ]
}
{
  "log": { "loglevel": "debug" },
  "inbounds": [
    {
      "listen": "127.0.0.1",
      "port": 1080,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "hysteria",
      "settings": {
        "version": 2,
        "address": "127.0.0.1",
        "port": 1082
      },
      "streamSettings": {
        "network": "xhttp",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com",
          "alpn": ["h3"],
          "pinnedPeerCertSha256": "f91e9cf7e75e42b020eb974e44302430157bd665a2c402e6dc3c7fd9fb7d7e1b"
        }
        ,"finalmask": {
          "quicParams": {
            "congestion": "reno",
            "udpHop": {
              "ports": "21000-22000",
              "interval": "5-10"
            }
          }
        }
      }
    }
  ]
}

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 9, 2026

啊这放 quicParam 里吗,那不是只有 quic 才能用了,其实我本来想的是改名叫 porthop 然后给 tcp/udp 加一层,特征是明显的但从 Xray 功能完备复用的角度来说会更优,但是 quic 的 hop 似乎要依赖于魔改库?@Fangliding 你怎么看

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

LjhAUMEM commented Mar 9, 2026

本来就是在 quic 上的特性吧

kcp 好像还不能直接用,服务端好像会把不同端口来源当作不同 session

@Fangliding
Copy link
Copy Markdown
Member

啊这放 quicParam 里吗,那不是只有 quic 才能用了,其实我本来想的是改名叫 porthop 然后给 tcp/udp 加一层,特征是明显的但从 Xray 功能完备复用的角度来说会更优,但是 quic 的 hop 似乎要依赖于魔改库?@Fangliding 你怎么看

这么说吧 源端口跳跃基于 QUIC 连接迁移特性 但是它会重置阻塞控制状态(链路都变了肯定重新计算宽带) 但是 udp hop 肯定不是期望的 十几秒重置一次要重新探测宽带这谁受得了 所谓魔改就是让它不重置状态

@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 9, 2026

原来它这个端口跳跃是带上了现有连接的迁移而不是单纯的新连接才用新端口吗,那好像也还行

话说 port 改名 ports 会不会顺眼些

@RPRX RPRX changed the title Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, etc. Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, udpHop, etc. Mar 9, 2026
@RPRX RPRX changed the title Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, udpHop, etc. Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, brutalDown, udpHop, etc. Mar 9, 2026
@RPRX RPRX changed the title Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, brutalDown, udpHop, etc. Hysteria & XHTTP/3: Unified Finalmask's quicParams to set congestion, brutalUp, brutalDown, udpHop (ports & interval), etc. Mar 9, 2026
@RPRX
Copy link
Copy Markdown
Member

RPRX commented Mar 9, 2026

先这样吧,感觉事情逐渐变得合理,因为 Finalmask 的定位本来就是“不可靠”,这又是 brutal 又是 udpHop 的就很符合该定位

这里的 interval 单位是秒,fm 的 fragment 和 noise 的 delay 单位是毫秒,也很合理

port 的话只有这里加了 s,入站的通常只监听一个,出站的只能写一个,路由任何字段名都单数,等把入站改了给它加个别名

@RPRX RPRX merged commit 0321cdd into XTLS:main Mar 9, 2026
39 checks passed
@fuilloi

This comment was marked as resolved.

1 similar comment
@fuilloi
Copy link
Copy Markdown

fuilloi commented Mar 10, 2026

加了brutalUp/Down: "",没加congestion或者为空,无法正常使用。🌚

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

加了brutalUp/Down: "",没加congestion或者为空,无法正常使用。🌚

提供下配置

drovosek229 pushed a commit to drovosek229/Xray-core that referenced this pull request Mar 16, 2026
…on`, `brutalUp`, `brutalDown`, `udpHop` (`ports` & `interval`), etc. (XTLS#5772)

XTLS#5772 (comment)
@MoRanYue
Copy link
Copy Markdown

(使用XHTTP(ALPN=HTTP/3)时,指定congestionbrutal,是否会存在类似Hysteria传输方式的“带宽协商”过程呢?)

@LjhAUMEM
Copy link
Copy Markdown
Contributor Author

xp3 只有 force-brutal

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants