按下复制之后
文字、图片、文件都走同一条路。
发现
后台服务察觉剪贴板变了。
传输
文字和 50 MB 以内的文件马上发过去,更大的先发一条记录。
粘贴
另一台存到本地再放进剪贴板,粘贴出来就是真实的文件。
隔空贴的连接方式
同一网络里直接找到对方;不在一个网络时,由服务器牵线后尽量直连,连不上才中转。内容始终加密。
- WebRTC 直连,DTLS 加密 数据只在两台电脑之间传
- 信令与中转服务 信令、STUN、TURN 中转
- 中转:只在直连不通时
公司网络也能直连
多出口的公司网络以前只能中转。隔空贴会探出每个出口,让对方逐个尝试。
做了什么
- 共用一个端口。所有连接走同一个 UDP 端口。
- 探测每个出口。同时问 7 台服务器,有几个出口就拿到几个地址。
- 全部告诉对方。对方逐个尝试,对上的那个就能连通。
- 空闲时再试直连。先用中转保证能用,空闲时再换成直连。
用真实的网络拓扑测试
每次提交代码都会在模拟的网络里自动跑一遍。
| 场景 | 结果 |
|---|---|
| 单出口 ↔ 家用路由器 | 直连 |
| 两个出口,旧版本(对照) | 中转 |
| 四个出口 ↔ 家用路由器 | 直连 |
| 两个出口 ↔ 两个出口 | 直连 |
| 两个出口 ↔ 端口随机分配的 NAT | 中转 |
| 一开始打不通,之后网络恢复 | 先中转,随后直连 |
| 没有服务器,同一网段 | 直连 |
| 没有服务器,两个网段之间被隔离 | 连不上 |
实测:公司 4 个出口的 Mac 和家里的 Mac,以前中转 0.6 MB/s,现在直连。
细节见技术方案。
出问题的时候
常见的情况,都有处理。
- 同一网络里找不到对方
- 配对时填上对方的地址,之后会记住。
- 打不通直连
- 经服务器中转,内容同样加密。
- 对方睡眠或断网
- 醒来后自动重连。
- 传文件时断开
- 连上后从断点接着传。
- 文件名在 Windows 上不合法
- 换成全角字符,名字照样看得懂。
- 复制的是密码
- Windows 上密码管理器复制的内容会被跳过。
技术规格
| 版本 | 2.10.2,发布 |
|---|---|
| Mac 客户端 | macOS 13 Ventura 及以上;Apple 芯片与 Intel 芯片各有一个安装包,约 25 MB,不需要 Rosetta;也有两种芯片通用的版本,约 47 MB |
| Windows 客户端 | Windows 10 与 Windows 11,x64;按用户安装,不需要管理员权限;安装包约 23 MB |
| Linux 客户端 | x64 与 ARM64;.deb(Debian、Ubuntu 等)或 tar.gz(其他发行版),约 22 MB;需要 X11 桌面,或者带 XWayland 的 Wayland 桌面(GNOME、KDE 等默认都带);GTK 3 |
| 服务器 | 用「服务」或在同一网络里都不需要。自建的话,支持 Linux x86_64/ARM64、macOS 与 Windows 10/11 x64。 |
| 界面语言 | 简体中文、繁體中文(台灣、香港)、English、日本語,默认跟随系统,可在设置里切换 |
| 同步的内容 | 纯文本、带格式的文本、图片与截图、文件、文件夹,可以按类型关闭 |
| 传输 | WebRTC 数据通道,直连优先,打不通时经 TURN 中转;同一网络里经 mDNS 发现、UDP 8788 交换连接信息;多出口网络逐个探测每个出口;文件以 tar + zstd 流式打包 |
| 加密与身份 | DTLS 端到端加密;设备身份为 Ed25519 密钥;信令消息逐条签名 |
| 配对 | 6 位配对码,5 分钟内有效,字符集去掉了 0/O、1/I 等易混字符;配对时人工核对安全指纹 |
| 自动同步上限 | 默认 50 MB,可在 1 MB 到 1 GB 之间调整 |
| 隔空传送 | 发给一台设备,不限大小,文件和整个文件夹都行;局域网里走加密的 TCP 通道(两端需 2.5.1),用不了时退回 WebRTC;外网和中转用 WebRTC;断了接着传,每个文件用 SHA-256 校验。Mac 发 1 GB 到 Linux 虚拟机实测 144.3 MB/s,实际速度看网络和硬盘。 |
| 好友 | F 开头的 7 位好友码,经局域网或「服务」交换,可以核对安全码;好友之间只能互发文件和图片,可附 200 字以内的备注,每批都要对方接受;好友看不到你的剪贴板、复制记录和设备;收到的文件去掉可执行权限,Mac 上加隔离标记;两端需 2.6 或更新 |
| 记录保留 | 默认 3 天,可在 1 小时到 30 天之间调整,到期自动清理 |
| 实测速度 | 局域网直连传输 20 MB 文件约 330 毫秒,校验和一致 |
| 技术栈 | 后台服务与服务器用 Go(Windows 上纯 Go 调用 Win32,Linux 上纯 Go 走 X11 协议),界面用 Flutter(三个系统共用一套代码),消息定义用 Protocol Buffers |
| 许可 | GNU AGPL-3.0 |