VMess・VLESS・Trojan・Shadowsocksの選び方|4つのプロキシプロトコルを比較

VMess、VLESS、Trojan、Shadowsocksを、開発の背景・暗号化・ハンドシェイクの負荷・モバイル端末のバッテリー消費から比較。利用シーンに合ったプロトコルの選び方も解説します。

この記事の要点

プロトコル名だけで速度や安定性、バッテリー消費が決まるわけではありません。サブスクリプションを入手し、接続先を選んでいる方向けに、プロキシプロトコル・トランスポート・セキュリティ層を整理したうえで、4種類の認証方式と接続コストを比較します。まずクライアントコアの対応状況を確認し、TLS・トランスポート・UDPの設定を点検してから、同じネットワーク条件で検証しましょう。

プロトコル・トランスポート・セキュリティ層

VMess、VLESS、Trojan、Shadowsocksはプロキシプロトコルの名称です。v2rayNはデスクトップ用クライアントであり、5つ目のプロトコルではありません。クライアントは接続先やサブスクリプション、システムプロキシ、ルーティングを管理し、実際の接続はコアが処理します。Android向けのv2rayNGはXrayコア、v2flyNGはv2flyコアを使用します。画面が似ていても、対応機能が同じとは限りません。

接続先の詳細を確認するときは、3つの層をあわせて見ましょう。プロトコルは認証とプロキシ要求の処理を定め、トランスポートはTCPやWebSocketなどデータの運び方を決めます。セキュリティ層はTLSなどで通信を保護します。REALITYはXrayのセキュリティ機能で、VMessと並ぶプロキシプロトコルではありません。また、どの接続先にも追加できるワンタッチ高速化機能でもありません。

4つのプロトコルの背景と暗号化の範囲

VMessはV2Rayプロジェクトから生まれ、ユーザー認証とデータ保護の仕組みを備えています。VLESSは当初、よりシンプルな設計で重複処理を減らすことを目指し、一般的な構成ではTLSやREALITYに通信経路の保護を任せます。TrojanはTLSトンネル上でプロキシ要求を運びます。Shadowsocksは比較的シンプルな暗号化プロキシとして設計されており、具体的な機能は使用する方式と実装によって異なります。

プロトコル 認証とデータ保護 インポート後に確認する項目
VMess UUIDでユーザーを識別します。現在の構成ではVMess AEADを使用し、ペイロードの暗号化はsecurityなどの設定で決まります。TLSを追加することもできます。 UUID、alterId、security、トランスポートの種類。現在のAEAD構成では、alterIdを0にするのが一般的です。
VLESS UUIDで認証します。encryptionがnoneの一般的な構成では、外側のTLSまたはREALITYで通信経路を保護します。 UUID、encryption、flow、セキュリティ層を確認します。追加の暗号化機能は、クライアントとサーバー双方のコアバージョンが対応している必要があります。
Trojan パスワードで認証し、通常はTLSでプロキシ要求とペイロードを保護します。パスワード認証はサーバー証明書の検証の代わりにはなりません。 パスワード、ポート、サーバー名、証明書の検証、トランスポート方式。
Shadowsocks 選択した暗号化方式でデータを保護します。従来のAEADとShadowsocks 2022では、鍵やプロトコルの仕様が異なります。 method、パスワードまたは鍵の形式、UDP対応を確認します。接続先名に「SS」とあるだけで判断しないでください。

「VLESSは暗号化されない」という説明が当てはまるのは、一般的なencryption: noneのようなプロトコル層の設定に限られます。接続全体が暗号化されているかどうかは、それだけでは判断できません。逆に、TLSを有効にしていても、パラメーターを任意に設定してよいわけではありません。サーバー名、証明書チェーン、サーバー側の設定が一致している必要があります。設定ミスを隠すために証明書の検証を無効にしないでください。

443
TLSでよく使われるサーバーポート(プロトコルの必須値ではありません)
16バイト
VMessとVLESSで使われるUUIDのバイナリー長
0
現在のVMess AEADで一般的なalterIdの設定値

ハンドシェイクの負荷:初回接続と継続通信を分けて考える

ハンドシェイクの負荷は接続確立時の待ち時間に影響しますが、ダウンロード帯域とは別のものです。TCPとTLS 1.3で新規接続する場合、通常はTCP接続に1往復、完全なTLSハンドシェイクにさらに1往復かかります。DNS、プロキシ要求、接続先サーバーへの接続は別途必要です。TLSセッション再開や接続の再利用、ネットワークのパケットロスによって実際の結果は変わるため、往復回数を単純に足してページ表示時間とみなすことはできません。

WebSocketではHTTPアップグレードの処理が加わります。接続を再利用すれば複数の論理接続で下層の接続を共有できますが、輻輳や障害の影響範囲も変わります。そのため、「VMess+WebSocket+TLS」と「ShadowsocksのTCP直結」を比べる場合、比較対象はプロトコルヘッダーの大きさだけではなく、接続設定全体です。

まとめ:まずトランスポートの組み合わせを確認し、ハンドシェイクの負荷を判断

短時間の接続で最初の表示が遅い場合は、DNS、TLS接続、頻繁な再接続を確認しましょう。大容量ファイルの転送が遅い場合は、回線帯域、パケットロス、サーバー負荷を先に確認してください。異なる問題を同じ「遅延」の数値だけで説明するのは適切ではありません。

モバイル端末のバッテリー消費:プロトコル名より無線通信の起動が重要

信頼できる「最も省電力なプロトコル」の統一ランキングはありません。暗号化にはCPUを使いますが、端末のAESハードウェアアクセラレーション、ChaCha20の実装、通信量によって結果は変わります。モバイル回線では、無線モジュールの頻繁な起動、接続の維持、電波が弱いときの再送、アプリのバックグラウンド同期も、主な電力消費要因になり得ます。

TUNで取り込む通信は、通常、単一アプリのプロキシより広範囲に及びます。DNS要求やUDP、バックグラウンド通信もコアを通る場合があります。そのため、消費電力の変化をすべてVLESSやTrojanのせいにすることはできません。テストでは詳細ログ、頻繁な速度測定、大量の接続先チェックを同時に実行しないでください。追加タスクの消費電力まで測定してしまいます。

  1. 端末、ネットワークの種類、画面の明るさを固定し、テスト開始前のバッテリー残量、電波状態、バックグラウンドアプリを記録します。
  2. 各回で同じ20分間の操作を行います。たとえば、ブラウジング10分、同じ画質の動画再生5分、画面を消して待機5分です。これはテスト手順の例であり、本サイトによる実測結果ではありません。
  3. TUNまたはアプリプロキシの方式、DNS、ルーティングルールを統一します。各回で変更するプロトコル設定は1つだけにし、実際の通信量を記録してください。
  4. 候補ごとに3回繰り返し、システムのバッテリー使用量とコアのログで再接続の有無を確認します。バッテリー残量の表示精度を下回る差から、結論を出さないでください。

利用中の接続先とクライアントに合わせた選び方

以下の「おすすめ」は、対応するサーバーパラメーターがそろっており、互換性のあるXrayコアで日常的に接続する場合を対象としています。プロトコルの順位を示すものではありません。サブスクリプションで利用可能なプロトコルが1種類だけなら、検証済みの設定をそのまま使いましょう。名称を変えるために接続全体を組み直す必要はありません。

VLESS:セキュリティ層のパラメーターがそろっている場合

おすすめ

サーバーから提供されたTLSまたはREALITYの設定一式を使い、flowとコアの対応状況を確認します。パラメーターがそろっていない場合は、設定を何度も切り替えて推測しないでください。

対象:Xrayコアを使用し、対応するVLESSサーバー設定がある場合

VMess:検証済みの接続を継続

現在のVMess AEAD接続が正常に動作しているなら、そのまま使い続けられます。トラブル時は、プロトコルを変更する前にシステム時刻、UUID、alterId、トランスポートの設定を確認しましょう。

対象:現在のサブスクリプションが主にVMessで、安定した接続実績がある場合

Trojan:TLS設定済みのサーバーがある場合

パスワード、サーバー名、証明書の設定に従って接続します。TLSは接続経路の重要な要素です。証明書の有効期限と、クライアント・サーバー間の名称の一致を保つ必要があります。

対象:検証可能なTLSトンネルがサーバーに設定されている場合

Shadowsocks:暗号化方式とUDPの要件を確認

暗号化方式と鍵の形式を確認し、従来のAEADと2022方式を区別します。ゲームや音声通話などでは、UDP転送も個別に検証してください。

対象:パラメーターが明確で、クライアントが該当方式のTCPまたはUDPプロキシに対応している場合

v2rayNで接続先を選択し、編集画面でプロトコルとトランスポートの設定を確認します。画面上の項目はバージョンによって異なる場合があります。Androidでv2rayNGまたはv2flyNGを使う場合は、まずコアがプロトコル、暗号化方式、セキュリティ拡張に対応しているか確認してください。同じサブスクリプションでも、2種類のコアで必ず同じ動作になるとは限りません。

同じ条件で検証:Tcpingの結果だけで判断しない

Tcpingで主に確認できるのは、指定ポートへのTCP到達性と接続確立までの時間です。UUIDやパスワード、TLSのサーバー名、プロキシ要求が正しいかは検証できず、UDPが使えるかどうかも分かりません。実際の接続テストはプロキシ要求に近い結果を得られますが、接続先、DNS、ルーティング、接続の再利用状況にも左右されます。

  1. 接続元を統一:v2rayNでシステムプロキシまたはTUNの状態をそろえ、ローカルの待ち受けポートがアプリ側の設定と一致しているか確認します。たとえばローカルポートを10808に設定した場合、アプリが古いポートを参照していないか確認してください。これは設定例であり、すべてのバージョンのデフォルト値ではありません。
  2. ルールの適用先を確認:テスト通信が選択したプロキシ経由のアウトバウンドに流れていることを確認します。ルーティングルールで対象が直接接続に設定されていると、テスト結果からその接続先の性能は判断できません。
  3. 項目ごとに測定:初回のリクエスト、連続リクエスト、大容量ファイルの転送、UDPを使うアプリをそれぞれ記録し、異なる結果を1つのスコアにまとめないでください。
  4. 交互に再テスト:A、B、A、Bの順に試し、各候補で少なくとも5回リクエストを実行します。中央値と失敗回数を記録し、時間帯によるネットワークの変化を抑えましょう。

まとめ:まず使える設定を選び、繰り返しテストした結果を比較

認証エラー、証明書エラー、ルーティングルールの不適用がある候補を先に除外し、同じタスクでの反復テストを比較します。プロトコルごとに異なるサーバーを使った場合は「接続先の比較」として記録し、プロトコル性能の結論とは区別してください。

プロトコル選びでよくある質問

VMessの接続先をVLESSに変更すれば、そのまま接続できますか?

できません。サーバー側にVLESSの受け入れ設定が必要で、UUID、セキュリティ層、トランスポートのパラメーターも一致させる必要があります。クライアントのプロトコル選択だけを変更するのではなく、サーバーから提供されたVLESS設定をインポートしてください。

TrojanのTcpingは正常なのに、実際の接続に失敗するのはなぜですか?

まずクライアントのログを開き、接続タイムアウト、TLS検証エラー、認証エラーを切り分けます。ポート、パスワード、サーバー名、端末の時刻、証明書の有効期限を順番に確認してください。TCPポートに接続できても、TLSやプロキシ認証が成功したとは限りません。

ShadowsocksでWebページは開けるのに、ゲームがつながらないのはなぜですか?

まずゲームがUDPを使うか確認し、アプリの通信がプロキシを通っているか、サーバーがUDPを許可しているか、暗号化方式とコアが該当する転送に対応しているかを調べます。WebページのTCP通信が成功しても、UDP経路が正常とは限りません。

VLESSに変更したらスマートフォンのバッテリー消費が増えました。すぐに戻すべきですか?

変更前後のTUN、ルーティング、バックグラウンド制限、ログレベルを比べ、再接続が続いていないか確認します。同じ通信量で繰り返しテストしてください。回線やトランスポートも同時に変更した場合、バッテリー消費の変化をVLESSの影響だとは判断できません。

v2rayNをダウンロード