菜单

速度测试

相关源文件

本页面介绍了v2rayN的测速系统,该系统允许用户通过各种测试方法来评估服务器性能。测速功能可帮助用户在其配置中识别出最快、响应最快的服务器。

概述

v2rayN提供四种类型的测速以评估服务器性能

  1. TCP Ping - 测试基本的TCP连通性和连接建立时间
  2. Real Ping - 测试通过已建立的代理连接的实际延迟
  3. Speed Test - 测量通过代理的下载速度
  4. Mixed Test - 结合了ping和速度测试,并可并发执行

这些测试可帮助用户根据延迟和吞吐量指标识别最佳服务器。

来源: ServiceLib/Services/SpeedtestService.cs48-66 ServiceLib/Services/SpeedtestService.cs234-294

用户界面集成

测速功能已集成到“配置文件”视图中,并提供多种访问方式

测试类型菜单选项键盘快捷键功能
TCP PingmenuTcpingServerCtrl+O测试TCP连接建立时间
Real PingmenuRealPingServerCtrl+R测试通过代理的实际延迟
Speed TestmenuSpeedServerCtrl+T测试下载速度
Mixed TestmenuMixedTestServerCtrl+E组合延迟和速度测试

测速结果会显示在“配置文件”视图的数据网格中,其中

  • Delay 列显示以毫秒为单位的ping时间(按性能进行颜色编码)
  • Speed 列显示下载速度

可以通过按Escape键随时取消测试,该操作会调用 ServerSpeedtestStop()

来源: ServiceLib/ViewModels/ProfilesViewModel.cs195-211 v2rayN/v2rayN/Views/ProfilesView.xaml.cs246-337 v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs269-339

测试实现细节

TCP Ping 测试

TCP Ping 测试会建立一个直接的TCP连接到服务器,并测量所需时间。

关键步骤

  1. 如果需要,解析DNS以获取IP地址
  2. 创建到服务器IP和端口的套接字连接
  3. 使用Stopwatch测量连接时间
  4. 通过ProfileExHandler.SetTestDelay()存储结果

来源: ServiceLib/Services/SpeedtestService.cs120-145 ServiceLib/Services/SpeedtestService.cs324-355

Real Ping 测试

Real Ping 测试通过代理传输流量时测量实际延迟。它会启动一个代理进程,并通过该代理发起HTTP请求。

关键步骤

  1. 加载选定服务器的核心配置
  2. 启动代理进程
  3. 配置Web代理以通过本地代理进行路由(socks5://127.0.0.1:port)
  4. 通过DownloadService发送HTTP请求到测试URL
  5. 测量响应时间
  6. 通过ProfileExHandler.SetTestDelay()存储结果

来源: ServiceLib/Services/SpeedtestService.cs147-232 ServiceLib/Services/SpeedtestService.cs296-304

Speed Test

Speed Test 通过下载配置URL的数据来测量代理的下载速度。

关键步骤

  1. 启动选定服务器的代理进程
  2. 配置Web代理以通过本地代理进行路由
  3. 从配置的URL下载数据
  4. 计算速度并以适当的单位格式化
  5. 通过ProfileExHandler.SetTestSpeed()存储结果

来源: ServiceLib/Services/SpeedtestService.cs306-322 ServiceLib/Services/SpeedtestService.cs59-60

Mixed Test

Mixed Test 结合了 Real Ping 和 Speed Test,具有可配置的并发性,可以高效地批量测试多个服务器。

关键步骤

  1. 创建一个SemaphoreSlim来限制并发
  2. 对于每个服务器,运行一个单独的任务,该任务
    • 获取信号量
    • 启动代理进程
    • 执行Real Ping测试
    • 如果ping成功,执行Speed测试
    • 释放信号量

来源: ServiceLib/Services/SpeedtestService.cs234-294 ServiceLib/Services/SpeedtestService.cs21-29

结果存储与管理

测速结果存储在 ProfileExItem 模型中,并通过 ProfileExHandler 持久化到SQLite数据库。

  1. 在测试期间,结果被添加到 ProfileExHandler 的内存集合中
  2. 已修改服务器的 indexId 在一个队列中被跟踪
  3. 当调用 SaveTo() 时,所有更改将以批量操作的形式保存到数据库
  4. UI通过 SetSpeedTestResult 方法使用结果进行更新

来源: ServiceLib/Handler/ProfileExHandler.cs66-129 ServiceLib/Models/ProfileExItem.cs6-15

用户选项和配置

测速行为通过应用程序设置进行配置

设置描述默认位置
SpeedTestUrl用于下载速度测试的URL可配置Config.SpeedTestItem
SpeedPingTestUrl用于实际ping测试的URL可配置Config.SpeedTestItem
SpeedTestTimeout测试允许的最大时间可配置Config.SpeedTestItem
MixedConcurrencyCount混合模式下的并发测试数量可配置Config.SpeedTestItem

应用程序还提供了管理测试结果的UI选项

  • 按测试结果对服务器进行排序(SortServerResultCmd
  • 移除无效测试结果的服务器(RemoveInvalidServerResultCmd

来源: ServiceLib/ViewModels/ProfilesViewModel.cs212-219 ServiceLib/Services/SpeedtestService.cs63

针对不同协议的特殊处理

测速系统针对不同的协议类型有特殊的处理方式

  1. 自定义类型服务器在测试期间被跳过(ConfigType.Custom 检查)
  2. Hysteria2 和 TUIC 协议被分批处理,以防止冲突
  3. 服务器被分组到批次中(GetTestBatchItem),以实现高效测试

来源: ServiceLib/Services/SpeedtestService.cs357-373 ServiceLib/Services/SpeedtestService.cs68-118

技术实现细节

错误处理和取消

  • 测试具有适当的超时处理,以防止在无响应的服务器上挂起
  • 用户可以通过按Escape键取消所有正在运行的测试,该操作会触发 ExitLoop()
  • 失败的测试会通过 Logging.SaveLog() 机制进行记录
  • 批量测试实现了针对失败服务器的重试逻辑,并降低了并发度

来源: ServiceLib/Services/SpeedtestService.cs31-39 ServiceLib/Services/SpeedtestService.cs166-186

并发控制

  • SemaphoreSlim 用于限制并发测试的数量
  • 并发数量可通过应用程序设置进行配置
  • 测速系统使用基于任务的操作来防止UI阻塞
  • 特殊处理确保系统资源得到妥善管理和释放

来源: ServiceLib/Services/SpeedtestService.cs234-294

结论

v2rayN中的测速系统通过多种测试方法提供了全面的服务器性能评估功能。它既提供简单的单个测试,也提供高效的批量测试能力,结果清晰地显示在UI中并进行存储以供将来参考。该实现通过精细的并发管理和对不同协议类型的特殊处理,在性能和资源使用之间取得了平衡。

有关更新v2rayN核心组件的信息,请参阅 Update System