<?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 ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/http/</link><description>Recent content in HTTP on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 12 Mar 2025 09:25:35 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/http/index.xml" rel="self" type="application/rss+xml"/><item><title>QUIC协议与HTTP/3性能优势</title><link>https://fe-interview.pangcy.cn/docs/network/network-20/</link><pubDate>Tue, 04 Mar 2025 09:31:00 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-20/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考察候选人对&lt;strong>网络协议底层原理&lt;/strong>和&lt;strong>传输层优化策略&lt;/strong>的理解深度，聚焦以下核心维度：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>协议设计思想&lt;/strong>：QUIC协议在应用层实现可靠传输的设计取舍（UDP改造 vs TCP协议栈依赖）&lt;/li>
&lt;li>&lt;strong>传输优化机制&lt;/strong>：零RTT握手与多路复用的技术实现路径及其对性能的影响&lt;/li>
&lt;li>&lt;strong>弱网适应能力&lt;/strong>：连接迁移等特性解决移动端网络切换痛点的具体原理&lt;/li>
&lt;/ol>
&lt;p>技术评估点：&lt;/p>
&lt;ul>
&lt;li>UDP实现可靠传输的核心机制（包重传/有序交付）&lt;/li>
&lt;li>零RTT握手与TLS 1.3的协同工作原理&lt;/li>
&lt;li>基于Connection ID的连接迁移实现&lt;/li>
&lt;li>多路复用与流控机制对队头阻塞的消除&lt;/li>
&lt;li>QUIC拥塞控制算法与TCP的差异性&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>可靠传输三要素：包编号（Packet Number）、确认机制（ACK）、纠错码（FEC）&lt;/li>
&lt;li>零RTT握手：会话票据（Session Ticket）与早期数据（0-RTT Data）&lt;/li>
&lt;li>连接迁移：连接ID（Connection ID）替代四元组绑定&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>可靠传输实现&lt;/strong>：
QUIC通过递增的Packet Number解决TCP重传歧义问题。每个数据包携带独立编号，接收端通过ACK帧反馈接收状态。当检测丢包时，发送方基于时间阈值而非重复ACK触发快速重传。&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="00b2031" class="language-text ">
 &lt;code>[发送端] --Packet#1--&amp;gt; [接收端]
 --Packet#2--&amp;gt; (丢失)
 --Packet#3--&amp;gt; 
 &amp;lt;--ACK#1,3-- 
[重传#2] --Packet#2-Retransmit--&amp;gt;&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>&lt;strong>零RTT握手&lt;/strong>：
客户端缓存服务器配置参数（TLS会话票据），后续连接时直接使用预共享密钥加密数据。首包携带应用数据（0-RTT Data）的同时完成加密协商，相较于TCP+TLS 1.3节省1个RTT。&lt;/p>
&lt;p>&lt;strong>连接迁移&lt;/strong>：
传统TCP连接依赖四元组（源IP/端口 + 目标IP/端口），网络切换导致连接中断。QUIC使用客户端生成的64位Connection ID作为唯一标识，网络层变化不影响连接状态。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>误认为UDP传输不可靠：QUIC在应用层实现可靠传输，UDP仅作为传输载体&lt;/li>
&lt;li>混淆0-RTT与1-RTT：零RTT仅适用于非首次连接，且存在重放攻击风险&lt;/li>
&lt;li>忽视多路复用的代价：流级别QoS控制复杂度高于TCP&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>QUIC通过以下机制实现高性能传输：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>可靠传输&lt;/strong>：基于UDP构建类TCP可靠性，通过唯一递增包编号消除重传歧义，结合前向纠错码降低重传率&lt;/li>
&lt;li>&lt;strong>零RTT握手&lt;/strong>：复用TLS会话票据实现&amp;quot;半持久化&amp;quot;安全连接，首包即携带有效载荷，降低延迟敏感型业务的首屏时间&lt;/li>
&lt;li>&lt;strong>多路复用&lt;/strong>：独立流（Stream）设计实现真并行传输，单个包丢失仅影响对应流，彻底解决TCP队头阻塞&lt;/li>
&lt;li>&lt;strong>连接迁移&lt;/strong>：通过连接ID解耦网络层变化，保持移动端IP切换时的会话连续性&lt;/li>
&lt;/ol>
&lt;p>弱网环境下核心增益：&lt;/p>
&lt;ul>
&lt;li>多路复用使高频小包请求不受单个丢包影响（如弱网下的API并发调用）&lt;/li>
&lt;li>自适应拥塞控制（如BBR算法）动态调整发包策略，提升带宽利用率&lt;/li>
&lt;li>连接迁移避免WiFi/4G切换导致的连接重建开销&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="协议配置示例caddy-server">协议配置示例（Caddy Server） &lt;a href="#%e5%8d%8f%e8%ae%ae%e9%85%8d%e7%bd%ae%e7%a4%ba%e4%be%8bcaddy-server" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>


 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="da13ad6" class="language-nginx ">
 &lt;code>{
 &amp;#34;apps&amp;#34;: {
 &amp;#34;http&amp;#34;: {
 &amp;#34;servers&amp;#34;: {
 &amp;#34;example&amp;#34;: {
 &amp;#34;listen&amp;#34;: [&amp;#34;:443&amp;#34;],
 &amp;#34;experimental_http3&amp;#34;: true,
 &amp;#34;tls&amp;#34;: {
 &amp;#34;certificate&amp;#34;: &amp;#34;auto&amp;#34;
 }
 }
 }
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;p>关键优化点：&lt;/p></description></item><item><title>资源加载性能优化</title><link>https://fe-interview.pangcy.cn/docs/network/network-25/</link><pubDate>Tue, 04 Mar 2025 09:31:00 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-25/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>本题主要考核候选人对以下维度的理解：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>浏览器资源加载机制&lt;/strong>：区分preload/prefetch/dns-prefetch的工作原理与应用场景&lt;/li>
&lt;li>&lt;strong>HTTP协议演进认知&lt;/strong>：解析HTTP/2 Server Push的RTT优化原理&lt;/li>
&lt;li>&lt;strong>性能优化实践能力&lt;/strong>：使用现代API实现懒加载的技术选型与实现细节&lt;/li>
&lt;/ol>
&lt;p>具体技术评估点：&lt;/p>
&lt;ul>
&lt;li>资源提示的优先级控制（preload立即加载 vs prefetch空闲加载）&lt;/li>
&lt;li>DNS预解析与TCP连接建立的时序关系&lt;/li>
&lt;li>Server Push的主动推送机制与传统请求响应模型的差异&lt;/li>
&lt;li>IntersectionObserver替代传统滚动监听方案的优势&lt;/li>
&lt;li>懒加载实现中的临界条件处理（占位符、加载失败等情况）&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>HTTP/2 Server Push &amp;gt; 资源提示优先级 &amp;gt; IntersectionObserver API&lt;/p>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>&lt;strong>资源提示对比&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>preload&lt;/code>：强制浏览器立即请求指定资源（优先级：High），适用于当前导航立刻需要的资源（如首屏字体/关键CSS）&lt;/li>
&lt;li>&lt;code>prefetch&lt;/code>：低优先级预加载未来页面可能使用的资源（如下一页的图片），浏览器空闲时执行&lt;/li>
&lt;li>&lt;code>dns-prefetch&lt;/code>：提前解析跨域DNS，缩短后续请求的DNS查询时间（约20-120ms）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>HTTP/2 Server Push&lt;/strong>：
通过服务端主动推送关联资源，减少客户端解析HTML后再次请求资源的RTT（Round Trip Time）。例如请求&lt;code>index.html&lt;/code>时主动推送&lt;code>style.css&lt;/code>，消除CSS文件请求的1个RTT（传统HTTP/1.1需要：HTML请求→HTML响应→CSS请求→CSS响应）。&lt;/p>
&lt;p>&lt;strong>IntersectionObserver&lt;/strong>：
通过异步观察目标元素与视窗交叉状态，避免传统滚动监听的高频计算。当图片进入视口时替换&lt;code>data-src&lt;/code>为真实src，实现按需加载。&lt;/p>
&lt;h3 id="常见误区">常见误区 &lt;a href="#%e5%b8%b8%e8%a7%81%e8%af%af%e5%8c%ba" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>误用preload加载非关键资源，导致关键资源被延迟&lt;/li>
&lt;li>认为dns-prefetch能加速同域资源（实际同域DNS已缓存）&lt;/li>
&lt;li>未配置Server Push缓存策略导致重复推送&lt;/li>
&lt;li>懒加载未设置阈值（threshold）导致图片加载过早&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="问题解答">问题解答 &lt;a href="#%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>&lt;strong>资源提示场景&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>&lt;code>preload&lt;/code>：首屏关键字体、折叠上方CSS/JS&lt;/li>
&lt;li>&lt;code>prefetch&lt;/code>：用户鼠标悬停时预取下一页商品数据&lt;/li>
&lt;li>&lt;code>dns-prefetch&lt;/code>：电商平台预解析第三方支付域名DNS&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>HTTP/2 Server Push&lt;/strong>：
服务端在响应主资源时主动推送子资源，消除客户端&amp;quot;发现-请求&amp;quot;的等待时间。例如推送首屏CSS文件可减少至少1次RTT，但需配合缓存策略避免过度推送。&lt;/p>
&lt;p>&lt;strong>IntersectionObserver懒加载&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="83c618e" class="language-javascript ">
 &lt;code>// 观察所有带data-src的图片
const observer = new IntersectionObserver((entries) =&amp;gt; {
 entries.forEach(entry =&amp;gt; {
 if (entry.isIntersecting) { 
 const img = entry.target
 img.src = img.dataset.src
 observer.unobserve(img) // 加载后解除观察
 }
 })
}, {
 rootMargin: &amp;#39;200px&amp;#39;, // 提前200px触发加载
 threshold: 0.01
})

document.querySelectorAll(&amp;#39;img[data-src]&amp;#39;).forEach(img =&amp;gt; observer.observe(img))&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;hr>
&lt;h2 id="解决方案">解决方案 &lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="编码优化点">编码优化点 &lt;a href="#%e7%bc%96%e7%a0%81%e4%bc%98%e5%8c%96%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>&lt;strong>加载失败处理&lt;/strong>：添加&lt;code>onerror&lt;/code>事件切换备用源&lt;/li>
&lt;li>&lt;strong>占位策略&lt;/strong>：使用低质量图片占位（LQIP）提升体验&lt;/li>
&lt;li>&lt;strong>兼容方案&lt;/strong>：添加IntersectionObserver polyfill或降级为滚动监听&lt;/li>
&lt;/ol>
&lt;h3 id="扩展性建议">扩展性建议 &lt;a href="#%e6%89%a9%e5%b1%95%e6%80%a7%e5%bb%ba%e8%ae%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>大流量场景&lt;/strong>：结合CDN预解析（如&lt;code>&amp;lt;link rel=&amp;quot;preconnect&amp;quot;&amp;gt;&lt;/code>）&lt;/li>
&lt;li>&lt;strong>低端设备&lt;/strong>：降低观察阈值，采用渐进加载策略&lt;/li>
&lt;li>&lt;strong>SEO优化&lt;/strong>：添加&lt;code>&amp;lt;noscript&amp;gt;&lt;/code>标签保证爬虫可抓取&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="深度追问">深度追问 &lt;a href="#%e6%b7%b1%e5%ba%a6%e8%bf%bd%e9%97%ae" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;ol>
&lt;li>
&lt;p>&lt;strong>如何验证Server Push实际效果？&lt;/strong>&lt;/p></description></item><item><title>浏览器输入url并按下回车后，期间发生了什么</title><link>https://fe-interview.pangcy.cn/docs/network/network-47/</link><pubDate>Wed, 12 Mar 2025 01:24:41 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-47/</guid><description>&lt;h2 id="考察点分析">考察点分析 &lt;a href="#%e8%80%83%e5%af%9f%e7%82%b9%e5%88%86%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;p>这道题目主要考察：&lt;/p>
&lt;ol>
&lt;li>网络协议相关知识（DNS、TCP、HTTP等）&lt;/li>
&lt;li>浏览器工作原理&lt;/li>
&lt;li>页面渲染流程&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="技术解析">技术解析 &lt;a href="#%e6%8a%80%e6%9c%af%e8%a7%a3%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h2>&lt;h3 id="关键知识点">关键知识点 &lt;a href="#%e5%85%b3%e9%94%ae%e7%9f%a5%e8%af%86%e7%82%b9" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;ol>
&lt;li>URL 解析&lt;/li>
&lt;li>DNS 查询&lt;/li>
&lt;li>TCP 连接&lt;/li>
&lt;li>HTTP 请求/响应&lt;/li>
&lt;li>浏览器渲染&lt;/li>
&lt;/ol>
&lt;h3 id="原理剖析">原理剖析 &lt;a href="#%e5%8e%9f%e7%90%86%e5%89%96%e6%9e%90" class="anchor" aria-hidden="true">&lt;i class="material-icons align-middle">link&lt;/i>&lt;/a>&lt;/h3>&lt;p>浏览器输入 URL 到页面显示的完整过程如下：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>URL 解析&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>浏览器解析 URL 的组成部分（协议、域名、路径等）&lt;/li>
&lt;li>检查 URL 是否合法&lt;/li>
&lt;li>进行 URL 编码&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>DNS 解析&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>首先查找浏览器 DNS 缓存&lt;/li>
&lt;li>然后查找操作系统 DNS 缓存&lt;/li>
&lt;li>查找本地 hosts 文件&lt;/li>
&lt;li>向 DNS 服务器发起递归查询&lt;/li>
&lt;li>最终获取目标服务器的 IP 地址&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>TCP 连接建立&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>进行三次握手&lt;/li>
&lt;li>如果是 HTTPS，还需要 TLS 握手&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>发送 HTTP 请求&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>构建 HTTP 请求报文&lt;/li>
&lt;li>添加请求头部信息&lt;/li>
&lt;li>发送请求数据&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>服务器处理请求并响应&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>服务器接收请求&lt;/li>
&lt;li>处理请求&lt;/li>
&lt;li>返回响应结果&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>浏览器解析渲染页面&lt;/strong>&lt;/p></description></item></channel></rss>