TCP、Vision、QUIC の選び方
ネットワーク環境とアプリの通信に応じてモードを選び、一つの SOCKS5 入口で TCP と UDP を別々の経路に振り分けます。
概要
まず、二つの問題を区別してください。アプリが送るのは TCP か UDP か。そして Umbra はそれを TCP と QUIC のどちらでサーバーに届けるのか。アプリの通信種別と外側のトランスポートは別のものです。transport は主な外側のトランスポートを選びます。udp_transport では UDP 要求のトランスポートを個別に選択でき、省略すると transport を引き継ぎます。
要件に応じて選ぶ
| 要件やネットワーク環境 | 最初に試す設定 | 注意点 |
|---|---|---|
| まず接続を確立したい、またはネットワークで UDP がフィルタリングされる | transport = "tcp" | サーバーの TCP ポートを開放する。既定では mux が有効 |
| 複数の同時 TCP 要求で既存の接続を再利用したい | TCP + mux = true | 外側の TCP を共有するため、パケット損失が他のストリームにも影響しうる |
| HTTPS が中心で、条件を満たす通信の二重暗号化を減らしたい | TCP + mux = false | 専用 Vision 接続を使う。すべての TLS がスプライシングに対応するわけではない |
| TCP が頻繁に RST リセットを受け、UDP は到達可能 | transport = "quic" | 両端で QUIC が利用できる必要がある。UDP も帯域制限や遮断を受ける可能性がある |
| TCP は Vision のまま、UDP を独立して QUIC に流したい | TCP + udp_transport = "quic" + mux = false | 同じサーバーで TCP と UDP の待ち受けを有効にする |
すべてのネットワークで最速になるモードはありません。まず到達性を確認し、その後で実際に使うアプリの遅延、安定性、スループットを比較してください。複数のパラメーターを同時に変更しないでください。上記の設定はネットワークを自動検出してトランスポートを切り替えるものではありません。
TCP 多重化
transport = "tcp"
mux = true複数の要求が暗号化された外側の接続を共有し、接続を繰り返し確立する必要を減らします。現行版では、実際のトラフィック消費量と往復時間に応じてウィンドウを調整しつつ、メモリ予算の制約も適用します。同時要求を処理する用途で試せますが、TCP のトランスポート層のヘッドオブラインブロッキングは解消しません。
適応型 mux には両端のバージョン互換性が必要です。1.0.0-alpha へ更新するときは、クライアントとサーバーを同時に更新してください。リソース関連のパラメーターは設定リファレンスを参照してください。
専用 TCP / Vision
transport = "tcp"
mux = false条件を満たす内側の TLS 1.3 通信では、認証済みの切り替え境界をネゴシエーションした後、すでに暗号化されている TLS レコードを転送し、それ以降の外側の TLS 暗号化と追加のカプセル化を省けます。非 TLS や非対応の TLS は暗号化を維持するため、Vision を有効にしたことでアプリの平文がそのまま送信されることはありません。
Vision はユーザー空間 I/O を使い、カーネルのゼロコピーではありません。重複処理を減らすことは仕組み上の利点であり、競合製品に対する速度の優位性が測定済みという意味ではありません。アプリ層では引き続き HTTPS を利用してください。
QUIC
transport = "quic"QUIC は UDP 上で動作するため、TCP の RST 注入や、トランスポート層の再送に起因する異なる QUIC ストリーム間のヘッドオブラインブロッキングを回避できます。ただし、同一の信頼性のあるストリーム内では順序どおりの配信が必要で、すべてのストリームが経路容量と輻輳制御を共有します。サーバーでは udp_listen を有効にし、ファイアウォールで UDP ポートを開放し、設定した実在の QUIC フォールバック先サイトへ到達できる必要があります。
現在の既定は Quinn BBR で、cubic または new-reno も選べます。これらは QUIC の設定であり、Linux の TCP 輻輳制御は変更しません。ネットワークが UDP を制限する場合、QUIC は TCP の確実な代替にはなりません。
TCP / Vision + QUIC UDP
既存の完全なクライアント設定に以下を追加します。
transport = "tcp"
udp_transport = "quic"
mux = false
socks_listen = "127.0.0.1:1080"同じサーバーで、同時に以下を設定します。
listen = "0.0.0.0:443"
udp_listen = "0.0.0.0:443"これらは完全な設定に組み込むための断片であり、鍵、実在する宛先サイト、その他の必須項目を置き換えるものではありません。一つのクライアント、一つのサーバー、一つのローカル SOCKS5 入口で、この二つの経路を扱えます。Clash 系クライアントの udp: true は UDP 要求を許可するだけで、通常の TCP 通信を強制的に QUIC へ変更するものではありません。
パディングと TCP 書き込み方式
既定のパディングは、接続の初期にランダムな長さのデータを追加し、その後は頻度を下げます。レコード長から内側のハンドシェイクを直接識別する手法を妨げるためのものです。追加の帯域幅を消費し、すべての通信上の特徴を消すことは保証しません。通常は padding_scheme = "default" を維持し、明確なテスト結果を根拠に変更してください。
tcp_evasion = "segment" は ClientHello を順序付きのアプリケーション書き込みに分割するだけで、OS が最終的に送る TCP パケットの境界は保証しません。互換性の問題がある場合は off を試せます。現在 Geneva DSL は未対応であり、利用可能な機能として運用に組み込まないでください。