プロキシプロトコルは、完全なデプロイメントの組み合わせにおいて比較すべきである。ローカル側でどのようにトラフィックをインターセプトし、リモート側でどのようにターゲットと認証を表現するか、TCP/UDPがどのようにトランスポートするか、そしてセキュリティレイヤーが誰を検証するかである。特定のプロトコル名を「速度が高い」「絶対に識別できない」といった固定された等級に単純に変換してはならない。
HTTP CONNECT、SOCKS5は汎用プロキシインターフェースである。Shadowsocks、VMess、Trojan、VLESS、Hysteriaはそれぞれ独自の認証、メッセージ構造、トランスポート設計を持つ。TUNはローカルIPデバイスインターフェースであり、TLSはトランスポートセキュリティメカニズム、WebSocketはメッセージトランスポート、REALITYとVisionは異なる役割を担う。
完全な組み合わせの比較:インターセプト方法、プロキシセマンティクス、トランスポート、セキュリティレイヤーはそれぞれ記録する
ローカルエントリ:HTTP / SOCKS / TUN / TPROXY
アプリケーショントラフィックがプロキシにどのように進入するかを決定する
リモートプロトコル:ターゲット、認証、TCP/UDP リレーセマンティクス
例:Shadowsocks、Trojan、VLESS、Hysteria
トランスポートと保護:TCP / QUIC、TLS / REALITY、オプションの難読化
信頼性、認証、トラフィックの外観、実装オーバーヘッドを決定する
WebSocket、Vision、XUDP、TLS、TUNは同じ機能カテゴリに属さないため、同じ列に詰め込んで直接ランキングすることはできない。
5つの次元で範囲を絞り込む
次元 回答すべき質問
トラフィック要件 TCPのみをプロキシするか、UDP、長寿命接続、大量の並行接続が必要か
ネットワーク条件 エグジットでUDPを安定して使用できるか、MTUや中間デバイスの制限があるか
信頼方式 公開証明書、自己署名信頼、共有秘密鍵、または事前設定された検証材料
トランスポート組み合わせ 1リクエスト1接続、TCPでのマルチプレクシング、またはQUICの独立したストリーム
実装条件 両端のバージョン、クライアントの能力、CPU、メモリ、観測可能性
ローカルエントリとリモートエグジットは組み合わせ可能である。例えば、TUNでインターセプトした後、1つのリモートTCPプロキシプロトコルを使用する。これにより、そのリモートプロトコルが自動的にネイティブUDP機能を獲得するわけではない。また、SOCKSエントリからQUICのリモートトランスポートに接続することも可能だが、SOCKSは単なるローカルインターフェースに過ぎない。
コアメカニズムの対照
プロトコルまたは組み合わせ プロキシセマンティクスと一般的なトランスポート 認証と保護 重要な境界
HTTP CONNECT ホストポートごとにトンネルを確立、異なるHTTPバージョンでトランスポート可能 プロキシ認証と外部TLSは独立して設定可能 CONNECT自体は暗号化されない;通常のCONNECTはUDPプロキシではない
SOCKS5 CONNECT、BIND、UDP ASSOCIATE メソッドネゴシエーション;ユーザー名/パスワードは暗号化を伴わない TCP制御関連とUDPデータパスは分離されている
Shadowsocks AEADシリーズ TCP暗号化チャンク、UDPデータグラム保護 共有秘密鍵とAEAD 旧AEADとAEAD-2022は同一のワイヤーフォーマットではない
VMess 独自の要求およびデータセキュリティメカニズム、トランスポートを組み合わせ可能 ユーザーID、時間、暗号化設定 旧フォーマットとAEADヘッダーバージョンは区別が必要
Trojan TLS内でのプロキシ要求;TCPおよびUDPリレーカプセル化 TLSサーバーID + プロキシ資格情報 UDPは信頼できるストリームにカプセル化できるが、ネイティブUDPエグジットセマンティクスとは異なる
VLESS + TLS/REALITY など ユーザーとターゲットプロトコル、トランスポートセキュリティ/ストリームモードと組み合わせ ユーザーIDは依然として存在;保護は選択した組み合わせに依存 現在もVLESS暗号化オプションが存在するため、「VLESSは常に暗号化なし」と永久に記述することはできない
Hysteria 2 QUICストリームでTCPをリレー、QUIC DATAGRAMなどでUDPをトランスポート TLSおよびアプリケーション認証、オプションの難読化 UDPネットワーク条件、ネゴシエーション能力、輻輳制御戦略が効果に影響する
表は能力構造を記述するものであり、すべてのクライアントと組み合わせが全機能を実装することを保証するものではない。プロトコル拡張、Mux、UDPカプセル化は両端のバージョンに応じて確認する必要があり、ある実装のオプションモジュールをプロトコルの必須部分として扱ってはならない。
Shadowsocks:AEAD保護とワイヤーフォーマットバージョン
旧AEAD TCPストリームは、最初にsaltを送信し、セッションサブキーで長さブロックとコンテンツブロックを保護する。長さにも独立した認証タグがある。各チャンクには2回のAEAD操作があり、nonceは仕様に従って進化する。UDPは独立したデータグラムとして構築され、TCPストリームのチャンク状態を再利用しない。Shadowsocks AEAD
AES-128-GCM旧AEADフォーマットを例にとると、salt 16B、長さ 2B とそのタグ 16B、コンテンツ N B とそのタグ 16B となる。1000Bのプロトコルペイロードを1つのチャンクとして送信する場合、この方向の初回合計は 16+2+16+1000+16=1050B となる。2つのチャンクに分割すると 1084B となる。ここでペイロードには宛先アドレスなどのプロトコルデータが含まれる可能性があり、1000Bの純粋なアプリケーションコンテンツではない。また、TCP/IPヘッダーは含まれていない。
def old_aead_tcp_size ( payload_sizes , salt = 16 , tag = 16 ) :
assert all ( 0 < size <= 0x 3fff for size in payload_sizes )
return salt + sum ( 2 + tag + size + tag for size in payload_sizes )
assert old_aead_tcp_size ( [ 1000 ] ) == 1050
assert old_aead_tcp_size ( [ 500 , 500 ] ) == 1084
assert old_aead_tcp_size ( [ 500 , 500 ] ) - old_aead_tcp_size ( [ 1000 ] ) == 34
print ( ' 1チャンク / 2チャンク:' , old_aead_tcp_size ( [ 1000 ] ) , old_aead_tcp_size ( [ 500 , 500 ] ) )
AEAD-2022は、鍵の要件、セッション、リプレイ処理、メッセージ構造などを更新したものであり、単に暗号名を置き換えて旧saltとチャンク図式を適用してはならない。設定の移行時には、両端のプロトコル世代、鍵フォーマット、UDPサポートを同時に確認する必要がある。SIP022
認証暗号は規定条件下での機密性と完全性を保証するが、暗号文の長さ、チャンク分割、または接続動作が通常のHTTPSと一致することを約束するものではない。あるデプロイメントが識別されたからといって、AEADの暗号学的安全性が失われたことを意味するわけではない。
同じ1000バイトでも、小さく分割するとどれくらい余分にかかるか?
チャンク数を1から2に変更し、コンテンツの総量は変わらず、認証と区切りコストが1回分(34B)追加されるだけである。20チャンクに増やすと、認証と区切りのコスト比率が顕著に上昇する。ここでは明確なワイヤーフォーマットの予算を説明しており、バイト数が少ないことが必ずしも実際の速度が速いことを意味しない。
L = 16 + N + 34 k
図を準備しています 再読み込み
同じ1000バイトでも、小さく分割するとどれくらい余分にかかるか? 小さなチャンクはブロックを埋めるための待ち時間を減らす代わりに、長さフィールドと2つのタグを繰り返し支払うことになる。保護の境界とコンテンツサイズが線上の予算を決定し、単に接続全体にタグを1つ追加するわけではない。
{"id":"aead-chunk-overhead","title":"同じ1000バイトでも、小さく分割するとどれくらい余分にかかるか?","summary":"小さなチャンクはブロックを埋めるための待ち時間を減らす代わりに、長さフィールドと2つのタグを繰り返し支払うことになる。保護の境界とコンテンツサイズが線上の予算を決定し、単に接続全体にタグを1つ追加するわけではない。","height":1000,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p><div class=\"control\"><label for=\"chunks\" data-i18n=\"chunks\"></label><output for=\"chunks\" id=\"chunks-value\"></output><input id=\"chunks\" type=\"range\" min=\"1\" max=\"20\" value=\"1\" step=\"1\"></div><div id=\"budget\" class=\"budget\"></div><div class=\"metrics\"><div><span data-i18n=\"wire\"></span><strong id=\"wire\"></strong></div><div><span data-i18n=\"extra\"></span><strong id=\"extra\"></strong></div><div><span data-i18n=\"eff\"></span><strong id=\"eff\"></strong></div></div><p id=\"equation\" class=\"formula\"></p><details class=\"scope\"><summary data-i18n=\"scopeLabel\"></summary><p data-i18n=\"scope\"></p></details>","css":".intro{margin:8px 0 18px;color:var(--muted);font-size:14px}.caption,.hint{font-size:12px;color:var(--muted);margin-top:12px}.control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px 12px;align-items:center;margin:14px 0;font-size:13px}.control label{font-size:13px}.control output{color:var(--accent);min-width:5em;text-align:right;font-variant-numeric:tabular-nums}.control input{grid-column:1/-1;width:100%;margin:0}.presets{display:flex;gap:4px;align-items:stretch}.presets button{flex:1 1 0;min-width:0;overflow-wrap:anywhere;font-size:13px}.actions{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.actions button{flex:1;min-width:0;font-size:13px;min-height:42px}.copy{display:grid;font-size:14px;margin:16px 0}.copy>*{grid-area:1/1;margin:0}.reserve{visibility:hidden}.scope{margin-top:14px;color:var(--muted);font-size:12px}.scope summary{padding:8px 0;cursor:pointer}.scope p{margin-top:10px}.two{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.card{border:1px solid var(--rule);border-radius:9px;padding:14px;min-width:0}.card header{font-size:14px;font-weight:600;margin-bottom:10px}.card button{font-size:12px;width:100%;min-width:0}.card small{display:block;font-size:12px;color:var(--muted)}.card code{font-size:12px;overflow-wrap:anywhere}.metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:16px 0}.metrics>div{border-left:2px solid var(--accent);padding-left:10px;min-width:0}.metrics span{display:block;min-height:3.2em;color:var(--muted);font-size:12px}.metrics strong{font-size:23px;display:block;font-weight:500;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.formula{border-top:1px solid var(--rule);padding-top:12px;margin-top:14px;font-size:13px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.value{font:500 20px var(--viz-font-ui)}.legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:12px;color:var(--muted);margin:12px 0}.legend span:before{content:'';display:inline-block;width:8px;height:8px;border-radius:2px;background:var(--accent);margin-right:6px}.legend .second:before{background:var(--second)}.check{display:flex;align-items:center;gap:8px;font-size:13px;margin:12px 0}.check input{width:16px;height:16px;flex-shrink:0;accent-color:var(--accent)}select,input[type=text],input[type=number]{background:var(--paper);color:var(--ink);font:inherit;font-size:13px;padding:10px;border:1px solid var(--rule);border-radius:7px;max-width:100%;min-width:0}select{width:100%;min-height:42px}.band{height:20px;display:flex;background:var(--surface);border-radius:4px;overflow:hidden}.band i{height:100%;display:block;background:var(--accent);transition:width .25s}.band i.second{background:var(--second)}button:disabled{cursor:default}.status{font-size:13px;min-height:4.8em}.mono{font-family:var(--viz-font-mono);font-variant-numeric:tabular-nums}.muted{color:var(--muted)}\n@media(max-width:480px){.two{gap:8px}.card{padding:12px 9px}.actions button,.presets button{font-size:12px}.metrics strong{font-size:20px}.metrics{gap:8px}}\n@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation:none!important}}\n.track-row{margin:16px 0}.track-row>span{display:block;font-size:12px;color:var(--muted);margin-bottom:7px}.track{display:flex;gap:5px;min-width:0}.cell{flex:1;min-width:0;min-height:48px;border:1px solid var(--rule);border-radius:5px;background:var(--surface);display:flex;align-items:center;justify-content:center;text-align:center;padding:5px 3px;font-size:12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.cell.on{background:var(--accent-soft);border-color:var(--accent)}.cell.gold{background:var(--second-soft);border-color:var(--second)}.cell.empty{border-style:dashed;color:var(--muted)}.cell.error{border-color:var(--second);text-decoration:line-through}.choices{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:14px 0}.choices button{min-width:0;padding:10px 4px;font-size:12px;overflow-wrap:anywhere}.choices button[aria-current=true]{border-color:var(--accent);background:var(--accent-soft)}.relation{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr);align-items:center;gap:6px;margin:12px 0}.relation .cell{min-height:72px}.relation>i{text-align:center;font-style:normal;color:var(--accent)}.readout{font-size:13px;white-space:pre-line;min-height:6.4em;overflow-wrap:anywhere}.plot{position:relative;border-left:1px solid var(--rule);border-bottom:1px solid var(--rule);padding:8px 0;margin:18px 0}.plot-row{height:28px;position:relative;margin:4px 0;background:var(--surface)}.plot-row i{position:absolute;inset-block:5px;background:var(--accent);min-width:2px;transition:width .2s,left .2s}.plot-row b{position:relative;padding:4px 6px;font:11px/28px var(--viz-font-ui);background:var(--paper);border-radius:3px}.axis{display:flex;justify-content:space-between;font-size:11px;color:var(--muted)}\n\n/* Action labels must remain readable across locales and narrow embeds. */\n.actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}\n.actions button{overflow-wrap:anywhere;white-space:normal;min-height:58px;padding:8px}\nbutton{overflow-wrap:anywhere}\n@media(min-width:640px){.actions{grid-template-columns:repeat(3,minmax(0,1fr))}}\n\n.metrics span{overflow-wrap:anywhere}\n.panel{border:1px solid var(--rule);border-radius:9px;padding:12px;margin:14px 0;min-width:0}.panel h3{font-size:13px;margin:0 0 10px;color:var(--muted)}.source{font:13px/1.8 var(--viz-font-mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:12px 0}.source mark{background:var(--accent-soft);color:var(--ink);border-bottom:2px solid var(--accent)}.source .fault{background:var(--second-soft);border-color:var(--second)}.diagram{display:block;width:100%;height:auto;max-height:320px;margin:14px 0;overflow:visible}.diagram text{fill:var(--ink);font:12px var(--viz-font-ui)}.diagram .edge{stroke:var(--muted);stroke-width:1.5;fill:none}.diagram .edge.on{stroke:var(--accent);stroke-width:3}.diagram .node{fill:var(--surface);stroke:var(--rule);stroke-width:1.5}.diagram .node.on{fill:var(--accent-soft);stroke:var(--accent)}.diagram .node.gold{fill:var(--second-soft);stroke:var(--second)}.log{font:12px/1.8 var(--viz-font-mono);white-space:pre-line;overflow-wrap:anywhere;min-height:7.2em}.table{display:grid;gap:5px;margin:14px 0}.table .tr{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.table .tr>*{padding:8px 5px;background:var(--surface);border-radius:4px;min-width:0;overflow-wrap:anywhere;font-size:12px}.table .tr .on{background:var(--accent-soft)}.table .tr .gold{background:var(--second-soft)}.choices button{min-height:44px}.metrics strong{min-height:1.6em}.code-line{display:block}.code-line.on{background:var(--accent-soft);border-left:2px solid var(--accent);padding-left:6px}.status-badge{font-size:12px;color:var(--accent)}.tile-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}.tile-grid .cell{min-height:40px}.actions button{min-height:48px}.form-field{display:grid;gap:8px;margin:14px 0;font-size:13px}.form-field input{width:100%;font-family:var(--viz-font-ui)}.metrics.three{grid-template-columns:repeat(3,minmax(0,1fr))}.formula{min-height:3.2em}.presets{flex-wrap:wrap}.presets button{flex-basis:25%;min-height:44px}\n\n.budget{display:flex;height:28px;margin:16px 0;background:var(--surface);border-radius:5px;overflow:hidden}.budget i{display:block;background:var(--accent);transition:width .2s}.budget i.gold{background:var(--second)}.intervals{margin:16px 0}.interval{position:relative;height:36px;background:var(--surface);margin:6px 0;border-radius:4px;overflow:hidden}.interval i{position:absolute;height:100%;background:var(--accent-soft);border-left:2px solid var(--accent)}.interval i.gold{background:var(--second-soft);border-color:var(--second)}.interval span{position:relative;z-index:1;font:12px/36px var(--viz-font-ui);padding-left:7px}.table .tr>*{min-height:4.8em}.formula{white-space:pre-line;min-height:7.2em}.actions:has(>button:only-child){grid-template-columns:1fr}.metrics strong{min-height:3.2em}.rangegrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:3px;margin:14px 0}.rangegrid .cell{min-height:30px;padding:3px 1px;font-size:10px}.message{min-height:7.2em;white-space:pre-line;font:13px/1.8 var(--viz-font-ui);overflow-wrap:anywhere}\n/* Allow CJK hanging punctuation without overflowing a metric's border box. */\n.metrics>div{padding-right:4px}.metrics span{line-break:anywhere}\n\n.metrics strong{font-size:19px}","js":"const $=s=>document.querySelector(s);const set=(id,v)=>$('#'+id).textContent=v;const t=k=>viz.t(k);function cells(id,values){$('#'+id).replaceChildren(...values.map(v=>{const e=document.createElement('div');e.className='cell '+(v.cls||'');e.textContent=v.text;e.title=v.title||v.text;return e;}));}function pressed(mode){document.querySelectorAll('[data-mode]').forEach(e=>e.setAttribute('aria-pressed',String(e.dataset.mode===mode)));}const esc=s=>String(s).replace(/[&<>\"']/g,c=>({'&':'&','<':'<','>':'>','\"':'"',\"'\":'''}[c]));const fmt=s=>'{'+[...s].sort().join(', ')+'}';function graph(id,nodes,edges){const el=$('#'+id);el.setAttribute('viewBox','0 0 360 200');el.innerHTML='<defs><marker id=\"arrow-'+id+'\" viewBox=\"0 0 10 10\" refX=\"8\" refY=\"5\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"var(--muted)\"/></marker></defs>'+edges.map(e=>{const a=nodes[e[0]],b=nodes[e[1]],dx=b.x-a.x,dy=b.y-a.y,d=Math.hypot(dx,dy)||1;if(edges.some(r=>r[0]===e[1]&&r[1]===e[0])){const nx=-dy/d,ny=dx/d;return '<path class=\"edge '+(e[2]?'on':'')+'\" d=\"M '+(a.x+dx/d*22+nx*12)+' '+(a.y+dy/d*22+ny*12)+' Q '+((a.x+b.x)/2+nx*38)+' '+((a.y+b.y)/2+ny*38)+' '+(b.x-dx/d*25+nx*12)+' '+(b.y-dy/d*25+ny*12)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}return '<line class=\"edge '+(e[2]?'on':'')+'\" x1=\"'+(a.x+dx/d*25)+'\" y1=\"'+(a.y+dy/d*25)+'\" x2=\"'+(b.x-dx/d*28)+'\" y2=\"'+(b.y-dy/d*28)+'\" marker-end=\"url(#arrow-'+id+')\"/>';}).join('')+nodes.map(n=>'<g><circle class=\"node '+(n.cls||'')+'\" cx=\"'+n.x+'\" cy=\"'+n.y+'\" r=\"25\"/><text x=\"'+n.x+'\" y=\"'+(n.y+4)+'\" text-anchor=\"middle\">'+esc(n.name)+'</text>'+(n.sub?'<text x=\"'+n.x+'\" y=\"'+(n.y+43)+'\" text-anchor=\"middle\">'+esc(n.sub)+'</text>':'')+'</g>').join('');}function table(id,rows){$('#'+id).classList.add('table');$('#'+id).replaceChildren(...rows.map(r=>{const row=document.createElement('div');row.className='tr';r.forEach(x=>{const c=document.createElement('div');if(typeof x==='object'){c.textContent=x.text;c.className=x.cls||'';}else c.textContent=x;row.append(c)});return row;}));}function band(id,parts,total){$('#'+id).replaceChildren(...parts.map((p,i)=>{const e=document.createElement('i');e.style.width=(100*p.value/total)+'%';e.className=i%2?'gold':'on';e.title=p.name+': '+p.value;return e}));}function intervals(id,items,total){$('#'+id).replaceChildren(...items.map(p=>{const row=document.createElement('div');row.className='interval';const bar=document.createElement('i');bar.style.left=(100*p.start/total)+'%';bar.style.width=(100*(p.end-p.start)/total)+'%';bar.className=p.cls||'';const label=document.createElement('span');label.textContent=p.label;row.append(bar,label);return row;}));}function draw(){const n=+$('#chunks').value,total=1016+34*n;set('chunks-value',n);band('budget',[{name:'payload',value:1000},{name:'salt + framing + tags',value:16+34*n}],total);set('wire',total);set('extra',total-1000);set('eff',(100000/total).toFixed(1)+'%');set('equation','wire = 16 + 1000 + '+n+'×(2+16+16) = '+total+'\\nchunk data ≈ '+(1000/n).toFixed(1)+' B');$('#wire').dataset.value=total;}$('#chunks').oninput=draw;draw();","audio":false,"strings":{"chunks":"チャンク数","eff":"ペイロード比率","extra":"ペイロード以外のバイト","heading":"同じ1000バイトでも、小さく分割するとどれくらい余分にかかるか?","intro":"チャンク数を変更し、固定salt、コンテンツ、各チャンクの独立した認証のオーバーヘッドをそれぞれ描画する。","reset":"リセット","scope":"旧Shadowsocks AES-128-GCM AEAD TCPフォーマットのみ。1000Bのプロトコルペイロード、salt 16、チャンクあたり2+16+16のオーバーヘッド。AEAD-2022には適用しない。パフォーマンスや識別可能性を測定するものではない。","scopeLabel":"モデル範囲と前提","wire":"初回方向の総バイト数"}}
VMess:プロキシメッセージと外部トランスポートの分離
VMessは独自の認証要求ヘッダーとデータフォーマットを使用して、ターゲット、オプション、アイデンティティを表現する。AEADヘッダーフォーマットは区別すべきプロトコルバージョンである。時間関連の検証は、時計の条件がハンドシェイクに影響することを意味する。これを「TCPの中にランダムな暗号化バイトを置くもの」と単純化してはならない。V2Fly VMess仕様
WebSocketなどのトランスポート上でVMessをトランスポートすると、接続確立、フレーム、またはプロキシ動作のレイヤーが追加される。CDNが利用可能かどうかは、実際にサポートされているHTTPトランスポートと転送設定に依存し、1つのTCPストリームにTLSを被せただけで、任意のCDNが中継できるとは限らない。
複数の論理セッションをマルチプレクシングすると、接続確立回数を減らせる場合もあるが、外部TCPのヘッドオブブロッキングを共有することになるかもしれない。マルチプレクシングの選択は、短寿命接続の数、インタラクションレイテンシ、パケット損失条件に応じて行うべきであり、Muxが常に高速であると仮定してはならない。
Trojan:TLSの外観とアプリケーション認証は異なる保証
TrojanはTLS接続内でプロキシ認証および要求情報を送信し、そのプロトコルにはTCP CONNECTおよびUDP ASSOCIATE類のコマンドが含まれる。TLSはチャネルを保護しサーバーを検証するために使用され、プロキシ資格情報はリレーを許可するかどうかを決定するために使用される。どちらかが欠けても、互いを補完することはできない。
UDPデータは、このプロトコル内でターゲット、長さ、コンテンツなどのレコードフォーマットを持ち、TLSストリームでトランスポートされる。データグラムの境界は保持されるが、外部の信頼できるストリームにギャップが発生すると、後続のデータは復旧を待つ。TCPの信頼性特性は、リアルタイムUDPアプリケーションには適していない可能性がある。Trojanプロトコル
通常のTLSハンドシェイクとフォールバックサイトは、観察される動作を変更するのに役立つが、ハンドシェイクパラメータ、トラフィックサイズ、タイミング、デプロイメントの応答は依然として異なる可能性がある。有効な公開証明書は、対応するサービスアイデンティティを証明するだけであり、「通常のウェブページアクセスと区別できない」ことを保証するものではない。
VLESS、Vision、REALITYはそれぞれ何を担うか
VLESSはユーザーIDおよびプロキシ要求セマンティクスを保持しており、UUID類のアイデンティティフィールドを削除していない。従来のencryption: none組み合わせは、外部TLS/REALITYなどに保護を依存する。2026年9月現在、Project XドキュメントではVLESS暗号化オプションも定義されているため、「VLESSは常にプロトコル暗号化がない」と不変の事実として記述することはできない。
Visionは特定のストリーム処理モードであり、内部TLSの識別、パディング、適用パスの最適化に関係するものであり、新しいTLSスイートではなく、XUDPやMuxと同等に扱ってはならない。モードの選択はUDP443の処理ポリシーを変更する可能性があり、「VLESS」ラベルだけでなく、具体的なflowを確認する必要がある。Project X VLESS設定
REALITY:専用認証パスとフォールバックパスは区別する必要がある
サーバーに到達する接続
プロトコル認証材料とポリシーに従って処理される
期待される認証を通過したクライアント
専用検証完了後、プロキシパスに入る
認証に失敗 / 通常の接続
設定に従ってターゲットサービスなどにフォールバックして処理される
サードパーティのウェブサイトの秘密鍵を保持する必要はない。公開証明書をコピーしても、TLS秘密鍵の保持証明を代替することはできない。
REALITYは専用認証とハンドシェイク処理を採用し、認証に失敗した接続用のフォールバック動作を設計している。サーバーは独自の設定鍵を持ち、クライアントは対応する検証材料を保持する。これはサードパーティのウェブサイトの秘密鍵を取得するものではなく、「备案(登録)によって某ウェブサイトの真正な証明書を取得する」ことで合法なプロキシクライアントの認証を完了するものでもない。REALITYプロジェクト
現在のXrayクライアントコードには、AuthKeyなどの材料に基づく専用証明書検証パスが含まれており、通常の証明書検証と期待されるREALITY認証状態に達したかどうかを区別している。InsecureSkipVerifyフラグの1つを読み取って「全く検証を行わない」と断言するのは誤りであり、カスタム検証が設定されているからである。Xray REALITYクライアント実装
公開証明書をコピーしても、任意のサーバーがその証明書の秘密鍵を保持していることを証明することはできない。フォールバック転送と専用クライアント認証は別のパスである。このメカニズムは特定の違いを減らすことができるが、プロジェクトの目標から直接、すべてのアクティブな探査が無効である、またはすべての観察者に対して識別不可能な保証があることを導き出すことはできない。
Hysteria 2:QUICマルチストリームとオプションの外部難読化
Hysteria 2はQUIC/TLSを使用し、HTTP/3認証交換を通じてプロキシ使用権限を確立する。認証を通過した後、TCP接続はそれぞれ対応する双方向ストリームを使用し、UDP機能はサーバーによって表明され、プロトコルに従ってカプセル化される。これは、すべてのプロキシコンテンツを通常のウェブページHTTP応答としてトランスポートするものではない。
QUICはストリーム間で個別に回復を許可するが、接続の輻輳制御は依然として共有される。Hysteriaの輻輳と帯域幅設定は送信戦略に影響し、より大きな帯域幅値を埋め込んでも実際のリンク容量が増加するわけではない。ボトルネックのキューイングは、小さなインタラクションレイテンシを損なう可能性さえある。Hysteria 2プロトコル
Salamanderはオプションの外部難読化であり、saltを追加してQUICパケットバイトを処理する。これはパケット長、方向、タイミングを消除するものではなく、すべての検出が無効になることを保証するものでもない。現在のドキュメントには他の難読化オプションもリストされており、1つのオプションをプロトコルの唯一の永久形式として記述することはできない。QUICはTLSハンドシェイクを含み、Initial保護材料は公開情報から派生できるため、「QUICにはTLSフィンガープリントがない」という主張自体が成立しない。
UDPが制限されたネットワークでは、QUIC類のトランスポートは利用できないか不安定になる可能性がある。利用可能な場合でも、最初のバイト、尾部レイテンシ、スループット、CPUを測定すべきであり、「UDPベースである」という理由だけでパフォーマンスを判断すべきではない。クライアント設定は、サーバーおよび使用されているバージョンと一致させる必要がある。Hysteriaクライアント設定
有意義な比較を行うには
シナリオ 測定すべき項目 一般的な誤判断
短寿命リクエスト コールド/ホット接続の初回バイト、p95/p99 長時間ダウンロードのピークのみを見る
高並行 論理ストリーム数、CPU、キュー、メモリ 接続数が少ないことをコストが低いと見なす
リアルタイムUDP レイテンシ分布、損失、再配列、ヘッドオブブロッキング待ち UDPが送信できることを確認するのみ
パケット損失パス 回復時間、スループット、インタラクションの公平性 輻輳パラメータを変更した後、ネットワークの変化をプロトコルの利益としてカウントする
モバイルネットワーク アドレス切替時の回復、アイドル状態、再接続 CIDが存在することを移行が必ず成功すると見なす
トラフィック識別可能性 明確な観察者、特徴、テスト条件 データなしで「高/非常に高い」耐検出等级を並べる
比較では、サーバーの位置、パス、負荷、クライアントバージョンを固定し、設定の組み合わせを記録する必要がある。1回の失敗は、DNS、証明書、UDPパス、またはバージョンの不一致に起因する可能性がある。プロトコルのセキュリティ目標、実装の正しさ、デプロイメントの到達可能性、識別リスクは、それぞれ証拠に基づいて提示するべきである。
継続的な参照