コピーしたあと、何が起きるか
テキストも画像もファイルも、同じ道を通ります。
気づく
バックグラウンドサービスがクリップボードの変化に気づきます。
送る
テキストと 50 MB までのファイルはすぐに送り、それより大きいものは先に記録だけを送ります。
貼り付ける
受け取った側はローカルに保存してからクリップボードに入れるので、貼り付けると本物のファイルになります。
PasteFerry の接続のしかた
同じネットワークなら直接相手を見つけます。別のネットワークではサーバーが橋渡しをしてできるだけ直接つなぎ、無理なときだけ中継します。内容は常に暗号化されます。
- WebRTC 直接接続、DTLS 暗号化 データは 2 台のあいだだけを流れる
- シグナリング・中継サービス シグナリング、STUN、TURN 中継
- 中継:直接つながらないときだけ
会社のネットワークでも直接つながる
出口が複数ある会社のネットワークは、以前は中継しかできませんでした。PasteFerry はすべての出口を調べ、相手に順に試してもらいます。
やっていること
- ポートはひとつ。すべての接続でひとつの 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 に対応。 |
| 表示言語 | 日本語、英語、簡体字中国語、繁体字中国語(台湾・香港)。初期設定はシステムに合わせ、「設定」で切り替え可能 |
| 同期する内容 | プレーンテキスト、書式付きテキスト、画像とスクリーンショット、ファイル、フォルダ。種類ごとにオフにできる |
| 転送 | WebRTC データチャネル。直接接続を優先し、つながらなければ TURN で中継。同じネットワークでは mDNS で発見し、UDP 8788 で接続情報を交換。複数の出口があるネットワークでは出口ごとに調査。ファイルは tar + zstd でストリーム転送 |
| 暗号化と身元 | DTLS によるエンドツーエンド暗号化。デバイスの身元は Ed25519 の鍵。シグナリングのメッセージはすべて署名付き |
| ペアリング | 5 分間有効な 6 桁のコード。0/O や 1/I のような紛らわしい文字は使わない。指紋は人が照合 |
| 自動同期の上限 | 初期値 50 MB、1 MB〜1 GB で調整可能 |
| ファイル送信 | 1 台のデバイスへ、サイズ無制限。ファイルもフォルダまるごとも送れる。同じネットワークでは暗号化した TCP 接続(両方に 2.5.1 が必要)、使えないときは WebRTC に切り替え。インターネット経由と中継は WebRTC。切れても続きから送り、各ファイルを SHA-256 で検証。Mac から Linux 仮想マシンへ 1 GB を送る実測で 144.3 MB/s。実際の速度はネットワークとディスクしだい |
| 連絡先 | F で始まる 7 文字の連絡先コードで追加。ローカルネットワークか「サービス」で交換し、安全コードも照合できる。連絡先とはファイルと画像だけを送り合え、200 文字までのメモを添えられ、毎回相手の受け入れが必要。連絡先にはクリップボード、履歴、デバイスは見えない。受信したファイルは実行権限を外し、Mac では検疫属性を付ける。双方に 2.6 以降が必要 |
| 履歴の保存期間 | 初期値 3 日、1 時間〜30 日で調整可能。期限が来たら自動で削除 |
| 実測の速度 | LAN の直接接続で 20 MB のファイルを約 330 ミリ秒で転送、チェックサム一致 |
| 技術スタック | バックグラウンドサービスとサーバーは Go(Windows では Go から Win32 を直接呼び出し、Linux では Go で X11 プロトコルを直接扱う)、アプリは Flutter(3 つの OS で同じコード)、メッセージ定義は Protocol Buffers |
| ライセンス | GNU AGPL-3.0 |