(
Vision Seed(测试)
Xray-core此次的25.12.8更新中,推出了“Vision Seed”功能。基本上,它使得“XTLS Vision”中 填充策略的具体数值可自定义,以及加入“预连接”功能以改善使用体验。
可配置的“XTLS Vision”
“XTLS Vision”是1种解决“TLS中的TLS”特征的解决方案:为已由外部TLS隧道加密的,其内部TLS握手数据包 添加填充数据,且不再次加密已被内部TLS隧道 所加密的数据。不过,先前其填充策略并不是可配置的(此缺陷事实无伤大雅,大多数情况下,用户完全不必自定义具体数值)。因此,AnyTLS协议将基本与“VLESS+可配置的Vision+Raw+TLS”的使用效果无异呀。
此次更新允许用户更改“XTLS Vision”进行填充时的4个参数。不过,在此之前,或许需要了解“XTLS Vision”的部分逻辑呀。
使用“XTLS Vision”时,Xray-core将于收到数据包后 检查其“是否属于TLS协议”,以及“是否属于TLS协议的握手阶段”,若两者皆是,且实际数据长度大于某值,“XTLS Vision”将容许填充更多数据(被称为“长填充”);若仅前者满足,则仅容许正常的填充字节数。对于以上过程 有4个参数,便是此次允许用户配置的参数啦:
- 长填充的触发阈值,默认值:
900。 - 长填充的最大填充字节数,默认值:
500。 - 长填充的额外填充字节数,默认值:
900。 - 正常的最大填充字节数,默认值:
256。
“实际填充字节数最大值”可如此计算:
- 当“实际数据长度”小于“长填充的触发阈值”,且能够进行“长填充”:
- 实际填充字节数最大值 = 长填充的最大填充字节数 + 长填充的额外填充字节数。
- 否则:
- 实际填充字节数最大值 = 正常的最大填充字节数。
值得注意,“最大填充字节数”意味着“实际填充字节数将是随机生成的”,目前并不类似“VLESS加密”配置,允许用户设置“最小填充字节数”呀。
预连接(Pre-connecting)
它基本上是1个十分简单的概念:“预先建立连接,以便未来的通讯能够快速开始”。无论是否需要通讯,客户端始终与服务器建立并维护1条或多条连接。它最初属于浏览器中对HTTP/2的优化机制[1],能够消除实际通讯前 TCP握手与TLS握手造成的延迟,是1个较为简单的功能。
请不要将其与“多路复用”[2]混淆——“多路复用”允许将多个代理连接[3]于单个实际连接(通常为TCP连接或QUIC连接)中传输,亦能够 部分消除TCP与TLS的握手延迟影响。但是,“多路复用”并不会预先建立连接。因此,当连接池中没有任何连接时,若需要传输更多数据,仍然需要经历TCP握手与TLS握手。不过,由于XHTTP传输方式的“多路复用”通常总是能够维持多个连接,因此“连接池没有连接”的情况通常较少发生,其使用时“降低延迟”效果 应当与此次的“预连接”更新几乎相同。
这里认为,此次更新的主要受益者为 大型机场节点:尽管XHTTP传输方式的“多路复用”已能够降低延迟,但是,XHTTP传输方式并不使用许多操作系统的“向量化IO(readv与writev)”API和“零复制数据移动(splice)”API,使得XHTTP传输方式的开销 相比Raw(TCP)传输方式更高。对于机场节点,此次更新意味着 单个服务器能够服务更多用户,并同时得到与XHTTP传输方式几乎同等的体验改善(不过,“通过CDN”仍然仅限于XHTTP、WebSocket和gRPC等传输方式呀)。
配置
当前的配置文件形式仍处于测试阶段,预期于下次更新中更改。
“XTLS Vision”基本上于“VLESS+Raw+Reality”组合中使用,便从此开始:
{
"log": {
"loglevel": "info"
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "blackhole"
}
]
},
"inbounds": [
{
"tag": "vless_vision_raw_reality",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "UUID",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"target": "www.suny.edu:443",
"serverNames": [
"www.suny.edu"
],
"shortIds": [
""
],
"privateKey": "X25519私钥",
"mldsa65Seed": "ML-DSA-65种子"
},
"sockopt": {
"tcpcongestion": "bbr",
"tcpMptcp": true
}
}
}
],
"outbounds": [
{
"tag": "freedom",
"protocol": "freedom"
},
{
"tag": "blackhole",
"protocol": "blackhole"
}
]
}
欲为单个用户设置以上所述的4个参数,只需按序置入testseed数组中:
{
"flow": "xtls-rprx-vision",
"testseed": [
800,
300,
700,
300
]
}
为以上入站编写1段 用于客户端的配置:
{
"log": {
"loglevel": "info"
},
"inbounds": [
{
"tag": "socks",
"listen": "::1",
"port": 10000,
"protocol": "socks",
"settings": {
"udp": true
}
}
],
"outbounds": [
{
"tag": "vless_vision_raw_reality",
"protocol": "vless",
"settings": {
"address": "代理服务器地址",
"port": 443,
"id": "UUID",
"flow": "xtls-rprx-vision"
},
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"serverNames": "www.suny.edu",
"shortId": "",
"fingerprint": "edge",
"password": "X25519公钥",
"mldsa65Verify": "ML-DSA-65验证(可选)"
}
}
}
]
}
对于出站,同样能够自定义上述4个参数:
{
"settings": {
"flow": "xtls-rprx-vision",
"testseed": [
900,
400,
900,
256
]
}
}
对于“预连接”,只需于出站的settings对象中,设置testpre字段为“期望预连接的连接数量”便可:
{
"settings": {
"testpre": 5
}
}
以上配置意味着:当Xray-core开启时,向代理服务器预先建立并维护5个连接。
DNS优化
于25.12.8版本中,贡献者@Meo597提供了数个DNS与路由相关的优化。性能优化包括“DNS缓存重构”与“路由匹配器优化”,而增加的配置项如下所示:
并行查询(Parallel Query)
当配置文件中的dns对象 存在多个DNS服务器配置时,先前首先请求第1个符合需求的DNS服务器;若回应的IP地址不符合需求[4],则尝试进行回落,使用其它服务器。基本上,对于“使用DNS配置进行境内/境外IP地址分流”使用者,此方案可能显著增加 进行DNS查询所消耗的时间。
若开启此次更新的“并行查询”功能,Xray-core将根据配置项 对所有DNS服务器进行分类,基本上,它将拥有相同配置(通常使用domains与expectedIPs配置)的服务器分为1组。当进行DNS查询时,对每个DNS服务器发起查询请求,并于其所在的组内进行竞速,首先响应且响应符合规则者 将被采纳,能够很好地改善DNS查询的速度呀。
配置
开启“并行查询”十分简单,只需于dns对象中,将enableParallelQuery的值设置为true:
{
"dns": {
"enableParallelQuery": true
}
}
乐观缓存(Optimistic Caching)
对于DNS查询,几乎所有DNS客户端在其缓存过期前,采纳先前缓存的结果;当查询请求域名的缓存过期,将首先请求DNS服务器,再进行响应。若启用“乐观缓存”,即便发现缓存过期,依然首先使用缓存,同时请求DNS服务器并更新缓存。
配置
它为dns对象与其中servers数组的对象增加2个字段:
serveStale:设置为true意味着“开启乐观缓存”。默认值为false。serveExpiredTTL:缓存存活时间(单位:秒),0意味着永远存活。默认值为0。
例如以下配置文件:
{
"dns": {
"servers": [
{
"address": "https://1.1.1.1/dns-query",
"serveStale": true,
"serveExpiredTTL": 86400
}
],
"serveStale": true,
"serveExpiredTTL": 3600
}
}
当serveExpiredTTL位于servers数组的对象中时,其默认值将为dns对象中的serveExpiredTTL,否则为0。
)
此处具体指
<link rel="preconnect">元素,“早期提示(Early Hints)”的1部分。 ↩︎它存在于HTTP/2与QUIC协议中;Xray-core中 XHTTP传输方式的XMUX,与先前的“Mux.Cool”。 ↩︎
“子连接(Sub-connection)”。 ↩︎
大多数时候,由
expectedIPs配置项决定,它将排除DNS响应中“不属于此配置项中的IP地址”。 ↩︎