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