Proxy protocols should be compared based on complete deployment combinations: how local traffic is intercepted, how the remote end expresses targets and authentication, how TCP/UDP is transported, and who verifies the security layer. You cannot directly map a protocol name to fixed levels like "high speed" or "always unrecognizable."
HTTP CONNECT and SOCKS5 are generic proxy interfaces; Shadowsocks, VMess, Trojan, VLESS, and Hysteria have their own authentication, packet, and transport designs. TUN is a local IP device interface, TLS is a transport security mechanism, WebSocket is message transport, and REALITY and Vision serve different responsibilities.
Narrow the Scope Using Five Dimensions
Dimension
Questions to Answer
Traffic Requirements
Is only TCP proxied, or are UDP, long-lived connections, and high concurrency needed?
Network Conditions
Can the egress stably use UDP? Are there MTU or middlebox restrictions?
Trust Method
Public certificates, self-signed trust, shared secrets, or pre-configured verification materials?
Transport Combination
One connection per request, multiplexed over TCP, or independent QUIC streams?
Implementation Conditions
Versions on both ends, client capabilities, CPU, memory, and observability?
Local entry points and remote exits can be combined; for example, using a remote TCP proxy protocol after TUN interception. This does not automatically grant the remote protocol native UDP capabilities. Similarly, a SOCKS entry can connect to a QUIC remote transport; SOCKS is merely the local interface.
Core Mechanism Comparison
Protocol or Combination
Proxy Semantics and Common Transport
Authentication and Protection
Key Boundaries
HTTP CONNECT
Creates tunnels by host/port; can use different HTTP versions for transport
Proxy authentication and outer TLS can be configured independently
CONNECT itself is not encrypted; standard CONNECT does not equal UDP proxying
SOCKS5
CONNECT, BIND, UDP ASSOCIATE
Method negotiation; username/password does not include encryption by default
TCP control association and UDP data path are separate
Shadowsocks AEAD Series
TCP encrypted chunks, UDP datagram protection
Pre-shared key and AEAD
Old AEAD and AEAD-2022 are not the same wire format
VMess
Own request and data security mechanisms; can combine transports
User identity, time, and encryption settings
Old format and AEAD header versions must be distinguished
Trojan
Proxy requests inside TLS; TCP and UDP relay encapsulation
TLS server identity + proxy credentials
UDP can be encapsulated in reliable streams, but this does not equal native UDP exit semantics
VLESS + TLS/REALITY etc.
User and target protocol, paired with transport security/stream modes
User ID still exists; protection depends on the selected combination
VLESS Encryption option currently exists; do not permanently write "no encryption"
Hysteria 2
QUIC stream relay for TCP, QUIC DATAGRAM etc. for UDP transport
TLS and application authentication, optional obfuscation
UDP network conditions, negotiation capabilities, and congestion strategies affect performance
The table describes capability structures and does not guarantee that every client and combination implements all features. Protocol extensions, Mux, and UDP encapsulation must be verified against versions on both ends; do not treat optional modules of a specific implementation as mandatory protocol parts.
Shadowsocks: AEAD Protection and Wire Format Versions
Old AEAD TCP streams first send a salt, then use session sub-keys to protect length blocks and content blocks; the length also has an independent authentication tag. Each chunk undergoes two AEAD operations, with nonces evolving according to the specification. UDP is constructed per independent datagram, not by reusing the chunked state of a TCP stream. Shadowsocks AEAD
Taking the old AEAD format with AES-128-GCM as an example: salt (16 B), length (2 B) plus its tag (16 B), content (N B) plus its tag (16 B). Sending 1000 B of protocol payload as one chunk results in 16+2+16+1000+16=1050 B for the first direction; splitting into two chunks results in 1084 B. Here, the payload may still contain protocol data such as destination addresses, so it does not equal 1000 B of pure application content, nor does it account for TCP/IP headers.
defold_aead_tcp_size(payload_sizes,salt=16,tag=16):assertall(0<size<=0x3fffforsizeinpayload_sizes)returnsalt+sum(2+tag+size+tagforsizeinpayload_sizes)assertold_aead_tcp_size([1000])==1050assertold_aead_tcp_size([500,500])==1084assertold_aead_tcp_size([500,500])-old_aead_tcp_size([1000])==34print('One / Two chunks:',old_aead_tcp_size([1000]),old_aead_tcp_size([500,500]))
AEAD-2022 updates key requirements, sessions, replay handling, and packet structures. You cannot simply replace the cipher name and continue using the old salt and chunk diagrams. Configuration migration requires checking protocol generations, key formats, and UDP support on both ends. SIP022
Authenticated encryption guarantees confidentiality and integrity under specified conditions; it does not promise that ciphertext length, packet splitting, or connection behavior will match standard HTTPS. If a specific deployment is identified, this does not imply that AEAD cryptography has failed.
How much extra overhead is added by splitting 1000 bytes into smaller chunks?
Changing the number of chunks from 1 to 2, while keeping the total content volume constant, only adds one instance of 34 B overhead; increasing to 20 chunks significantly raises the proportion of authentication and delimiting costs. This explains the budget for a clear wire format, without equating fewer bytes directly with faster real-world speed.
L=16+N+34k
Preparing the visual
How much extra overhead is added by splitting 1000 bytes into smaller chunks?
Smaller chunks reduce the need to wait for filling, but repeatedly pay for length and two tags. The protection boundary and content size jointly determine the wire budget, rather than simply adding one tag to the entire connection.
{"id":"aead-chunk-overhead","title":"How much extra overhead is added by splitting 1000 bytes into smaller chunks?","summary":"Smaller chunks reduce the need to wait for filling, but repeatedly pay for length and two tags. The protection boundary and content size jointly determine the wire budget, rather than simply adding one tag to the entire connection.","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":"Number of Chunks","eff":"Payload Proportion","extra":"Non-Payload Bytes","heading":"How much extra overhead is added by splitting 1000 bytes into smaller chunks?","intro":"Change the number of chunks and plot the overhead for fixed salt, content, and independent authentication per chunk.","reset":"Reset","scope":"Only old Shadowsocks AES-128-GCM AEAD TCP format, 1000 B protocol payload, salt 16, 2+16+16 overhead per chunk. Not applicable to AEAD-2022; does not measure performance or distinguishability.","scopeLabel":"Model Scope and Assumptions","wire":"Total Bytes in First Direction"}}
VMess: Proxy Packets and Outer Transport Separated
VMess uses its own authentication request headers and data formats to express targets, options, and identity; the AEAD header format is a protocol version that needs distinction. Time-related verification means clock conditions affect the handshake; do not simplify it to "some random encrypted bytes inside TCP." V2Fly VMess Specification
Carrying VMess over WebSocket or other transports adds a layer of connection establishment, framing, or proxy behavior. Whether CDN is usable depends on the actual HTTP transport and forwarding configurations it supports; you cannot assume any CDN can relay just because a TCP stream is wrapped in TLS.
Multiplexing multiple logical sessions may reduce the number of connection establishments, but they might also share head-of-line blocking in a single outer TCP stream. Whether to choose multiplexing should depend on the number of short connections, interaction latency, and packet loss conditions, rather than assuming Mux is always faster.
Trojan: TLS Appearance and Application Authentication Are Not the Same Guarantee
Trojan sends proxy authentication and request information inside a TLS connection; its protocol includes TCP CONNECT and UDP ASSOCIATE-like commands. TLS is used to protect the channel and verify the server, while proxy credentials determine whether relaying is allowed; neither can compensate for the absence of the other.
UDP data in this protocol has record formats for target, length, and content, carried over TLS streams. It preserves datagram boundaries, but when the outer reliable stream has gaps, subsequent data still waits for recovery; reliability characteristics suitable for TCP may not suit real-time UDP applications. Trojan Protocol
Normal TLS handshakes and fallback sites help change observed behavior, but handshake parameters, traffic size, timing, and deployment responses may still differ. A valid public certificate only proves the corresponding service identity; it does not guarantee "indistinguishability from normal web browsing."
What Do VLESS, Vision, and REALITY Each Handle?
VLESS retains user IDs and proxy request semantics; it has not removed UUID-like identity fields. The traditional encryption: none combination relies on outer TLS/REALITY etc. for protection; as of September 2026, Project X documentation still defines the VLESS Encryption option, so "VLESS never has protocol encryption" cannot be written as an immutable fact.
Vision is a specific stream processing mode related to inner TLS identification, padding, and applicable path optimization; it is not a new TLS suite and cannot be equated with XUDP or Mux. Mode selection may also change UDP443 handling policies; specific flows should be checked rather than just looking at the "VLESS" label. Project X VLESS Configuration
REALITY uses dedicated authentication and handshake processing, and designs fallback behavior for connections that fail authentication. The server has its own configuration key, and the client holds corresponding verification materials; this is not obtaining a third-party website's private key, nor is it completing legitimate proxy client authentication by "obtaining the actual certificate of a filed website." REALITY Project
Current Xray client code includes dedicated certificate verification paths based on materials like AuthKey, while distinguishing normal certificate verification from whether the expected REALITY authentication state is reached. Asserting "no identity verification at all" based on reading one InsecureSkipVerify flag is also wrong, because it configures custom verification. Xray REALITY Client Implementation
Copying a public certificate does not allow any server to prove possession of that certificate's private key; fallback forwarding and dedicated client authentication are two separate paths. The mechanism can reduce certain observation differences, but you cannot directly deduce from project goals that all active probes are ineffective, or that there is an indistinguishability guarantee for all observers.
Hysteria 2: QUIC Multi-Stream and Optional Outer Obfuscation
Hysteria 2 uses QUIC/TLS and establishes proxy eligibility through HTTP/3 authentication exchange. After authentication, each TCP connection uses corresponding bidirectional streams, and UDP capabilities are indicated by the server and encapsulated according to the protocol. It does not treat all proxy content as standard web HTTP responses.
QUIC allows independent recovery between streams, but connection congestion control is still shared. Hysteria's congestion and bandwidth configurations affect sending strategies; filling in larger bandwidth values does not increase actual link capacity; bottleneck queuing may even harm small interaction latency. Hysteria 2 Protocol
Salamander is an optional outer obfuscation that adds salt and processes QUIC packet bytes; it does not eliminate packet length, direction, and timing, nor does it guarantee failure of all detection. Current documentation also lists other obfuscation options; do not write one option as the protocol's unique permanent form. QUIC includes TLS handshakes, and Initial protection materials can be derived from public information, so "QUIC has no TLS fingerprint" is inherently incorrect.
In networks with UDP restrictions, QUIC-like transports may be unavailable or unstable; when available, first packet, tail latency, throughput, and CPU should be measured, rather than judging performance solely by "based on UDP." Client settings must match the server and the version used. Hysteria Client Configuration
How to Make Meaningful Comparisons
Scenario
What to Measure
Common Misjudgments
Short Requests
Cold/warm connection first byte, p95/p99
Only looking at long download peaks
High Concurrency
Number of logical streams, CPU, queues, and memory
Equating fewer connections with lower costs
Real-time UDP
Latency distribution, loss and reordering, head-of-line waiting
Only confirming UDP can send
Lossy Paths
Recovery time, throughput, and interaction fairness
Counting network changes as protocol benefits after changing congestion parameters
Mobile Networks
Address switch recovery, idle state, and reconnection
Assuming migration will definitely succeed just because CID is present
Traffic Distinguishability
Specific observers, features, and test conditions
Ranking "high/extremely high" anti-detection levels without data
Comparisons should fix server location, path, load, and client version, and record configuration combinations; a single failure may come from DNS, certificates, UDP paths, or version mismatches. Protocol security goals, implementation correctness, deployment reachability, and identification risks should be evidenced separately.