# cf-latency-pro

> 优选 Cloudflare IP 精测工具 —— 真实 SNI 握手验证 + 下载带宽实测，本地运行，零依赖。

大多数优选 IP 工具只做 TCP ping——能 ping 通不代表你的流量真能走通那条链路。
本工具用**你自己 Worker 域名做真实 SNI 的 TLS 握手**，验证的才是节点真实使用时的路由；
再配合 Cloudflare 官方测速端点实测下载带宽。跑在你自己的网络环境里，测出来的就是真实体验。

## 特性

- 🖐️ **真实 SNI 握手**：自定义 SNI 做 TLS 握手，验证节点真实链路而非仅边缘可达
- 📥 **下载带宽实测**：从 `speed.cloudflare.com` 拉数据测吞吐，握手快不代表带宽快
- 🔀 **三种模式**：握手延迟 / 仅带宽 / 混合（先握手筛，取最快的 N 个再测带宽）
- 🖥️ **可视化界面**：本地 Web UI，进度条、排序、过滤、勾选、一键复制
- 📋 **结果直接可用**：复制格式兼容常见优选 IP 替换工具
- 🚫 **零依赖**：单文件 Python 脚本，只用标准库，无需 `pip install` 任何东西
- 🔒 **数据不出本机**：所有测试在本机网络内进行，不依赖任何第三方服务

## 快速开始

```bash
# 要求 Python 3.13+（旧版本捆绑的 OpenSSL 指纹可能被干扰，详见文末 FAQ）
git clone https://github.com/AndyWork952/cf-latency-pro.git
cd cf-latency-pro
python latency_pro.py
```

浏览器自动打开本地测速页面（`http://127.0.0.1:8765`），粘贴目标开测。

**支持三种目标格式**（界面可切换）：

| 格式 | 示例 | 端口来源 |
|---|---|---|
| IP / 域名 | `104.16.123.96` | 下拉框多选 |
| IP:端口 | `104.16.123.96:8443` | 自带（未写默认 443） |
| vless 链接 | `vless://uuid@1.2.3.4:443?...` | 自带，握手自动使用链接内 SNI |

> 相同 `host:port` 的目标会自动去重，日志中会显示「原始 N 个 → 剔除 K 个 → 实测 M 个」。

## 参数说明

### 测试模式（三选一）

| 模式 | 说明 | 适用场景 |
|---|---|---|
| 握手延迟 | 只测连接 CF 边缘的真实握手速度，最省时间 | 手里 500 个 IP，先快速看谁活着 |
| 握手+带宽 | 先握手筛一遍，再对「取前 N 个」实测下载速度 | N=100 → 握手最快的 100 个自动进入带宽实测 |
| 仅带宽 | 跳过握手，直接测下载速度 | 已确认存活的 20 个节点，只想知道谁快 |

### 主要参数

| 参数 | 说明 | 示例 |
|---|---|---|
| **真实 SNI** | 填你的 Worker 域名，测的才是节点真实走的链路；留空用 `www.cloudflare.com` 兜底（只测边缘可达性）。带宽实测固定用官方测速端点，不受此项影响 | `my-app.yourname.workers.dev` |
| **端口** | `443 / 2053 / 2083 / 2087 / 2096 / 8443`，均为 CF 支持的 TLS 端口；多选时每端口各测一次取最优，一般只勾 443 | 全勾 6 个 ≈ 耗时 6 倍 |
| **延迟过滤** | TLS 握手超过该值（毫秒）的结果一律不进结果表（含已测出带宽的行），0 = 不过滤；混合模式下超限目标也不会进入带宽实测 | 填 300 → 隐藏握手 >300ms 的节点 |
| **带宽过滤** | 下载低于该值（Mbps）的结果不进结果表，0 = 不过滤；仅带宽相关模式生效 | 填 5 → 只保留 ≥5Mbps 的节点 |

### 高级选项（默认值已调好，不懂不用动）

| 参数 | 默认 | 说明 |
|---|---|---|
| 单次超时 | 5000ms | 晚高峰拥塞建议改 10000 |
| 握手轮次 | 1 | 每目标测几轮取最优；求稳改 2（耗时翻倍） |
| 并发数 | 40 | 目标几百个时可降到 20 |
| 下载大小 | 10MB（上限 10） | 100 目标 × 10MB ≈ 1GB 流量，赶时间改 5 |
| 混合模式取前 N | 10（上限 100） | 握手最快的前 N 个进带宽实测 |

## 原理：TCP 延迟 vs TLS 延迟

工具的结果表里有两个延迟指标，它们的含义完全不同：

```
你的电脑                          CF 边缘节点
   │ ──── SYN ────────────────────→│
   │ ←─── SYN-ACK ─────────────────│      ┐
   │ ──── ACK ─────────────────────→│      ┘ TCP 延迟（1 个来回）
   │                                 │
   │ ──── ClientHello (含 SNI) ────→│      ┐
   │ ←─── 证书 + 密钥协商 ──────────│      ┘ TLS 握手（TLS 1.3 再 +1 RTT）
```

| 指标 | 测量内容 | 证明了什么 |
|---|---|---|
| **TCP 延迟** | 三次握手，1 个来回（RTT） | 这个 IP **活着**、端口开着 |
| **TLS 延迟** | TCP 之上完成加密协商（含 SNI 身份） | 以你**真实使用的身份**走这条链路能完成完整协商 |

关键差异：

- **TCP ping 谁都好看**——CF 边缘对任何存活 IP 都会回 SYN-ACK，纯 TCP ping 的优选区分度很低
- **TLS 握手才带身份**——`ClientHello` 里的 SNI 决定了流量被路由到哪个站点/Worker，用你的真实 SNI 握手，验证的才是你实际使用的那条链路
- **差值是诊断信息**——工具里 TLS 是累计值（含 TCP），`TLS − TCP ≈ 协商开销`，正常约 1~2 个 RTT；如果 TCP 很快但 TLS 明显偏大或失败，问题不在 IP 而在 SNI 层（被干扰/限流）——这是纯 TCP ping 工具发现不了的问题

## 结果与复制

- 结果表支持按 **TLS / Mbps** 排序（点表头）
- 勾选后「复制结果」只复制勾选行，未勾选则复制全部
- 复制格式（可直接粘贴到常见优选 IP 替换工具）：

```
47.75.104.211:443 [优选 270.00ms 40.00Mbps]
104.17.107.223:443 [优选 116.00ms 6.40Mbps]
```

## 测速前检查

1. 代理软件（v2rayN / Clash / VPN）**不用关**，但必须确认**没开 TUN / 虚拟网卡模式**——TUN 会把测速流量塞进代理隧道，结果完全失真
2. 测带宽时暂停下载、网盘同步、视频等抢带宽的任务
3. 脚本永远**直连**目标（不走系统代理），系统代理开着不影响结果
4. **优选 IP 腐得很快**，几天前的结果不可信，换配置前都重测一遍
5. 晚高峰（20–24 点）国际拥塞，失败率偏高，重要测试放在白天或凌晨

## FAQ

**Q: 几乎全部目标都是「连接被重置」，但代理上网正常？**

这是 Python 的 OpenSSL 指纹与 SNI 组合被针对性干扰。每个 Python 发行版捆绑的 OpenSSL 版本不同，TLS 握手指纹就不同；实测老版本（如 3.0.x）更容易被 RST，3.5.x 以上可通过。

```bash
python -c "import ssl; print(ssl.OPENSSL_VERSION)"
```

解决办法：安装 [python.org](https://www.python.org/downloads/) 官网最新版 Python 再运行本工具。

**Q: 为什么不做网页版测速？**

浏览器出于安全限制无法自定义 SNI，网页只能测「到 Cloudflare 边缘」的粗略延迟，验证不了 Worker 链路；服务器端发起的测试又跑在海外机房，对你毫无参考价值。只有跑在你自己电脑上的脚本，测出来的才是真实体验。

**Q: 想测节点的真实链路速度（穿过 Worker 的端到端速度）？**

建议使用 v2rayN / Clash 的批量测速功能，并将测速地址改为非 Cloudflare 托管的大文件（如 `http://ipv4.download.thinkbroadband.com/10MB.zip`）。注意：Cloudflare Worker 访问 CF 托管站点需经 ProxyIP 中转，直接用 CF 测速端点可能得到 0。

## 订阅源

[`优选订阅地址.txt`](优选订阅地址.txt) 收录了本工具配套使用的社区公开优选 IP 订阅源（Cloudflare 优选生态的公开聚合站点与 GitHub 仓库），可用 v2rayN 等客户端订阅导入，或直接抓取后作为本工具的测试目标。

> 这些源的内容由各维护者持续更新，重复率较高属正常现象（聚合站互相搬运 + 热门段重叠）。

## 免责声明

本项目仅供网络质量测试与学习研究使用，请遵守所在地区法律法规。开发者不对任何滥用行为承担责任。

## License

[MIT](LICENSE)
