TCP协议里窗口机制有2种:一种是固定的窗口大小;另一种是滑动的窗口。

这个窗口大小就是我们一次传输几个数据。对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送;同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制。

TCP的滑动窗口机制

如果每次传输数据都只能发送一个MSS,就需要等待接收方的ACK,这显然会极大的影响传输的速率。在发送数据的时候,最好的方式是一下将所有的数据全部发送出去,然后一起确认。

但是现实中确实会存在一些限制:

发送方要知道接收方的接收窗口和网络这两个限制因素中哪一个更严格,然后在其限制范围内尽可能多发包。这个一口气能发送的数据量就是传说中的TCP发送窗口。

首先TCP在进行数据传输的时候都是先将数据放在数据缓冲区中的,TCP维护了两个缓冲区,发送方缓冲区和接收方缓冲区。

滑动窗口机制是TCP的一种流量控制方法,该机制允许发送方在停止并等待确认前连续发送多个分组,而不必每发送一个分组就停下来等待确认,从而增加数据传输的速率提高应用的吞吐量。

滑动窗口机制是TCP的一种流量控制方法,该机制允许发送方在停止并等待确认前连续发送多个分组,而不必每发送一个分组就停下来等待确认,从而增加数据传输的速率提高应用的吞吐量。

TCP的包可以分为四种状态

滑动窗口协议的基本工作流程就是由接收方通告窗口的大小,这个窗口称为提出窗口,也就是接收方窗口。接收方提出的窗口则是被接收缓冲区所影响的,如果数据没有被用户进程使用那么接收方通告的窗口就会相应得到减小,发送窗口取决于接收方窗口的大小。可用窗口的大小等于接收方窗口减去发送但是没有被确认的数据包大小。

补充

补充:滑动窗口是 TCP 实现「可靠传输 + 流量控制」的核心机制,发送方和接收方各维护一组窗口,按字节序号推进。

关键概念:

  • 发送窗口:由「已确认 + 已发送未确认 + 可发送」三部分组成,受 min(接收窗口 rwnd, 拥塞窗口 cwnd) 限制。
  • 接收窗口 (rwnd):接收方通告当前可用缓冲区大小,告诉发送方「别发太快」。
  • 拥塞窗口 (cwnd):发送方根据网络拥塞状况自维护,控制「别发太多把网络塞满」。
  • 窗口滑动:收到 ACK 后窗口左边界右移;窗口右边界受 rwnd / cwnd 限制。

流程示意:

发送方                          接收方
+----+----+----+----+----+     +----+----+----+----+----+
|已确认|已发未确认|可发送| ...  |已接收|可接收|...
+----+----+----+----+----+     +----+----+----+----+----+
            ↑          ↑
        左边界       右边界

补充要点:

  • Nagle 算法:把小包合并发送,减少网络小包数量,但会增大延迟,需要时可关闭(TCP_NODELAY)。
  • 延迟 ACK:接收方等一段时间再回 ACK(默认 40ms),可以与「捎带应答」配合。
  • 糊涂窗口综合症:窗口过小时,发送/接收双方陷入「小包循环」,可通过 Nagle + 接收方延迟回 ACK 缓解。
  • Zero Window:当 rwnd = 0 时发送方停止发送,直到接收方通告窗口恢复(Window Update)。

补充:实际定位「滑动窗口卡顿」时,可用 ss -tin 查看窗口大小、tcpdump / Wireshark 抓包分析丢包与 ACK 节奏。