Skip to content

MoeDove-LLC/conncap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

conncap

语言 / Language: 简体中文 | English

conncap 是一个用于测试家庭宽带、路由器或运营商侧并发连接能力的 TCP/UDP 连接数测试工具。它由服务端和客户端组成,支持 IPv4/IPv6 自动检测,也可以强制使用 IPv4 或 IPv6。

工作方式

家庭网络客户端  ->  大量 TCP/UDP 会话  ->  公网 VPS 服务端
  • 服务端运行在公网 VPS 上,负责接收连接并统计当前连接数、峰值和断开原因。
  • 客户端运行在家庭网络、OpenWrt、PC 或其他待测环境中,负责主动发起大量连接。
  • 客户端会自动检测本机常见限制,例如 ulimitconntrack、临时端口范围,并在可能影响结果时输出中英文警告。

下载

请到 GitHub Releases 下载对应平台的压缩包。每个压缩包内都包含服务端和客户端两个程序。

系统 架构 文件
Linux x86_64 conncap-linux-amd64.tar.gz
Linux arm64 conncap-linux-arm64.tar.gz
Linux ARMv5+ conncap-linux-arm5.tar.gz
Linux MIPS 大端 conncap-linux-mips.tar.gz
Linux MIPS 小端 conncap-linux-mipsel.tar.gz
macOS Apple Silicon conncap-darwin-arm64.tar.gz
Windows x86_64 conncap-windows-amd64.zip

OpenWrt 常见架构:

OpenWrt 架构 推荐文件
x86_64 软路由 conncap-linux-amd64.tar.gz
aarch64/arm64 conncap-linux-arm64.tar.gz
armv5/armv6/armv7 conncap-linux-arm5.tar.gz
mipsel 小端 conncap-linux-mipsel.tar.gz
mips 大端 conncap-linux-mips.tar.gz

快速开始

1. 在 VPS 上启动服务端

./conncap-server-linux-amd64

默认监听:

用途 默认端口
TCP 测试 8888
UDP 测试 8888
HTTP 状态接口 默认关闭,使用 -stats-port 8889 开启

查看服务端状态:

./conncap-server-linux-amd64 -stats-port 8889
curl http://<vps_ip>:8889/status

只绑定指定监听 IP,可以重复传入 -bind-ip,也可以用逗号分隔:

./conncap-server-linux-amd64 -bind-ip 192.0.2.10 -bind-ip 2001:db8:1::1
./conncap-server-linux-amd64 -bind-ip 192.0.2.10,2001:db8:1::1

2. 在家庭网络中运行客户端

TCP 测试(默认):

./conncap-client-linux-amd64 -s <vps_ip>

UDP 测试:

./conncap-client-linux-amd64 -s <vps_ip> -u

TCP + UDP 混合测试:

./conncap-client-linux-amd64 -s <vps_ip> -t -u

强制 IPv6:

./conncap-client-linux-amd64 -s <vps_ipv6> -6

强制 IPv4:

./conncap-client-linux-amd64 -s <vps_ipv4> -4

IPv6 多 IP 测试

如果 VPS 拥有可路由的 IPv6 前缀,可以让客户端把连接分散到多个 IPv6 目标地址,用于绕开单目标临时端口数量限制,观察更高连接规模。该模式默认不启用,必须在服务端手动指定 -ipv6-prefix

当前正确用法是 -bind-ip <控制 IPv6 地址> -ipv6-prefix <测试前缀>-host 只是兼容旧版本的参数,不建议用于 IPv6 多 IP 测试。

服务端需要满足三个条件:

  • VPS 提供商已经把这个 IPv6 前缀路由到当前 VPS。
  • Linux 已开启 net.ipv6.ip_nonlocal_bind=1
  • Linux 有一条指向 lo 的 IPv6 local route,覆盖用于测试的前缀。

临时开启非本地 IPv6 绑定:

sudo sysctl -w net.ipv6.ip_nonlocal_bind=1

临时加入 IPv6 local route:

sudo ip -6 route replace local <ipv6_prefix> dev lo

这两个命令重启后通常会失效。长期使用时,需要按发行版把 net.ipv6.ip_nonlocal_bind=1 写入 /etc/sysctl.conf/etc/sysctl.d/*.conf,并把 local route 写入系统网络配置、启动脚本或 systemd unit。

启动服务端时,需要用 -bind-ip 指定 VPS 上可连接的具体 IPv6 控制地址,不能使用默认的 ::

./conncap-server-linux-amd64 -bind-ip <vps_ipv6> -ipv6-prefix 2001:db8:1::/64

例如 VPS 网卡上有 fd12:3456:7890:100::a/56,并且提供商确实把 fd12:3456:7890:100::/56 路由到了这台 VPS,可以这样使用整个 /56

sudo sysctl -w net.ipv6.ip_nonlocal_bind=1
sudo ip -6 route replace local fd12:3456:7890:100::/56 dev lo
./conncap-server-linux-amd64 -bind-ip fd12:3456:7890:100::a -ipv6-prefix fd12:3456:7890:100::/56

更保守的做法是只使用其中一个 /64 做测试:

sudo ip -6 route replace local fd12:3456:7890:100::/64 dev lo
./conncap-server-linux-amd64 -bind-ip fd12:3456:7890:100::a -ipv6-prefix fd12:3456:7890:100::/64

这里 -bind-ip 是客户端最初连接的控制地址,必须是 VPS 已经能从公网访问的具体 IPv6 地址。-ipv6-prefix 是服务端自动生成测试目标 IP 的范围。程序会跳过 -bind-ip 控制地址,避免和动态监听地址冲突。

如果你的 VPS 面板只显示 fd12:3456:7890:100::a/56,但不确定整个 /56 是否都路由给这台 VPS,优先用 /64 测试。只有确认整个 /56 可用时,再把 ip route local-ipv6-prefix 都扩大到 /56

客户端照常连接这个控制 IPv6 地址,服务端会返回生成的 IPv6 目标列表,客户端会自动轮询这些地址:

./conncap-client-linux-amd64 -s <vps_ipv6> -6 -max 10000

默认生成 32 个目标 IPv6。服务端使用紧凑的 IPRANGE 控制响应,只发送起始 IPv6 和数量,客户端会在本地生成完整目标列表,因此可以把目标数量调大而不会再传输很长的 IP 文本列表。例如生成 1024 个目标 IP:

./conncap-server-linux-amd64 -bind-ip <vps_ipv6> -ipv6-prefix 2001:db8:1::/64 -multi-ip-count 1024

注意:-multi-ip-count 越大,服务端启动时创建的 TCP/UDP 监听器越多。TCP 和 UDP 都启用时,监听 socket 数约为 multi-ip-count * 2 + 控制监听器

UDP 多 IP 测试会在服务端为每个生成的 IPv6 地址创建独立监听器,这样回复包的源地址可以匹配客户端请求的目标地址。UDP-only 多 IP 模式仍需要服务端 TCP 端口可达,因为客户端使用 TCP 控制连接获取目标 IP 列表。

客户端参数

-s, -server string   服务端地址,必填
-bind-ip string      绑定本地 IP,可重复传入或用逗号分隔
-t                  启用 TCP 测试;如果没有指定 -t 或 -u,默认启用 TCP
-u                  启用 UDP 测试
-tcp-port int       服务端 TCP 端口,默认 8888
-udp-port int       服务端 UDP 端口,默认 8888
-max int            目标连接数,默认 10000
-rate int           每秒新建连接数,默认 100,0 表示不限速
-timeout duration   建连超时,默认 5s
-keepalive duration 心跳间隔,默认 30s
-duration duration  测试持续时间,默认 0,表示不限时
-4                  强制 IPv4
-6                  强制 IPv6
-stop-on-fail int   peak 停滞 N 秒或连续 N 次失败后停止,默认 100,0 表示禁用

服务端参数

-host string       兼容旧参数:默认 IPv6 监听地址,默认 ::;新配置建议使用 -bind-ip
-bind-ip string    绑定监听 IP,可重复传入或用逗号分隔;传入后只监听这些 IP
-tcp-port int      TCP 端口,默认 8888,0 表示禁用
-udp-port int      UDP 端口,默认 8888,0 表示禁用
-stats-port int    HTTP 状态端口,默认 0(关闭),传入端口后启用,例如 8889
-interval int      日志输出间隔秒数,默认 5
-v6-only           仅监听 IPv6,默认同时监听 IPv4 和 IPv6
-ipv6-prefix string 手动启用 IPv6 多 IP 测试,例如 2001:db8:1::/64;需要至少一个具体 IPv6 -bind-ip
-multi-ip-count int IPv6 多 IP 目标数量,默认 32;可以提高到 256、1024 等

输出怎么看

客户端示例:

attempt=3000 success=2995 failed=0 alive=2995 peak=2995
字段 含义
attempt 已尝试建立的连接数
success 累计成功建立的连接数
failed 累计失败连接数
alive 当前仍存活的连接数
peak 测试期间最大同时存活连接数

通常更应该关注 peak,它表示真正同时存在的最大连接数。

服务端状态接口示例:

{
  "tcp_current": 1234,
  "tcp_peak": 2345,
  "udp_current": 567,
  "udp_peak": 890,
  "close_normal": 100,
  "close_timeout": 200,
  "close_reset": 0,
  "close_hello": 1,
  "close_other": 0,
  "uptime": "5m30s"
}

断开原因说明:

字段 含义
close_normal 对端正常关闭
close_timeout 心跳或读超时
close_reset TCP RST 断开
close_hello 握手阶段失败
close_other 其他错误

测试前建议

Linux/OpenWrt 上建议先提高文件描述符上限:

ulimit -n 1048576

客户端启动时会自动检查以下限制,并在偏小时输出中英文警告:

检查项 可能影响
Max open files / ulimit -n 最大可打开 socket 数
nf_conntrack_max 本机连接跟踪表容量
ip_local_port_range 单目标 TCP 临时端口数量

建议从较低速率开始测试,例如:

./conncap-client-linux-amd64 -s <vps_ip> -rate 100

如果需要更快测试,再逐步提高 -rate

常见问题

为什么我设置 -max 10000,但 peak 只有几千?

-max 是目标连接数,不代表一定能达到。真实结果看 peak。如果本机限制、路由器限制、运营商限制或服务端限制较低,peak 会停在较低数值。

为什么 success 很高,但 alivepeak 不涨?

这说明新连接能成功建立,但旧连接正在被关闭或淘汰。此时 success 是累计成功数,alive 才是当前存活数,peak 才是最大并发数。

为什么 OpenWrt 本机测试比下级设备低?

OpenWrt 本机运行客户端时,每条连接都会占用 OpenWrt 自己的 fd、socket 内存和本地 TCP 状态。下级设备运行客户端时,OpenWrt 主要负责转发,资源压力不同。请优先查看客户端启动时的限制提示。

IPv6 会自动使用吗?

默认会自动检测。如果服务端地址是 IPv6,或域名有可用 AAAA 记录并且连通,客户端会自动使用 IPv6。也可以用 -6 强制 IPv6。

UDP 测试是否真的会产生多个会话?

会。客户端会为每个 UDP 会话分配独立源端口,服务端按源 IP 和源端口统计 UDP 会话。

About

A TCP + UDP concurrent connection limit testing tool for home broadband. Tests the maximum number of concurrent connections your ISP/router allows.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages