<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>HTTP on Tony老师的博客</title><link>https://blog.tanteng.space/tags/http/</link><description>Recent content in HTTP on Tony老师的博客</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Sun, 22 Mar 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://blog.tanteng.space/tags/http/index.xml" rel="self" type="application/rss+xml"/><item><title>将 Next.js 照片博客从 Vercel 迁移到腾讯云 Lighthouse 并持续优化</title><link>https://blog.tanteng.space/2026/03/vercel-to-tencent-cloud-migration/</link><pubDate>Sun, 22 Mar 2026 08:00:00 +0800</pubDate><guid>https://blog.tanteng.space/2026/03/vercel-to-tencent-cloud-migration/</guid><description>&lt;p&gt;本文记录将基于 &lt;a href="https://github.com/sambecker/exif-photo-blog"&gt;exif-photo-blog&lt;/a&gt; 的照片站点从 Vercel 全家桶迁移到腾讯云 Lighthouse 自托管的过程，以及迁移后围绕图片处理和回源协议做的两轮关键优化。整个过程借助 WorkBuddy（Claude Opus 4.6）和 OpenClaw（MiniMax-2.5）完成代码改造、脚本编写和问题排查。&lt;/p&gt;</description></item><item><title>HTTP/2 多路复用、帧结构与 HoL 阻塞</title><link>https://blog.tanteng.space/2018/08/http2-multiplexing-head-of-line-blocking/</link><pubDate>Wed, 15 Aug 2018 10:00:00 +0800</pubDate><guid>https://blog.tanteng.space/2018/08/http2-multiplexing-head-of-line-blocking/</guid><description>&lt;p&gt;HTTP/2（RFC 7540，2015 年发布）解决了 HTTP/1.1 时代前端工程师无数痛点：&lt;strong&gt;多路复用替代串行请求&lt;/strong&gt;、&lt;strong&gt;头部压缩&lt;/strong&gt;、&lt;strong&gt;服务器推送&lt;/strong&gt;。本文从二进制帧入手，逐步拆解 HTTP/2 的核心机制，并分析它的局限——TCP 层的 Head-of-Line 阻塞问题。&lt;/p&gt;
&lt;h2 id="http11-的痛点"&gt;HTTP/1.1 的痛点&lt;/h2&gt;
&lt;p&gt;HTTP/1.1 默认每个连接只能处理一个请求-响应。这种串行模型导致：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器只能并发开 6 个 TCP 连接（Chrome 默认），每个连接还得排队&lt;/li&gt;
&lt;li&gt;想绕开必须用域名分片、雪碧图、CSS 合并、JS 合并&lt;/li&gt;
&lt;li&gt;头部每次都重复传输（特别是 cookie），浪费带宽&lt;/li&gt;
&lt;li&gt;没法主动推送资源，得等客户端解析 HTML 后再请求&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HTTP/2 的设计目标正是消除这些工程上的丑陋 hack。&lt;/p&gt;
&lt;h2 id="二进制分帧层"&gt;二进制分帧层&lt;/h2&gt;
&lt;p&gt;HTTP/2 最大的变化是引入了&lt;strong&gt;二进制分帧层（Binary Framing Layer）&lt;/strong&gt;，所有信息都用 Frame 传输：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph LR
 subgraph Frame
 L[Length: 24 bits]
 T[Type: 8 bits]
 F[Flags: 8 bits]
 S[Stream ID: 31 bits]
 P[Payload: 可变长]
 end

 L --&amp;gt; T --&amp;gt; F --&amp;gt; S --&amp;gt; P&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;字段&lt;/th&gt;
 &lt;th&gt;大小&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Length&lt;/td&gt;
 &lt;td&gt;24 bits&lt;/td&gt;
 &lt;td&gt;Payload 长度&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Type&lt;/td&gt;
 &lt;td&gt;8 bits&lt;/td&gt;
 &lt;td&gt;帧类型（DATA、HEADERS、PRIORITY 等）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Flags&lt;/td&gt;
 &lt;td&gt;8 bits&lt;/td&gt;
 &lt;td&gt;类型相关标志位&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Stream Identifier&lt;/td&gt;
 &lt;td&gt;31 bits&lt;/td&gt;
 &lt;td&gt;流 ID（1 为奇数表示客户端发起的流）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Payload&lt;/td&gt;
 &lt;td&gt;可变&lt;/td&gt;
 &lt;td&gt;帧内容&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;关键的 10 种帧：&lt;/p&gt;</description></item><item><title>HTTPS TLS 1.2 握手过程与加密原理全解析</title><link>https://blog.tanteng.space/2018/05/https-tls-handshake/</link><pubDate>Thu, 10 May 2018 10:00:00 +0800</pubDate><guid>https://blog.tanteng.space/2018/05/https-tls-handshake/</guid><description>&lt;p&gt;HTTPS = HTTP + TLS（早期叫 SSL）。TLS 在传输层之上、应用层之下，提供&lt;strong&gt;加密&lt;/strong&gt;、&lt;strong&gt;完整性校验&lt;/strong&gt;和&lt;strong&gt;身份认证&lt;/strong&gt;三大能力。本文聚焦 TLS 1.2（当前仍为主流的版本），从密码学原语到完整握手逐步剖析。&lt;/p&gt;
&lt;h2 id="三大密码学原语"&gt;三大密码学原语&lt;/h2&gt;
&lt;p&gt;TLS 用到三类基本工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;对称加密&lt;/strong&gt;（如 AES、ChaCha20）：加密实际传输的数据，速度快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非对称加密&lt;/strong&gt;（如 RSA、ECDSA）：用于密钥交换和身份认证，效率低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哈希 + MAC&lt;/strong&gt;（如 SHA-256、HMAC）：保证数据完整性，防止篡改&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;TLS 的精妙之处在于&lt;strong&gt;用非对称加密安全地协商出一个对称密钥&lt;/strong&gt;，之后的通信都用对称加密完成——兼顾安全和性能。&lt;/p&gt;
&lt;h2 id="tls-12-完整握手流程"&gt;TLS 1.2 完整握手流程&lt;/h2&gt;
&lt;p&gt;一个完整的 TLS 1.2 RSA 密钥交换握手需要 &lt;strong&gt;2-RTT（两次往返）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;sequenceDiagram
 participant C as Client
 participant S as Server

 C-&amp;gt;&amp;gt;S: 1. ClientHello&amp;lt;br/&amp;gt;TLS 版本、随机数、加密套件列表
 S-&amp;gt;&amp;gt;C: 2. ServerHello&amp;lt;br/&amp;gt;选定加密套件、随机数&amp;lt;br/&amp;gt;Certificate (服务器证书链)&amp;lt;br/&amp;gt;ServerHelloDone
 C-&amp;gt;&amp;gt;S: 3. ClientKeyExchange&amp;lt;br/&amp;gt;用服务器公钥加密 Pre-Master Secret&amp;lt;br/&amp;gt;ChangeCipherSpec&amp;lt;br/&amp;gt;Finished (MAC 校验)
 S-&amp;gt;&amp;gt;C: 4. ChangeCipherSpec&amp;lt;br/&amp;gt;Finished (MAC 校验)

 Note over C,S: 握手完成，后续用对称密钥加密通信&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="第一步clienthello"&gt;第一步：ClientHello&lt;/h3&gt;
&lt;p&gt;客户端发送：&lt;/p&gt;</description></item><item><title>登录安全：重放攻击与防御策略</title><link>https://blog.tanteng.space/posts/login-security/</link><pubDate>Wed, 01 Feb 2017 04:59:01 +0800</pubDate><guid>https://blog.tanteng.space/posts/login-security/</guid><description>&lt;p&gt;现在的应用系统中，大部分密码存储都是采用 md5 加密后存储，常用的登录基本流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前端 web 页面用户输入账号、密码，点击登录&lt;/li&gt;
&lt;li&gt;请求提交之前，web 端首先通过客户端脚本对密码原文进行 md5 加密&lt;/li&gt;
&lt;li&gt;提交账号、md5 之后的密码&lt;/li&gt;
&lt;li&gt;后端验证账号与密码是否与数据库中的一致&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种流程看似安全，但实际上存在&lt;strong&gt;重放攻击&lt;/strong&gt;风险！&lt;/p&gt;</description></item><item><title>Nginx SSI 使用指南</title><link>https://blog.tanteng.space/posts/nginx-ssi-guide/</link><pubDate>Fri, 08 Apr 2016 12:47:34 +0800</pubDate><guid>https://blog.tanteng.space/posts/nginx-ssi-guide/</guid><description>&lt;blockquote&gt;
&lt;p&gt;这是最早期的 SSR 方式之一——服务端在返回 HTML 前完成页面组装，客户端直接拿到完整页面，而非空壳再客户端渲染。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;相信很多人在浏览网页时都遇到过这样的情况：本地在开发环境运行正常的页面，部署到测试环境后却发现部分内容缺失。比如导航栏、页脚、公用组件等内容本地看不到。&lt;/p&gt;
&lt;p&gt;如果你遇到这样的情况，先检查一下页面源码中是否有类似这样的代码：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;&amp;lt;!--#include virtual=&amp;#34;/new/ssi/script.html&amp;#34;--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;这就对了——这就是 SSI（Server Side Include）在起作用。本地没有配置 SSI，所以包含的内容没有渲染出来。&lt;/p&gt;</description></item><item><title>HTTP 协议演进：从 1.0 到 2.0 的工程意义</title><link>https://blog.tanteng.space/2015/09/http-protocol-evolution/</link><pubDate>Sun, 20 Sep 2015 14:00:00 +0800</pubDate><guid>https://blog.tanteng.space/2015/09/http-protocol-evolution/</guid><description>&lt;p&gt;2015 年初，一个普通的网页大约包含 100+ 个 HTTP 请求（HTML、CSS、JS、图片、字体、统计、追踪）。用 HTTP/1.0 的浏览器加载完一个页面要等几十秒——不是带宽不够，是 TCP 连接来回握手、响应必须串行排队这两个看似无关的设计叠加起来，把延迟推到了用户能感知的阈值。&lt;/p&gt;
&lt;p&gt;从 HTTP/1.0（RFC 1945，1996）到 HTTP/2（RFC 7540，2015），整个 20 年的演进史可以浓缩成三个工程问题：&lt;strong&gt;怎么减少 TCP 握手？怎么并行？怎么压缩重复的头？&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>