跳转至

高级参数与调优

本章节面向高级用户,介绍 gonc 在传输协议优化、流控制、系统集成以及调试方面的底层参数。


🚀 KCP 传输加速

在跨国网络、弱网环境(高丢包、高抖动)下,TCP 的性能往往急剧下降。gonc 集成了 KCP 协议,这是一种基于 UDP 的 ARQ 协议,能以比 TCP 浪费 10%-20% 带宽的代价,换取平均延迟降低 30%-40%。

启用 KCP

使用 -kcp 参数即可替换默认的 TCP 传输层。

场景示例

# 启动一个监听在 UDP 6680 的 SOCKS5 代理,kcp协议模拟tcp稳定传输
gonc -e ":s5s -http" -kcp -psk simplekey123 -k -l 6680 
# 本地监听TCP 1080提供标准的SOCKS5代理协议,用:nc转换为KCP协议
gonc -e ":nc -kcp -psk simplekey123 server-ip 6680" -k -l 127.0.0.1 1080

性能调优参数

KCP 的默认配置偏向通用性。如果你清楚网络状况,可以通过以下参数压榨极限性能:

参数 默认值 说明
-kcp-window-size 1500 发送/接收窗口大小。数值越大,吞吐量越高,但内存和带宽消耗也越大。在千兆局域网内可尝试调大。
-kcp-timeout 41 空闲超时 (秒)。超过此时间无数据交互将断开连接。
-no-compress false 禁用压缩gonc 的http download功能传输层默认尝试请求 zstd 压缩。虽然服务器会识别文件类型,不重复压缩zip或mp4之类的文件,如果你传输的文件是罕见后缀,且加密或压缩过的,客户端建议加上此参数以节省 CPU。

适用场景

  • 适用:游戏加速、SSH 远程操作(减少卡顿)、跨国文件同步。
  • 不适用:内网大文件传输(TCP 通常更快且更稳)。

🔌 Unix Domain Sockets (UDS)

除了 TCP/UDP,gonc 还支持 Unix 域套接字。这在同一台机器上的进程间通信(IPC)效率极高,且不经过网络协议栈。

参数-U

示例

# 监听 /tmp/gonc.sock 文件
gonc -U -l /tmp/gonc.sock
gonc -U /tmp/gonc.sock

典型场景: 连接 Docker Daemon Socket 或配合 Nginx 的 proxy_pass http://unix:/path/to/socket 使用。


📦 流控制与数据帧 (Framing)

如果你正在编写程序与 gonc 进行交互,或者需要处理定长数据包,这些参数非常有用。

参数 说明
-framed 标准输入输出分帧gonc 从连接读取的数据写入 Stdout 的每个数据包前加上 2字节的长度前缀 (Length-Prefix),从 Stdin 读取时同理认为有长度前缀。方便程序解析数据边界。 主要用于udp 传递给 -e模块时,写入管道后出现粘包的情况
-framed-tcp 网络流分帧。每次写入连接的数据块都加上 2字节长度前缀。主要用于udp over TCP的转发时,避免对端无法分辨粘包的情况
-C CRLF 转换。将输入中的换行符 \n (LF) 转换为 \r\n (CRLF)。在手动测试 HTTP、SMTP 等文本协议时非常有用。

📡 DNS 与网络寻址

参数 说明
-dns <ip:port> 自定义 DNS 服务器。强制 gonc 使用指定的 DNS 服务器解析域名,而非系统默认。例如 -dns 8.8.8.8:53
-magicdns MagicDNS 域名 (默认 gonc.cc)。用于透明代理模式。gonc 会从该域名反向解析请求,提取127.b.c.d相关的域名信息。
-nat-checker NAT 检测工具。检测当前网络的 NAT 类型(Full Cone, Symmetric 等)和公网 IP。

📥 输入输出控制

除了标准的 Shell 重定向(><),gonc 提供了更精确的 I/O 控制参数。

参数 说明
-send <file> 发送文件。连接建立后,自动将指定文件内容写入连接,发送完毕后保持连接(除非对方断开)。
-sendsize <bytes> 限制发送大小。仅发送文件的前 N 个字节。
-write <file> 写入文件。将接收到的数据直接写入文件,而不是打印到屏幕。
-udp-ping-data UDP 探测包内容。默认是 ping\n。你可以修改它以伪装流量或触发特定的服务端响应。

示例:发送数据并显示进度

# 发送 bigfile.iso,显示进度条,接收端的数据写入 /dev/null (丢弃)
gonc -P -send bigfile.iso -write /dev/null <target_ip> <port>

🔄 端口轮换 (Port Rotate)

参数-port-rotate

原理: 在 P2P 模式下,开启此功能, gonc 可以按需切换本地源端口。

场景

  • 绕过某些基于 "五元组" (源IP, 源端口, 目的IP, 目的端口, 协议) 进行限速或阻断的防火墙策略。

示例:

在公司和家庭建立点对点的代理隧道:

公司先运行

gonc -p2p mysecret123 -linkagent -port-rotate

家里任何时候想建立隧道时,用约定的相同口令:

gonc -p2p mysecret123 -link 3380 -port-rotate -:pr “-http 8180 -period 600 -rotate-bytes 1G”

这样建立的隧道,3380 端口是本地 socks5 协议,可代理访问远程网络。而隧道会自动 10 分钟或传输达到 1G 就切换低层通讯的端口,切换过程平滑不会对已在通讯的应用产生卡顿。

8180 端口可以通过这样手动可触发切换底层协议和端口(随机): curl http://127.0.0.1:8181/rotate?network=udp

network 还可以明确指定例如几种 udp4 udp6 tcp4 tcp6


🐛 调试与日志

参数 说明
-v 详细日志 (Verbose)。默认开启。打印连接状态、P2P 打洞过程、错误信息等。在编写自动化脚本时,建议关闭它或将 stderr 重定向。
BIPA_DEBUG 环境变量。BIPA_DEBUG=1时,打洞时总是使用碰撞端口的方式。
ROLE_DEBUG 环境变量。ROLE_DEBUG=C或ROLE_DEBUG=S时,限定P2P时C/S角色,否则gonc会根据算法自动分配两端的C/S角色。
BR_DEBUG 环境变量。BR_DEBUG=1,开启-kcpbr模式的http接口,方便模拟网络异常触发自动重新保活连接。