ハンドシェイクの往復回数、暗号化層の負荷、モバイルでの消費電力という3つの軸で VMess、VLESS、Trojan、Shadowsocks を比較し、そのまま当てはめられる選定手順を示します。すでに v2rayNG や v2rayN にサブスクリプションを読み込み、同じサーバーの複数プロトコルポートを使い分けたいユーザー向けの内容です。読了後には、現在の回線でどのプロトコルのノードを優先して残すべきか判断できるようになります。
ハンドシェイク経路:4つのプロトコルはそれぞれ何往復多いのか
プロトコル間の差は、半分はハンドシェイク、半分は暗号化層から生まれます。ハンドシェイクは「接続確立に何往復必要か」を、暗号化層は「パケット1つあたりどれだけ CPU とバイト数を消費するか」を決めます。VMess と VLESS は同じ Project V 系の出身です。VMess は認証と暗号化層を自前で持ち、VLESS は暗号化を外側の TLS または REALITY に完全に任せ、自身はごく簡素なリクエストヘッダーだけを保持します。
Trojan は偽装路線で、認証情報を TLS 確立後の最初のデータに載せるため、ハンドシェイクのコストは通常の HTTPS ハンドシェイク1回とほぼ同じです。Shadowsocks は別の発想で、TLS を被せず AEAD でストリーム全体を直接暗号化し、クライアントは接続後すぐにデータを送れます。
4つのプロトコルを同じ表に並べると、違いは往復回数とヘッダーのバイト数という2列に集中します。
| プロトコル | ハンドシェイクの構成 | 追加の往復 | ヘッダー負荷(目安) |
|---|---|---|---|
| VMess(AEAD,alterId=0) | TCP + VMess 認証ヘッダー | 0 | 約 40〜50 バイト |
| VLESS | TCP + 最小限のリクエストヘッダー | 0 | 約 20〜40 バイト |
| Trojan | TCP + TLS ハンドシェイク + パスワード検証 | 1(TLS 1.3)/ 2(TLS 1.2) | 約 60 バイト |
| Shadowsocks(AEAD) | TCP + AEAD 暗号化ペイロード | 0 | 約 30 バイト |
表の追加往復は TLS なしの TCP を前提とした数値で、ヘッダー負荷には TLS レコード層は含みません。実際のバイト数はアドレス種別(ドメイン、IPv4、IPv6)によって変動します。VMess や VLESS を WebSocket + TLS に載せると、さらに TLS の往復が1〜2回加わります。同じ回線でも、TLS なしの TCP の VLESS が WebSocket + TLS の VMess より先に最初のバイトを返すのはこのためです。
ハンドシェイク負荷を初回バイト遅延に換算すると
1リクエストの総遅延は、おおむね回線の RTT × 往復回数にサーバー側の処理時間を足したものになります。海外回線で片道 80 ms なら、1往復は約 160 ms です。TLS 1.2 のハンドシェイクは TLS 1.3 より1往復多く、初回バイトもその分だけ、この回線では約 160 ms 遅れます。
ページを1つ開くとき、接続は1回ではなく十数回に及びます。ブラウザの接続再利用である程度は削減できますが、新しいドメインごと、サブスクリプション更新ごと、アプリごとのリクエストごとにハンドシェイクがやり直されます。プロトコル間の差は、この「ハンドシェイクのやり直し」の回数によって増幅されます。
VLESS TCP 1 往復 → リクエストヘッダーを初回パケットと同時に送信、合計 1 往復
VMess TCP 1 往復 → 認証ヘッダーを初回パケットと同時に送信、合計 1 往復
Trojan TCP 1 往復 → TLS 1.3 ハンドシェイク 1 往復、合計 2 往復
Shadowsocks TCP 1 往復 → AEAD ペイロードを直接送信、合計 1 往復
この階段を4つのプロトコルに当てはめると、VLESS と Shadowsocks は TCP の1往復だけで済み、VMess AEAD も認証ヘッダーが1つ増えるだけで往復は消費しません。Trojan と、TLS を被せた VMess・VLESS は1〜2往復多く支払います。プロトコルを選ぶときは、まず往復回数を数え、それから他のパラメータを検討しましょう。
結論:まず TLS のバージョン、次にプロトコル名
同じサーバー上での VLESS の TLS なし TCP と Trojan の初回バイト差は、主に TLS 1.2 と 1.3 の選択に由来します。サーバー側を TLS 1.3 に上げ、セッション再開を有効にしたほうが、プロトコルを変えるより効果が大きくなります。
モバイルでの消費電力:暗号化方式と接続回数
Android での消費電力の大半はプロトコル名ではなく、2つの要素で決まります。暗号アルゴリズムにハードウェアアクセラレーションが効くか、そして単位時間あたりの接続回数です。ARMv8 以降のスマホ SoC は一般に AES 命令セットを備えており、VMess と Shadowsocks で aes-128-gcm を選べば CPU 使用率は低く抑えられます。古い ARMv7 端末でのみ、chacha20-ietf-poly1305 のソフトウェア実装のほうが速くなります。
接続回数は Mux 多重化と関係します。v2rayNG のノード編集画面には「Mux を有効にする」スイッチがあり、オンにすると複数のリクエストが同じ接続を再利用し、ハンドシェイク回数が減ります。メッセージ系アプリのような高頻度・小リクエストに向きますが、大きなファイルのダウンロードでは逆にオフを推奨します。1本の接続がボトルネックになるためです。
回線品質が異なれば、このローカルパラメータの取捨選択も変わります。
おすすめ構成:回線品質別に2つのローカルパラメータ
モバイル回線(4G / 5G)
- VLESS + REALITY または Trojan + TLS のノードを優先
- VMess と Shadowsocks のノードは暗号化方式を aes-128-gcm に
- Mux を有効にしてハンドシェイク回数を削減
固定ブロードバンド(Wi-Fi / 有線)
- VLESS の TLS なし TCP と Shadowsocks AEAD はどちらも帯域を出し切れる
- 大容量ダウンロード時は Mux をオフ
- UDP が必要な用途では、サーバー側で UDP 転送が開放されているか確認
プロトコルはサーバー側が決めるもので、クライアント側で調整できるのは暗号化方式、Mux、ルーティングモードの3項目です。
用途別のプロトコル選び:4つの組み合わせの守備範囲
プロトコルは転送方式と組み合わせて初めて、サブスクリプションで実際に使えるノード形態になります。以下の4つの組み合わせで、サブスクリプションに現れるノード種別のほとんどをカバーできます。
VLESS + REALITY
おすすめハンドシェイクは TLS 1.3 の1回分で済み、自己署名証明書も不要、能動的探査への耐性は最も高い。Xray コアがネイティブ対応しており、flow には xtls-rprx-vision を指定します。
向いている用途:日常のメイン回線、海外への高遅延回線
Trojan + TLS
トラフィックの形は通常の HTTPS と同じで、ノードのパラメータはアドレス、ポート、パスワードの3つだけ。前提としてサーバー側に有効な証明書が必要です。
向いている用途:独自ドメインと証明書を持つ自前構築ノード
VMess + WebSocket + TLS
互換性は最も高く、CDN 中継も可能。代わりに WebSocket と TLS の層が増え、ハンドシェイクの往復回数は最多になります。
向いている用途:旧ノード、CDN 中継が必要な回線
Shadowsocks AEAD
ハンドシェイクは最も軽く CPU 負荷も最小で、接続確立はほぼ TCP の1往復のみ。TLS の外殻がないぶん、トラフィックの特徴は目立ちやすくなります。
向いている用途:LAN 内の踏み台、回線が安定した専用線
4つの組み合わせに絶対的な優劣はありません。VLESS + REALITY はハンドシェイクを最小に抑えつつ自己署名証明書も不要、Trojan は設定項目が最も少なく、VMess + WebSocket は CDN 中継が必要な場面ではほぼ唯一の選択肢、Shadowsocks は回線自体がクリーンなときに最もオーバーヘッドが小さくなります。
結論:まず回線の問題を切り分け、それからプロトコルを語る
ハンドシェイク回数が固定されれば、同じサーバー上での4プロトコルのスループット差は主に暗号化負荷によるもので、その差は10%以内です。一方、パケット損失率のより低い回線に替えると、初回バイト遅延は40%以上改善することがよくあります。
クライアントでの確認:プロトコル別フィールド対照表
プロトコル選定をクライアント側に落とし込むと、いくつかのフィールドの確認になります。v2rayNG ではノードを長押しして「編集」を開くと、別名、アドレス、ポート、ユーザー ID、alterId、暗号化方式、flow、転送方式、偽装ドメインが確認できます。v2rayN では「サーバー」メニューでノードを選んで「編集」をクリックし、フィールドは Android 版と一対一で対応します。
プロトコルによって使うフィールドは異なります。以下の対照表はチェックリストとして使えます。
| フィールド | VMess | VLESS | Trojan | Shadowsocks |
|---|---|---|---|---|
| ユーザー ID / パスワード | UUID | UUID | パスワード | パスワード |
| alterId | AEAD モードでは 0 を入力 | 該当なし | 該当なし | 該当なし |
| 暗号化方式 | auto / aes-128-gcm | none 固定 | 該当なし | aes-128-gcm / chacha20-ietf-poly1305 |
| フロー制御 flow | 該当なし | xtls-rprx-vision | 該当なし | 該当なし |
| 転送方式 | tcp / ws / grpc | tcp / ws / grpc | tcp | tcp |
VLESS ノードの「暗号化方式」を aes-128-gcm に変えてしまう。VLESS プロトコルではこのフィールドは none でなければならず、他の値を入れるとハンドシェイク段階でサーバーに拒否されます。より強い暗号化が必要な場合は、外側で TLS か REALITY を選ぶべきです。
ポートについて、v2rayN はデフォルトでローカルに 10808(SOCKS)と 10809(HTTP)を開き、v2rayNG のローカル SOCKS ポートも同じく 10808 です。この2つのポートは本機のアプリ専用で、ノードサーバー側の 443 や 8443 とは別物です。トラブルシューティングの際に混同しないよう注意してください。
パラメータを変更したらノード一覧に戻り、まず実接続の遅延テストを行い、それからページを開いてプロキシが効いているか確認します。速度テストは正常なのにページが開けない場合は、ルーティングモードとアプリ別プロキシで対象アプリが除外されていないかを優先的に確認してください。
よくある質問
同じノードでプロトコルを変えたら速度が大きく違う。これはプロトコルのせい?
まず2点を確認してください。サーバー側の TLS が 1.2 か 1.3 か、ノードに WebSocket を被せていないか。プロトコル自身のヘッダーは数十バイトにすぎず、倍単位の差を生む要因にはなりません。差は通常この2点と、サーバーから出口までの回線に由来します。
Android スマホではどのプロトコルが省電力?
鍵になるのはプロトコル名ではなく暗号化方式です。VMess と Shadowsocks で aes-128-gcm を選べば、ARMv8 端末では AES ハードウェアアクセラレーションが効いて CPU 使用率は低く抑えられます。さらに Mux を有効にしてハンドシェイク回数を減らしましょう。同じ機種でプロトコルを変えたときの消費電力差は、通常、画面輝度の影響より小さくなります。
Shadowsocks は TLS がないけど、まだ使える?
回線環境次第です。LAN 内の踏み台や安定した専用線なら、Shadowsocks はハンドシェイクが最も軽く遅延も最小です。公衆網に直接つなぐ場合は TLS の外殻がなくトラフィックの特徴が目立つため、速度制限を受ける確率が高くなります。そのような場面では VLESS か Trojan に切り替えるのを優先してください。
サブスクリプションで同じサーバーに複数のプロトコルポートがある場合、どれを残す?
まず実接続の遅延テストで各ポートをすべて測定し、初回バイトが最も速いものをメインとして残します。同じサーバーの異なるプロトコルポートは同じマシンを通るため、差は通常ハンドシェイク方式に由来します。TLS 1.3 の VLESS または Trojan のポートを優先して残し、他は削除せずに取っておけばいつでも切り替えられます。