<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>流量控制 on ZiYang FrontEnd Interview</title><link>https://fe-interview.pangcy.cn/tags/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6/</link><description>Recent content in 流量控制 on ZiYang FrontEnd Interview</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 06 Mar 2025 13:07:39 +0800</lastBuildDate><atom:link href="https://fe-interview.pangcy.cn/tags/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>滑动窗口与流量控制</title><link>https://fe-interview.pangcy.cn/docs/network/network-18/</link><pubDate>Tue, 04 Mar 2025 09:31:00 +0000</pubDate><guid>https://fe-interview.pangcy.cn/docs/network/network-18/</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>该问题考察候选人对TCP协议核心机制的理解深度及系统化思维能力，主要评估：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>流量控制原理&lt;/strong>：滑动窗口与接收窗口（RWND）动态调节机制&lt;/li>
&lt;li>&lt;strong>拥塞控制算法&lt;/strong>：慢启动/拥塞避免阶段的窗口调整逻辑&lt;/li>
&lt;li>&lt;strong>协议协同机制&lt;/strong>：ACK确认、窗口通告与拥塞窗口（CWND）的交互关系&lt;/li>
&lt;li>&lt;strong>动态适应能力&lt;/strong>：网络带宽变化时的算法响应策略&lt;/li>
&lt;li>&lt;strong>概念区分能力&lt;/strong>：流量控制（接收方驱动）与拥塞控制（网络状况驱动）的本质差异&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>接收窗口（RWND）与拥塞窗口（CWND）&lt;/li>
&lt;li>累积确认与滑动窗口推进&lt;/li>
&lt;li>慢启动阈值（ssthresh）与AIMD原则&lt;/li>
&lt;li>三重重复ACK与超时重传机制&lt;/li>
&lt;/ol>
&lt;h3 id="核心机制">核心机制 &lt;a href="#%e6%a0%b8%e5%bf%83%e6%9c%ba%e5%88%b6" 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>接收方通过TCP头部的窗口字段通告剩余缓冲区大小（RWND）&lt;/li>
&lt;li>发送方维护发送窗口大小 = min(RWND, CWND)&lt;/li>
&lt;li>通过累积确认机制（如ACK 3001表示3000及之前字节已接收）推进窗口&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>拥塞控制&lt;/strong>：&lt;/p>



 
 
 

 
 
 
 

 

 &lt;div class="prism-codeblock ">
 &lt;pre id="697b21d" class="language-bash ">
 &lt;code>慢启动阶段（SS）：
 CWND指数增长（每RTT翻倍）
 触发条件：连接建立或超时重传
 
拥塞避免（CA）：
 CWND线性增长（每RTT &amp;#43;1 MSS）
 触发条件：CWND &amp;gt;= ssthresh

快速恢复（FR）：
 在收到3个重复ACK时
 ssthresh = max( 未确认数据量/2, 2*MSS )
 CWND = ssthresh &amp;#43; 3*MSS&lt;/code>
 &lt;/pre>
 &lt;/div>
&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>混淆RWND（接收方控制）与CWND（发送方控制）&lt;/li>
&lt;li>误以为窗口大小通告只能通过ACK报文传递（实际可单独发送窗口更新）&lt;/li>
&lt;li>未能区分丢包场景处理：三重ACK触发快速重传 vs 超时触发慢启动&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>TCP通过&lt;strong>接收窗口通告&lt;/strong>实现流量控制：接收方在ACK报文中携带当前可用缓冲区大小，发送方据此限制最大发送量。同时，&lt;strong>拥塞控制算法&lt;/strong>动态调整拥塞窗口：慢启动阶段指数增长探测带宽，达到阈值后转为线性增长的拥塞避免。两者共同约束实际发送窗口（取RWND与CWND较小值）。&lt;/p>
&lt;p>当网络拥塞时（超时或收到3个重复ACK），通过降低CWND和ssthresh来收敛发送速率。例如超时重传会重置CWND=1 MSS，而快速恢复阶段仍保持较高传输速率。这种双重控制机制使TCP能在保证可靠性的同时，最大化网络吞吐量。&lt;/p>
&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="#%e5%8a%a8%e6%80%81%e7%aa%97%e5%8f%a3%e8%b0%83%e8%8a%82%e4%bc%aa%e4%bb%a3%e7%a0%81" 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="3124138" class="language-javascript ">
 &lt;code>class TCPSender {
 constructor() {
 this.cwnd = 1; // 初始拥塞窗口
 this.ssthresh = Infinity;
 }

 // 收到ACK时的处理
 handleAck(ackNum, rwnd) {
 const bytesInFlight = this.lastSent - ackNum;
 
 // 滑动窗口推进
 this.sendWindow = Math.min(rwnd, this.cwnd);
 
 // 拥塞控制
 if (this.cwnd &amp;lt; this.ssthresh) {
 this.cwnd *= 2; // 慢启动
 } else {
 this.cwnd &amp;#43;= 1; // 拥塞避免
 }
 }

 // 检测丢包处理
 handlePacketLoss(type) {
 if(type === &amp;#39;TIMEOUT&amp;#39;) {
 this.ssthresh = Math.max(this.cwnd/2, 2);
 this.cwnd = 1;
 } else if(type === &amp;#39;3_DUP_ACK&amp;#39;) {
 this.ssthresh = Math.max(this.cwnd/2, 2);
 this.cwnd = this.ssthresh &amp;#43; 3;
 }
 }
}&lt;/code>
 &lt;/pre>
 &lt;/div>
&lt;h3 id="优化策略">优化策略 &lt;a href="#%e4%bc%98%e5%8c%96%e7%ad%96%e7%95%a5" 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;/li>
&lt;li>&lt;strong>ECN显式拥塞通知&lt;/strong>：配合路由器的显式拥塞标记&lt;/li>
&lt;li>&lt;strong>HyStart算法&lt;/strong>：改进的慢启动减少突发丢包&lt;/li>
&lt;/ol>
&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;p>&lt;strong>Q1：TCP如何区分网络拥塞和链路故障？&lt;/strong>
通过超时重传次数判断，连续超时可能为链路中断&lt;/p></description></item></channel></rss>