代理协议应按完整部署组合比较:本地怎样接管流量,远端怎样表达目标与认证,TCP/UDP如何承载,以及安全层验证谁。不能把某个协议名称直接换算成“速度高”“永远无法识别”这样的固定等级。
HTTP CONNECT、SOCKS5是通用代理接口;Shadowsocks、VMess、Trojan、VLESS和Hysteria又有各自的认证、报文与承载设计。TUN是本地IP设备接口,TLS是传输安全机制,WebSocket是消息承载,REALITY和Vision也承担不同职责。
先用五个维度缩小范围
| 维度 | 需要回答的问题 |
| 流量需求 | 只代理TCP,还是需要UDP、长连接与大量并发 |
| 网络条件 | 出口能否稳定使用UDP,是否有MTU或中间设备限制 |
| 信任方式 | 公共证书、自建信任、共享密钥或预配置验证材料 |
| 承载组合 | 一请求一连接、复用在TCP、还是QUIC独立流 |
| 实现条件 | 两端版本、客户端能力、CPU、内存和可观测性 |
本地入口和远端出口可以组合,例如TUN接管后使用一个远端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 | 自有请求和数据安全机制,可组合传输 | 用户身份、时间和加密设置 | 旧格式与AEAD头部版本需区分 |
| Trojan | TLS内代理请求;TCP及UDP中继封装 | TLS服务身份 + 代理凭据 | UDP可被装入可靠流,不等于原生UDP出口语义 |
| VLESS + TLS/REALITY等 | 用户与目标协议,搭配传输安全/流模式 | 用户ID仍存在;保护取决于所选组合 | 当前还存在VLESS Encryption选项,不能永久写成无加密 |
| Hysteria 2 | QUIC流中继TCP,QUIC DATAGRAM等承载UDP | TLS与应用认证、可选混淆 | UDP网络条件、协商能力及拥塞策略影响效果 |
表格描述能力结构,不保证每个客户端和每种组合都实现全部功能。协议扩展、Mux以及UDP封装需按两端版本核实,不能把某实现的可选模块当作协议强制部分。
Shadowsocks:AEAD 保护与线格式版本
旧AEAD TCP流先发送salt,再用会话子密钥保护长度块和内容块;长度也有独立认证标签。每个chunk有两次AEAD操作,nonce按规范演进。UDP则按独立数据报构造,不是复用一条TCP流的分块状态。Shadowsocks AEAD
以AES-128-GCM旧AEAD格式为例,salt16 B、长度2 B及其tag16 B、内容N B及其tag16 B。发送1000 B协议payload作为一个chunk,首次该方向共16+2+16+1000+16=1050 B;拆成两个chunk则1084 B。这里payload可能还包含目的地址等协议数据,不等于1000 B纯应用内容,也未计TCP/IP头。
def old_aead_tcp_size(payload_sizes, salt=16, tag=16):
assert all(0 < size <= 0x3fff 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('一个 / 两个 chunk:', old_aead_tcp_size([1000]), old_aead_tcp_size([500, 500]))
AEAD-2022更新了密钥要求、会话、重放处理和报文结构等,不能只替换cipher名称后继续套旧salt与chunk图。配置迁移要同时核对两端协议代际、密钥格式及UDP支持。SIP022
认证加密保证规定条件下的保密与完整性,不承诺密文长度、分包或连接行为与普通HTTPS一致。某种部署被识别,也不能推导为AEAD密码学已经失效。
同样1000字节,拆成小块会多出多少?
把chunk从1改成2,内容总量不变,只多付一次34 B开销;增加到20块后,认证和定界成本占比明显上升。这里解释一个明确线格式的预算,不将字节更少直接等同于真实速度更快。
L=16+N+34k
正在呈现知识画面
同样1000字节,拆成小块会多出多少?小块减少等待凑块的需要,却反复支付长度与两个tag。保护边界和内容大小共同决定线上预算,不是单纯给整个连接加一个tag。
{"id":"aead-chunk-overhead","title":"同样1000字节,拆成小块会多出多少?","summary":"小块减少等待凑块的需要,却反复支付长度与两个tag。保护边界和内容大小共同决定线上预算,不是单纯给整个连接加一个tag。","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":"payload占比","extra":"非payload字节","heading":"同样1000字节,拆成小块会多出多少?","intro":"改变chunk数量,分别画出固定salt、内容与每块独立认证的开销。","reset":"重置","scope":"仅旧Shadowsocks AES-128-GCM AEAD TCP格式,1000 B协议payload、salt16、每块2+16+16开销。不适用于AEAD-2022,不测量性能或可识别性。","scopeLabel":"模型范围与约定","wire":"首次方向总字节"}}
VMess:代理报文与外层传输分开
VMess用自己的认证请求头和数据格式表达目标、选项与身份,AEAD头部格式是需要区分的协议版本。时间相关验证意味着时钟条件会影响握手;不能把它简化为“TCP里放一些随机加密字节”。V2Fly VMess规范
在WebSocket或其他传输上承载VMess,会增加一层连接建立、帧或代理行为。CDN是否可用取决于它实际支持的HTTP承载和转发配置,不能因一条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 Encryption选项,因此不能把“VLESS永远没有协议加密”写成不变事实。
Vision是特定流处理模式,关系到内层TLS识别、填充与适用路径优化,不是新TLS套件,也不能与XUDP、Mux画等号。模式选择还可能改变UDP443处理策略,应核对具体flow而非只看“VLESS”标签。Project X VLESS配置
REALITY采用专用认证和握手处理,并为未通过认证的连接设计回落行为。服务器有自己的配置密钥,客户端持有对应验证材料;这不是取得第三方网站私钥,也不是靠“备案获取某网站真正证书”来完成合法代理客户端的认证。REALITY项目
当前Xray客户端代码包含基于AuthKey等材料的专用证书验证路径,同时区分正常证书验证与是否达到预期REALITY认证状态。读取其中一个InsecureSkipVerify标志就断言“完全不验身份”同样错误,因为它配置了自定义验证。Xray REALITY客户端实现
复制一张公开证书无法让任意服务器证明持有该证书私钥;回落转发与专用客户端认证是两条路径。机制可以减少某些观察差异,但不能从项目目标直接推出所有主动探测都无效,或对所有观察者都有不可区分保证。
Hysteria 2:QUIC 多流与可选外层混淆
Hysteria 2使用QUIC/TLS并通过HTTP/3认证交换建立代理使用资格。通过认证后,TCP连接各使用相应双向流,UDP能力由服务器表明并按协议封装。它并不是把所有代理内容当作普通网页HTTP响应传输。
QUIC允许流间分别恢复,但连接拥塞控制仍共享。Hysteria的拥塞与带宽配置影响发送策略,填更大的带宽值不会增加真实链路容量;瓶颈排队甚至可能损害小交互延迟。Hysteria 2协议
Salamander是可选外层混淆,加入salt并处理QUIC包字节;它不消除包长、方向和时序,也不保证所有检测都失效。当前文档还列出其他混淆选项,不能把一个选项写成协议唯一永久形式。QUIC包含TLS握手,Initial保护材料可由公开信息派生,所以“QUIC没有TLS指纹”本身就不成立。
UDP受到限制的网络中,QUIC类承载可能不可用或不稳定;可用时也应测量首包、尾延迟、吞吐和CPU,而非仅以“基于UDP”判断性能。客户端设置需与服务端和所用版本匹配。Hysteria客户端配置
怎样做有意义的比较
| 场景 | 需要测什么 | 常见误判 |
| 短请求 | 冷/热连接首字节、p95/p99 | 只看长下载峰值 |
| 高并发 | 逻辑流数量、CPU、队列和内存 | 把连接数少等同于成本低 |
| 实时UDP | 延迟分布、丢失和重排、队头等待 | 只确认UDP能发通 |
| 丢包路径 | 恢复时间、吞吐与交互公平性 | 换拥塞参数后把网络变化算作协议收益 |
| 移动网络 | 地址切换恢复、空闲状态与重连 | 把CID存在当作迁移必定成功 |
| 流量可识别性 | 明确观察者、特征和测试条件 | 无数据地排“高/极高”抗检测等级 |
比较应固定服务端位置、路径、负载和客户端版本,记录配置组合;一次失败可能来自DNS、证书、UDP路径或版本不匹配。协议安全目标、实现正确性、部署可达性和识别风险应分别给出证据。
继续查阅