按下複製之後
文字、圖片、檔案都走同一條路。
偵測
背景服務察覺剪貼簿有變。
傳輸
文字和 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 |