Files
sing-box-rr-edition/sing-box-rr/docs/configuration/outbound/urltest.zh.md
T

7.2 KiB

结构

{
  "type": "urltest",
  "tag": "auto",
  
  "outbounds": [
    "proxy-a",
    "proxy-b",
    "proxy-c"
  ],
  "url": "",
  "interval": "",
  "tolerance": 50,
  "idle_timeout": "",
  "strategy": "latency",
  "networkquality_ttl": "",
  "networkquality_target": "apple",
  "networkquality_config_url": "",
  "networkquality_download_url": "",
  "networkquality_upload_url": "",
  "networkquality_probe_url": "",
  "interrupt_exist_connections": false
}

字段

outbounds

==必填==

用于测试的出站标签列表。

url

用于测试的链接。默认使用 https://www.gstatic.com/generate_204。

interval

测试间隔。 默认使用 3m。

tolerance

以毫秒为单位的测试容差。 默认使用 50。

idle_timeout

空闲超时。默认使用 30m。

strategy

选择策略。可用值为 latency 和 networkquality。

默认的 latency 策略保持原有 URLTest 行为。networkquality 策略会在健康的出站中选择组合分数最高的成员:下载容量(比特/秒) / URLTest 延迟(毫秒)。零延迟按一毫秒处理;分数相同时选择延迟更低的成员。上传容量也会测量并返回,但不参与选择。当没有可用的网络质量结果时,将回退到延迟选择。

networkquality_ttl

网络质量测量的缓存有效期和自动测试间隔。默认使用 30m,小于 30m 的值会被拒绝。

使用 networkquality 策略时,首次自动测试会在初始延迟检查完成后启动。之后,每次自动测试完成并经过此间隔后,会启动下一次自动测试。在运行时从 latency 切换到 networkquality 也会立即启动测试,并从该次测试完成后重新计算间隔。latency 策略下自动计时器保持停止。自动测试使用默认最大运行时间,并禁用 HTTP/3。

同一 sing-box 实例中的所有 URLTest 组共享成功的测量结果。代理的规范化 server:port、测试目标、最大运行时间和 HTTP/3 模式相同时,在此间隔内复用同一次测量。整个 sing-box 实例同一时刻只执行一个实际网络质量测试;不同参与者和组在同一队列中等待。上一次成功的下载容量无论已经过去多久,都仍可参与选择。如果后续刷新失败,会返回本次错误,同时保留先前的容量及其原始时间戳,直到新的成功刷新替换它们。代理身份仅使用 server:port;凭据和传输参数会被有意忽略。

没有 URLTest 延迟结果的成员会被视为不可用,并且不会向网络质量服务发起测速。该成员仍会获得包含 "error": "URLTest delay unavailable" 的结果记录,因此完整结果图仍覆盖组内所有成员。如果该成员已有先前成功测得的容量,则会保留容量及其原始时间戳;缺少延迟时它不能被选中,后续 URLTest 恢复延迟后,保留的容量会重新参与选择。

也可以通过 Clash API 运行网络质量测试:

  • 使用 {"maxRuntimeSeconds":20,"http3":false} 请求 POST /group/{name}/networkquality,依次处理组内所有成员,只对具有 URLTest 延迟的成员测速,并返回下载和上传结果。
  • GET /group/{name}/networkquality 返回最近的结果,以及当前组测试的 progress.current / progress.total。current 是当前正在处理的成员序号(从一开始),total 在测试开始时根据组快照固定。没有测试运行时两者均为零。
  • 使用 {"strategy":"networkquality"} 请求 PUT /group/{name}/strategy 可在运行时切换策略。使用 latency 可切回延迟策略。

组测试期间,每个成员完成后,其结果会立即通过 GET /group/{name}/networkquality 可见。首次测试的部分结果绝不参与路由选择;在当前组的所有成员都有结果之前,仍由常规 URLTest 按延迟选择。完整结果可用于组合评分,但网络质量测试本身不会更改选中的出站;下一次完整的 URLTest 组更新才会应用它。单个 Clash API 延迟响应会继续更新每个成员的实时延迟历史,但不会切换 networkquality 组,也不会更改为其选中 now 显示的已提交延迟。组延迟仅在下一次完整 URLTest 组更新时统一更新,从而避免仪表板显示部分刷新的延迟结果。后续测速刷新期间,上一次完整结果会继续参与选择,直到新的完整结果替换它。如果测试被取消,已经发布的成员结果仍然可见,但不会替换用于选择的完整结果。

如果测试服务返回 HTTP 429,参与者结果会包含 "rateLimited": true 和错误信息。上一次成功测量的容量值及其原始时间戳会被保留,并且无论结果的年龄如何都仍可参与选择。限流响应也会开始新的 TTL 间隔,因此重复的 API 请求不会立即再次请求测试服务。

networkquality_target

用于网络质量测试的服务。可用值:

  • apple(默认):获取公开的 Apple Mensura Config v1。
  • cloudflare:使用内置的 Cloudflare 测速端点。
  • custom:从 networkquality_config_url 获取 Config v1,或使用下面的直接下载和上传 URL。

此设置不会改变普通延迟测试使用的 url。

networkquality_config_url

custom 网络质量目标使用的 Config v1 URL。设置此字段而不设置 networkquality_target 时,会自动选择 custom。

仅填写主机名或使用根路径 URL 时,会解析为 https://host/.well-known/nq。包含非根路径的 URL 会保持不变。

此字段不能与 networkquality_download_url、networkquality_upload_url 或 networkquality_probe_url 同时使用。

如需稳定且可控的测量,可部署 network-quality/goserver,然后在此填写其地址。例如:

{
  "networkquality_target": "custom",
  "networkquality_config_url": "https://nq.example.com"
}

networkquality_download_url

custom 目标的直接下载端点。必须与 networkquality_upload_url 一起设置。未设置 networkquality_target 时,直接 URL 会自动选择 custom。

该端点应返回足够大的响应体,并在测量期间支持并发请求。

networkquality_upload_url

custom 目标的直接上传端点。必须接受使用分块 application/octet-stream 请求体的 HTTP POST 请求。

networkquality_probe_url

直接 custom 模式中用于延迟和响应性探测的可选小型下载端点。如果为空,探测也会使用 networkquality_download_url。建议使用独立的小响应,以避免每次探测都传输完整下载负载。

直接下载、上传和探测 URL 必须使用同一主机。

{
  "networkquality_target": "custom",
  "networkquality_download_url": "https://speed.example.com/download",
  "networkquality_upload_url": "https://speed.example.com/upload",
  "networkquality_probe_url": "https://speed.example.com/probe"
}

interrupt_exist_connections

当选定的出站发生更改时,中断现有连接。

仅入站连接受此设置影响,内部连接将始终被中断。