<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络协议 on Fallensakura715's Blog</title><link>https://falnsakura.top/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/</link><description>Recent content in 网络协议 on Fallensakura715's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>fallensakura715</copyright><lastBuildDate>Mon, 09 Nov 2026 16:56:53 +0800</lastBuildDate><atom:link href="https://falnsakura.top/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/index.xml" rel="self" type="application/rss+xml"/><item><title>你的数据包长什么样？代理协议的报文结构及流量特征分析（一）</title><link>https://falnsakura.top/p/packet-and-net-protocols-1/</link><pubDate>Mon, 09 Nov 2026 16:56:53 +0800</pubDate><guid>https://falnsakura.top/p/packet-and-net-protocols-1/</guid><description>&lt;p&gt;在理解网络协议/数据包之前，你需要有一定的基础知识。&lt;/p&gt;&#10;&lt;h2 id="必要的基础知识一"&gt;&lt;a href="#%e5%bf%85%e8%a6%81%e7%9a%84%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86%e4%b8%80" class="header-anchor"&gt;&lt;/a&gt;必要的基础知识(一)&#10;&lt;/h2&gt;&lt;h3 id="ip端口asn"&gt;&lt;a href="#ip%e7%ab%af%e5%8f%a3asn" class="header-anchor"&gt;&lt;/a&gt;IP、端口、ASN&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;IP（网络层）&lt;/strong&gt;：数据包发送和接收的地址，用于唯一定位一台主机或路由器节点，包含 32 位的 &lt;strong&gt;IPv4&lt;/strong&gt;（如 &lt;code&gt;192.0.2.1&lt;/code&gt;）与 128 位的 &lt;strong&gt;IPv6&lt;/strong&gt;（如 &lt;code&gt;2001:db8::1&lt;/code&gt;）。内网地址和公网地址拥有不同的 IP 段。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;端口（传输层）&lt;/strong&gt;： TCP/UDP 的最终目的地，范围是 &lt;code&gt;0-65535&lt;/code&gt;，端口用于区分同一主机上的不同应用进程 (常见端口有 &lt;code&gt;TCP 22: SSH&lt;/code&gt;、&lt;code&gt;UDP 53: DNS&lt;/code&gt; 、 &lt;code&gt;TCP 80: HTTP&lt;/code&gt;、&lt;code&gt;TCP 443: HTTPS&lt;/code&gt;、&lt;code&gt;UDP 443: QUIC&lt;/code&gt; 等)。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ASN（自治系统编号，Autonomous System Number）&lt;/strong&gt;：全球互联网由成千上万个拥有统一路由管理策略的大型网络（如运营商中国电信/AT&amp;amp;T、大型云厂商 AWS/Cloudflare）拼接而成，每一个独立自治网络称为一个 &lt;strong&gt;AS（自治系统）&lt;/strong&gt;。ASN 是分给它们的唯一编号，用路由协议 (BGP) 计算数据包如何跨网传输。&lt;/p&gt;&#10;&lt;p&gt;就像送快递，快递是数据包，&lt;strong&gt;IP&lt;/strong&gt; 就是收发货的具体楼栋地址，&lt;strong&gt;端口&lt;/strong&gt;是房间门牌号，而 &lt;strong&gt;ASN&lt;/strong&gt; 则代表负责派送的快递公司（顺丰之类的）。&lt;/p&gt;&#10;&lt;p&gt;IP 有一个非常重要的区别：&lt;strong&gt;内网地址和公网地址。&lt;/strong&gt;&#10;你在命令行输入 &lt;code&gt;ipconfig&lt;/code&gt; 或 &lt;code&gt;ip addr&lt;/code&gt; 时，电脑上显示的地址可能是 &lt;code&gt;192.168.1.10&lt;/code&gt; ( &lt;code&gt;192.168.0.0/16&lt;/code&gt; ) ，常见内网 IPv4 地址段还有 &lt;code&gt;172.16.0.0/12&lt;/code&gt;、&lt;code&gt;10.0.0.0/8&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;家里不同的设备都使用同一网段的内网地址，无法直接在公网路由。家用 IPv4 网络通常依赖路由器的 &lt;strong&gt;NAT（网络地址转换）&lt;/strong&gt; 技术，路由器将内网多台设备发出的连接统一转换为路由器的公网 IP 发出，并在本地维护一张端口映射表来记录对应关系。&lt;/p&gt;&#10;&lt;p&gt;所以，网站看到的源 IP，通常是你家路由器或上游 NAT 设备使用的公网地址，而不是电脑上的 &lt;code&gt;192.168.1.10&lt;/code&gt;。&#10;&lt;img alt="image.png" decoding="async" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://imgu.falnsakura.top/PicGo/2026/11/3f671a47d464d243a54cb9a83c4c1c30.webp"&gt;&#10;&lt;/p&gt;&#10;&lt;h3 id="dns域名如何变成连接地址"&gt;&lt;a href="#dns%e5%9f%9f%e5%90%8d%e5%a6%82%e4%bd%95%e5%8f%98%e6%88%90%e8%bf%9e%e6%8e%a5%e5%9c%b0%e5%9d%80" class="header-anchor"&gt;&lt;/a&gt;DNS：域名如何变成连接地址&#10;&lt;/h3&gt;&lt;p&gt;我们习惯记忆域名（如 &lt;code&gt;www.example.com&lt;/code&gt;），但网络层建连必须依赖 IP 地址。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;DNS（Domain Name System，域名系统）&lt;/strong&gt; 是一套分布式查询系统，负责把域名解析成连接所需的信息，但它本身不负责建立网站连接。&lt;/p&gt;&#10;&lt;p&gt;最常见的地址记录是：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;记录类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;A&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;返回 IPv4 地址&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AAAA&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;返回 IPv6 地址&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CNAME&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;表示这个名字是另一个名字的别名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;HTTPS / SVCB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;现代扩展记录，除了地址外，还能直接提供端口、协议提示（如直接走 h3）和 ECH配置等参数&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;例如：访问 &lt;code&gt;www.example.com&lt;/code&gt;，浏览器给 DNS 服务器发查询请求，DNS 返回一个 IP 地址 &lt;code&gt;203.0.113.80&lt;/code&gt;，浏览器拿到地址后，结合协议默认端口（如 HTTPS 默认 443），才会连接这个地址上的服务。&lt;/p&gt;&#10;&lt;h4 id="加密-dns"&gt;&lt;a href="#%e5%8a%a0%e5%af%86-dns" class="header-anchor"&gt;&lt;/a&gt;加密 DNS&#10;&lt;/h4&gt;&lt;p&gt;传统 DNS 通常使用 UDP 53。查询内容一般没有加密，路径上能够观察这些数据包的设备（运营商、审查设备），可能看到你查询的域名。&lt;/p&gt;&#10;&lt;p&gt;常见的加密 DNS 方式包括：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;DoT (DNS over TLS)&lt;/strong&gt;：通过 TLS 隧道传输 DNS（通常为 TCP 853）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DoH (DNS over HTTPS)&lt;/strong&gt;：将 DNS 查询伪装在标准的 HTTPS 请求中传输（TCP/UDP 443）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;DoQ (DNS over QUIC)&lt;/strong&gt;：通过 QUIC 协议传输 DNS（通常为 UDP 853）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;加密以后，你与解析器之间的网络观察者通常不能直接读取查询内容，但&lt;strong&gt;递归解析器仍然知道你查询了什么&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;此外，目标连接的 IP、连接时间和流量大小也不会因为 DNS 加密而自动隐藏。&lt;/p&gt;&#10;&lt;h4 id="dns-污染"&gt;&lt;a href="#dns-%e6%b1%a1%e6%9f%93" class="header-anchor"&gt;&lt;/a&gt;DNS 污染&#10;&lt;/h4&gt;&lt;p&gt;所谓 DNS 污染，是指当你查询某个特定域名时，收到了被恶意伪造的错误 IP，导致无法与真实网站建立连接。&lt;/p&gt;&#10;&lt;p&gt;一种是在无 TLS 下 (UDP 53) 路径上的审查设备直接抢答伪造 IP 直接返回，一种是 DNS 服务器缓存被污染了，给你返回错误的 IP。&lt;/p&gt;&#10;&lt;p&gt;比如访问 &lt;code&gt;github.com&lt;/code&gt;，DNS 服务器 &lt;code&gt;223.5.5.5&lt;/code&gt;：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image.png" decoding="async" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://imgu.falnsakura.top/PicGo/2026/11/c3c0521eea34d296d948631de6dc85e5.webp"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;本应该解析到 ASN 是 &lt;code&gt;microsoft.com&lt;/code&gt; ASN 的 IP，图中新疆地区明显拿到了错误的 IP ，这就是典型的对&lt;code&gt;Github&lt;/code&gt; 进行了DNS 污染。&lt;/p&gt;&#10;&lt;h4 id="代理场景的-dns-解析"&gt;&lt;a href="#%e4%bb%a3%e7%90%86%e5%9c%ba%e6%99%af%e7%9a%84-dns-%e8%a7%a3%e6%9e%90" class="header-anchor"&gt;&lt;/a&gt;代理场景的 DNS 解析&#10;&lt;/h4&gt;&lt;p&gt;有两种常见方式：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;本地解析&lt;/strong&gt;：你的设备查域名 → 得到 IP→ 把 IP 交给代理服务器建立连接&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;远端解析&lt;/strong&gt;：你的设备把网站域名交给代理服务器 → 代理服务器查询 DNS → 代理服务器连接目标。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这会影响：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;哪一侧的 DNS 解析器会记录你的访问意图&lt;/li&gt;&#10;&lt;li&gt;本地接入网（运营商/防火墙）能否看到针对该域名的 DNS 查询或触发本地 DNS 污染&lt;/li&gt;&#10;&lt;li&gt;最终分配到哪里的 CDN 节点（本地解析可能拿到针对国内优化的 CDN，也可能是被污染的假 IP）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;很多所谓的“DNS 泄漏”，就是用户希望目标域名通过代理查 DNS ，实际却在本地发出了 DNS 查询记录，可以在 &lt;a class="link" href="https://browserleaks.com/dns" target="_blank" rel="noopener"&#10; &gt;browserleaks&lt;/a&gt; 查看你的 DNS 服务器以及有没有 DNS 泄露。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;代理服务器自身的域名解析&lt;/strong&gt;与&lt;strong&gt;目标网站的域名解析&lt;/strong&gt;是两种情况。如果你的代理节点填的是一个域名，你的设备在连上代理之前，依然得先通过某种本地方式把这个节点域名解析成 IP。&lt;/p&gt;&#10;&lt;h3 id="tcpudp-与-quic"&gt;&lt;a href="#tcpudp-%e4%b8%8e-quic" class="header-anchor"&gt;&lt;/a&gt;TCP、UDP 与 QUIC&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;TCP&lt;/strong&gt;：面向连接，提供可靠、有序的字节流传输。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;UDP&lt;/strong&gt;：无连接，提供简单、无状态的独立数据报传输。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;QUIC&lt;/strong&gt;：构建在 UDP 之上，在用户态自己实现了连接管理、多路复用、可靠重传与 TLS 1.3 加密。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;QUIC 很适合与 TCP 比较，但它在传输层是 QUIC 放在 UDP 里面。&lt;/p&gt;&#10;&lt;h4 id="tcp一条有编号会重传的连续传送带"&gt;&lt;a href="#tcp%e4%b8%80%e6%9d%a1%e6%9c%89%e7%bc%96%e5%8f%b7%e4%bc%9a%e9%87%8d%e4%bc%a0%e7%9a%84%e8%bf%9e%e7%bb%ad%e4%bc%a0%e9%80%81%e5%b8%a6" class="header-anchor"&gt;&lt;/a&gt;TCP：一条有编号、会重传的连续传送带&#10;&lt;/h4&gt;&lt;p&gt;假设应用要发送 &lt;code&gt;ABCDEFGHIJ&lt;/code&gt; ，网络中可能出现丢失、重复和乱序。TCP 使用序号、确认（ACK）、重传等机制，在正常工作时把它整理成可靠、有序的字节流交给接收方。&lt;/p&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;先收到：ABC&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;又收到：GHIJ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;中间缺：DEF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;在 &lt;code&gt;DEF&lt;/code&gt; 重传补齐之前，操作系统内核的 TCP 协议栈会暂存 &lt;code&gt;GHIJ&lt;/code&gt;，不会把它们提前交给应用，这就是后面提到的&lt;strong&gt;队头阻塞&lt;/strong&gt;。此外，TCP 还具备&lt;strong&gt;流量控制&lt;/strong&gt;（防止接收方处理不过来）和&lt;strong&gt;拥塞控制&lt;/strong&gt;（防止把网络管道塞爆）。&lt;/p&gt;&#10;&lt;p&gt;有握手和重传就意味着 TCP 适合 Web 浏览、文件传输、API 等对可靠性要求极高的场景。&lt;/p&gt;&#10;&lt;p&gt;TCP 有三次握手建立连接，加 TLS 需累加握手耗时：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;客户端 → SYN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;服务器 → SYN + ACK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;客户端 → ACK&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;可以粗略理解为双方确认通信状态、交换初始序号并建立连接状态。&lt;strong&gt;这个握手没有完成网站身份验证，也没有自动给数据加密。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;另一个必须理解的特点是：&lt;strong&gt;TCP 没有规定应用消息怎么分割。&lt;/strong&gt;&#10;发送方分两次发送：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第一次：HELLO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第二次：WORLD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;接收方可能一次读到并后的数据（粘包）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HELLOWORLD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;也可能因为网络分片或缓冲区原因，分三次才读完（拆包）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LLOWO&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RLD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;所以，使用 TCP 的应用协议需要自己设计分帧结构，例如使用长度字段、分隔符或者固定格式。这也是理解代理协议数据包格式的基础：协议中为什么经常会出现 &lt;code&gt;长度&lt;/code&gt;、&lt;code&gt;类型&lt;/code&gt; 这些字段。&lt;/p&gt;&#10;&lt;h4 id="udp一次次独立投递的数据包"&gt;&lt;a href="#udp%e4%b8%80%e6%ac%a1%e6%ac%a1%e7%8b%ac%e7%ab%8b%e6%8a%95%e9%80%92%e7%9a%84%e6%95%b0%e6%8d%ae%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;UDP：一次次独立投递的数据包&#10;&lt;/h4&gt;&lt;p&gt;UDP 无需像 TCP 一样握手，优势就是极低开销与延迟，但是丢包不重传、无原生拥塞控制，需应用层自理。&lt;/p&gt;&#10;&lt;p&gt;UDP 本身不负责保证：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;数据一定到达；&lt;/li&gt;&#10;&lt;li&gt;数据按顺序到达；&lt;/li&gt;&#10;&lt;li&gt;丢失的数据自动重传；&lt;/li&gt;&#10;&lt;li&gt;对方已经建立了类似 TCP 的连接状态。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;例如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;发送：数据包 1、数据包 2、数据包 3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;收到：数据包 3、数据包 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;UDP 不会自动替应用补上数据包 2，也不会替应用排序。&lt;/p&gt;&#10;&lt;p&gt;如果应用需要可靠性、拥塞控制或会话管理，就要在 UDP 之上设计相应机制 (例如 QUIC、KCP)。&lt;/p&gt;&#10;&lt;p&gt;UDP 非常适合实时音视频、在线游戏等场景，因为应用可以自己决定如何处理丢包和乱序。例如语音中，一个很晚才补回来的片段，可能已经没有播放价值。&lt;/p&gt;&#10;&lt;p&gt;但 &lt;strong&gt;UDP 在实际网络中不一定比 TCP 快&lt;/strong&gt;。中国国内运营商就经常对跨网或跨境的 UDP 包进行严格的 QoS 限速甚至随机丢包。实际表现取决于应用设计、网络条件、丢包情况及上层机制。&lt;/p&gt;&#10;&lt;h4 id="quic-在-udp-之上更完整的传输机制"&gt;&lt;a href="#quic-%e5%9c%a8-udp-%e4%b9%8b%e4%b8%8a%e6%9b%b4%e5%ae%8c%e6%95%b4%e7%9a%84%e4%bc%a0%e8%be%93%e6%9c%ba%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;QUIC 在 UDP 之上更完整的传输机制&#10;&lt;/h4&gt;&lt;p&gt;QUIC 不只是把 TCP 数据简单装进 UDP。它自己实现了连接管理、确认、丢失恢复、拥塞控制和多流复用，并结合 TLS 1.3 建立安全连接。&lt;/p&gt;&#10;&lt;p&gt;QUIC 的握手耗时缩短至 1-RTT 或 0-RTT（快速重连）。&lt;/p&gt;&#10;&lt;p&gt;QUIC 的优点是应用层单连接多流解耦 (比如同一条 QUIC 连接，有三个流，一个请求网页，一个请求图片，一个请求 JS)，&lt;strong&gt;彻底消除了传输层队头阻塞&lt;/strong&gt;；支持基于 Connection ID 的无缝&lt;strong&gt;连接迁移&lt;/strong&gt;（如 Wi-Fi 切蜂窝网络不中断）。&lt;/p&gt;&#10;&lt;p&gt;QUIC 一个流内的数据通常仍然需要按顺序交付。但流 A 的某段数据丢失时，流 B 已完整收到的数据，可以继续交付，这缓解了 TCP 单一有序字节流造成的跨流等待。&lt;/p&gt;&#10;&lt;p&gt;不过，多个 QUIC 流底层仍然共享同一条物理网络路径和同一个拥塞控制窗口，一个 UDP 包也可能包含多个流的数据。因此，丢包依然可能影响多个请求，只是阻塞机制有所不同，不会像 TCP 一样丢一个包整条连接等待。&lt;/p&gt;&#10;&lt;h3 id="http11http2-与-http3"&gt;&lt;a href="#http11http2-%e4%b8%8e-http3" class="header-anchor"&gt;&lt;/a&gt;HTTP/1.1、HTTP/2 与 HTTP/3&#10;&lt;/h3&gt;&lt;p&gt;HTTP 定义了浏览器与网站之间如何表达请求和响应。现在访问一个普通网页，大部分请求都是通过 HTTP 协议传输的。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;版本&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;常见传输方式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;主要组织方式&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP/1.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;TCP；HTTPS 时再使用 TLS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;纯文本格式的请求行、头部与正文&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP/2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;通常为 TLS + TCP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;二进制分帧、单连接多流复用、HPACK 头部压缩&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP/3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;QUIC，底层是 UDP&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;映射到 QUIC 流、头部压缩&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;em&gt;注：HTTP/2 规范虽然允许明文运行），但主流浏览器仅支持基于 TLS 的 HTTP/2；而 HTTP/3 底层的 QUIC 则强制要求 TLS 1.3。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h4 id="http11-纯文本协议"&gt;&lt;a href="#http11-%e7%ba%af%e6%96%87%e6%9c%ac%e5%8d%8f%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;HTTP/1.1 纯文本协议&#10;&lt;/h4&gt;&lt;p&gt;它长这样：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET /article HTTP/1.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host: www.example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-Agent: ExampleBrowser&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Authorization: Bearer token&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;GET&lt;/code&gt; 是 HTTP 规定的请求方法，RESTful API 还规定了 &lt;code&gt;POST&lt;/code&gt;、&lt;code&gt;PUT&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;等。&#10;&lt;code&gt;/article&lt;/code&gt; 是 HTTP 规定的请求路径，后面 &lt;code&gt;HTTP/1.1&lt;/code&gt; 是协议版本。&#10;下面的&lt;code&gt;Host&lt;/code&gt;、&lt;code&gt;User-Agent&lt;/code&gt; 是请求头，比如网站认证用的 &lt;code&gt;Authorization: Bearer token&lt;/code&gt; 就是请求头里的一行。&lt;/p&gt;&#10;&lt;p&gt;它表示客户端希望获取 &lt;code&gt;/article&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;它的瓶颈应用层队头阻塞&lt;/strong&gt;。在同一个 TCP 连接上，请求只能串行响应（必须等上一个请求完整返回，才能发送下一个响应），为了缓解这个问题，浏览器通常会对同一个域名并发建立最多 6 条独立的 TCP 连接。&lt;/p&gt;&#10;&lt;h4 id="http2-把一条连接分成多个逻辑流"&gt;&lt;a href="#http2-%e6%8a%8a%e4%b8%80%e6%9d%a1%e8%bf%9e%e6%8e%a5%e5%88%86%e6%88%90%e5%a4%9a%e4%b8%aa%e9%80%bb%e8%be%91%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;HTTP/2 把一条连接分成多个逻辑流&#10;&lt;/h4&gt;&lt;p&gt;HTTP/2 基于 TCP，引入&lt;strong&gt;二进制分帧层&lt;/strong&gt;，将数据切分成帧，实现&lt;strong&gt;单连接多路复用&lt;/strong&gt;，多个请求和响应在同一条 TCP 连接中交错并发传输，配合 HPACK 算法对重复的 HTTP 头部进行压缩。&lt;/p&gt;&#10;&lt;p&gt;也就是不同请求的数据被组织成帧，帧中带有 Stream ID。接收方只需根据帧头里的 Stream ID 把交错到达的数据分配回各个请求，这样就实现了&lt;strong&gt;单连接多路复用&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;它的瓶颈转到了 TCP 层队头阻塞&lt;/strong&gt;。底层仍是单一 TCP 连接，网络一旦丢包，TCP 的滑动窗口会停滞等待重传，导致所有并发 Stream 全部受阻。&lt;/p&gt;&#10;&lt;h4 id="http3-抛弃-tcp拥抱-quic-udp"&gt;&lt;a href="#http3-%e6%8a%9b%e5%bc%83-tcp%e6%8b%a5%e6%8a%b1-quic-udp" class="header-anchor"&gt;&lt;/a&gt;HTTP/3 抛弃 TCP，拥抱 QUIC (UDP)&#10;&lt;/h4&gt;&lt;p&gt;在 HTTP/3 中，不同的 HTTP 请求直接映射到底层不同的 QUIC 流上，并将头部压缩算法升级为适配乱序传输的 &lt;strong&gt;QPACK&lt;/strong&gt;。由于 QUIC 在传输层就已经实现了各流独立排序与重传，单一请求丢包只会导致该请求对应的流等待，其他请求完全不受干扰。&lt;/p&gt;&#10;&lt;p&gt;这里的改进可以概括为：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;HTTP/1：一个 TCP 一个 HTTP 流，浏览器建立多条 TCP 连接&lt;/li&gt;&#10;&lt;li&gt;HTTP/2：多个 HTTP 流，共用一条 TCP 有序字节流&lt;/li&gt;&#10;&lt;li&gt;HTTP/3：多个 HTTP 流直接跑在独立的 QUIC 流上&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;HTTP/3 仍然可能因为共享拥塞控制、应用依赖或头部压缩状态等原因发生等待，并未彻底消除了所有阻塞。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;现代代理协议为了对抗审查，极少再裸奔自定义二进制格式，而是大量伪装成 HTTP 连接（例如借用 HTTP/1.1 升级机制的 WebSocket、基于 HTTP/2 的 gRPC/H2 传输，以及伪装成 HTTP/3 网站的 Hysteria2 / TUIC）。此外，代理中的多路复用（Mux）与连接并发特征，也与 HTTP/2、HTTP/3 的机制相关。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="协议封装外层流量与内层流量"&gt;&lt;a href="#%e5%8d%8f%e8%ae%ae%e5%b0%81%e8%a3%85%e5%a4%96%e5%b1%82%e6%b5%81%e9%87%8f%e4%b8%8e%e5%86%85%e5%b1%82%e6%b5%81%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;协议封装、外层流量与内层流量&#10;&lt;/h3&gt;&lt;p&gt;协议封装指的是应用层协议，比如 HTTP/1.1 就是把内容按照 HTTP 规定的格式塞进 TCP 除了头之类的正文里传输。&lt;/p&gt;&#10;&lt;p&gt;例如一个 HTTPS 包的结构：&#10;&lt;img alt="image.png" decoding="async" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://imgu.falnsakura.top/PicGo/2026/11/c10e28f0a5d0624eb2ac592f92dc711e.webp"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;代理加入以后，会出现外层通信和内层通信。&#10;假设这条 HTTPS 连接经过了基于 TLS 协议的代理：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image.png" decoding="async" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://imgu.falnsakura.top/PicGo/2026/11/454664fedf51a3b8d61cc600ee0d3b71.webp"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;外层 TLS 你的设备与代理服务器之间建立，在代理服务器结束。代理解开这一层后，可以读取代理协议中的IP、SNI、认证信息等内容。如果里面承载的是浏览器与网站之间的 HTTPS，代理继续看到的仍然是内层 TLS 密文。&lt;/p&gt;&#10;&lt;p&gt;也就是说，在同一次网页访问中，逻辑上同时存在两层加密会话：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;外层加密&lt;/strong&gt;：你的设备 ↔ 代理服务器&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;内层加密&lt;/strong&gt;：你的浏览器 ↔ 目标网站&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;而在传输层，TCP 连接通常被代理切成了独立的两段：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;第一段 TCP&lt;/strong&gt;：你的设备 ↔ 代理服务器&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第二段 TCP&lt;/strong&gt;：代理服务器 ↔ 目标网站&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;这种嵌套 TLS in TLS 的特征后续会讲到。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="加密基础aead密钥交换与前向安全"&gt;&lt;a href="#%e5%8a%a0%e5%af%86%e5%9f%ba%e7%a1%80aead%e5%af%86%e9%92%a5%e4%ba%a4%e6%8d%a2%e4%b8%8e%e5%89%8d%e5%90%91%e5%ae%89%e5%85%a8" class="header-anchor"&gt;&lt;/a&gt;加密基础：AEAD、密钥交换与前向安全&#10;&lt;/h3&gt;&lt;h4 id="aead-同时提供内容保密和完整性验证"&gt;&lt;a href="#aead-%e5%90%8c%e6%97%b6%e6%8f%90%e4%be%9b%e5%86%85%e5%ae%b9%e4%bf%9d%e5%af%86%e5%92%8c%e5%ae%8c%e6%95%b4%e6%80%a7%e9%aa%8c%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;AEAD 同时提供内容保密和完整性验证&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;AEAD（Authenticated Encryption with Associated Data，带关联数据的认证加密）&lt;/strong&gt; 是现代对称加密的标准范式（如 &lt;code&gt;AES-GCM&lt;/code&gt;、&lt;code&gt;ChaCha20-Poly1305&lt;/code&gt;），不仅保证数据的&lt;strong&gt;机密性（加密不可读）&lt;/strong&gt;，还同时生成消息认证码（MAC）以保障&lt;strong&gt;完整性（防篡改）&lt;/strong&gt;；此外，它允许将未加密的元数据（如网络报头）一同纳入防篡改校验计算。&lt;/p&gt;&#10;&lt;p&gt;假设原始内容是 &lt;code&gt;转账金额：100&lt;/code&gt; ，只考虑保密性，是希望旁观者无法读取这个金额。&#10;完整性则要求：攻击者即使截获通信，也无法把它有效修改成 &lt;code&gt;转账金额：900&lt;/code&gt;，防止让接收方把修改后的内容当成合法消息接受。&lt;/p&gt;&#10;&lt;p&gt;AEAD 可以粗略理解为：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;密文 + 认证标签 = AEAD 加密(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 密钥，&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 一次性随机数 nonce，&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 明文，&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 附加认证数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;不过，AEAD 也有限制：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;它不会自动隐藏密文长度（明文多长，密文加上固定长度的 Tag 就是多长）&lt;/li&gt;&#10;&lt;li&gt;它不会自动隐藏通信双方 IP&lt;/li&gt;&#10;&lt;li&gt;它不会自动解决所有重放问题(重复发包)&lt;/li&gt;&#10;&lt;li&gt;它验证的是数据与密钥之间的关系，不能单独证明密钥持有者就是你想访问的网站&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="为什么需要密钥交换"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81%e5%af%86%e9%92%a5%e4%ba%a4%e6%8d%a2" class="header-anchor"&gt;&lt;/a&gt;为什么需要密钥交换&#10;&lt;/h4&gt;&lt;p&gt;对称加密（AES、ChaCha20）速度快，但前提是双方已经有同一把密钥。拿到这把密钥有两条路：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;预共享密钥（PSK）&lt;/strong&gt;：提前约定好，Shadowsocks 的密码就属于这种。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;密钥交换&lt;/strong&gt;：在公开信道上现场协商出一把只有双方知道的密钥。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;就像双方先公开一种底色，各自偷偷加一种只有自己知道的颜色，把混合结果交给对方，再各自往收到的混合色里加上自己的私有色。两人最后得到的颜色相同（协商出的共享密钥），而窃听者只看到两份混合色，没法把私有色分离出来。&lt;/p&gt;&#10;&lt;p&gt;数学表达是：公开底数 $g$ 和大素数 $p$，客户端选私钥 $a$ 发送 $g^a \bmod p$，服务端选私钥 $b$ 发送 $g^b \bmod p$，最终双方都能在本地算出相同的共享密钥 $g^{ab} \bmod p$。现代网络协议普遍采用基于椭圆曲线的 &lt;strong&gt;ECDH&lt;/strong&gt;，其中最常见的是 &lt;strong&gt;X25519&lt;/strong&gt;，它的公钥体积非常紧凑，只有固定的 &lt;strong&gt;32 字节&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;DH 只解决&amp;quot;怎么得到共享密钥&amp;quot;，不解决&amp;quot;对面是谁&amp;quot;。没有认证就会被中间人攻击，所以必须配合认证手段：证书签名、PSK、密码，或者 REALITY 里的服务端公钥。&lt;/p&gt;&#10;&lt;h4 id="前向安全"&gt;&lt;a href="#%e5%89%8d%e5%90%91%e5%ae%89%e5%85%a8" class="header-anchor"&gt;&lt;/a&gt;前向安全&#10;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：长期密钥将来泄露，过去的通信仍然安全。&lt;/p&gt;&#10;&lt;p&gt;每次建立新连接时，双方生成一次性的临时密钥对做 DH 密钥交换，用完销毁。服务端长期私钥只负责认证，不参与加密会话密钥。&lt;/p&gt;&#10;&lt;p&gt;对比 TLS 1.2 里的 RSA 密钥传输：客户端用服务器公钥加密 premaster secret，如果服务器私钥日后泄露，被录下来的历史流量就能全部解开。这就是 &lt;strong&gt;harvest now, decrypt later&lt;/strong&gt;。TLS 1.3 删掉了静态 RSA 密钥交换，只保留临时密钥交换，所以 &lt;strong&gt;TLS 1.3 一定有前向保密&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h4 id="后量子"&gt;&lt;a href="#%e5%90%8e%e9%87%8f%e5%ad%90" class="header-anchor"&gt;&lt;/a&gt;后量子&#10;&lt;/h4&gt;&lt;p&gt;前向保密防的是长期私钥将来泄露，不防 &lt;code&gt;量子计算机将来破解 ECDH&lt;/code&gt;。被录下来的 X25519 握手，将来同样可能被量子计算机还原。目前主流标准是&lt;strong&gt;混合密钥交换&lt;/strong&gt;：X25519 + ML-KEM-768（X25519MLKEM768），只要两者有一个没被攻破，会话就是安全的。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image.png" decoding="async" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://imgu.falnsakura.top/PicGo/2026/11/42d101c016c0efe6ea4211b736f47408.png"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;浏览器已经在 ClientHello 里带上这个 key_share，比如 Chromium 131，Safari 26 以上。&lt;/p&gt;&#10;&lt;p&gt;X25519MLKEM768 &lt;code&gt;key_share&lt;/code&gt; 从 32 字节涨到约 1216 字节，ClientHello 整体变成 1.5 KB 以上，常常被拆成两个 TCP 包。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="image.png" decoding="async" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://imgu.falnsakura.top/PicGo/2026/11/9dd8403c6c4efc6cde1bcf9b0276ad07.png"&gt;&#10;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;mihomo&lt;/code&gt; 的 uTLS 实现为了规避兼容性问题，在相关场景下回退使用了较老的 Chrome 120 指纹，而 &lt;code&gt;sing-box&lt;/code&gt; 则曾用新版浏览器指纹手动 trim 掉 &lt;code&gt;X25519MLKEM768&lt;/code&gt; 。这会导致 &lt;code&gt;ClientHello&lt;/code&gt; 与新版 Chrome 的 &lt;strong&gt;JA4 指纹&lt;/strong&gt;完全对不上（关于 TLS 指纹与 JA3/JA4 的细节，我们将在系列第三篇中深入剖析）。这种魔改 &lt;code&gt;ClientHello&lt;/code&gt;，可能变成一种特征。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>