当前位置: 首页 > news >正文

深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制

TCP(Transmission Control Protocol)是一个面向连接、可靠传输的协议,支撑着绝大多数互联网通信。在实现可靠性的背后,TCP 引入了多个关键机制:重传机制滑动窗口流量控制拥塞控制。这些机制共同协作,确保了网络传输的稳定性、高效性和公平性。

本文将从这四大模块出发,逐层剖析其工作原理及内部联系。


一、TCP 重传机制

1.1 超时重传

当 TCP 发送方发出一个数据段后,如果在预定时间内没有收到 ACK(确认),就会触发超时重传。这个时间称为 重传超时时间 RTO(Retransmission Timeout)

RTO 的计算通常使用 RTT(往返时间)预测算法,结合抖动值进行加权调整。

作用:解决数据包丢失或 ACK 丢失问题。

1.2 快速重传

快速重传避免了等待 RTO 超时时间。当接收方连续收到三个相同的 ACK(称为 Duplicate ACK)时,发送方立刻重传对应的段,认为该段可能丢失。

好处:显著缩短丢包检测时间,提高吞吐量。

1.3 SACK 方法(Selective Acknowledgment)

SACK(选择性确认)机制允许接收方告诉发送方:我收到了哪些数据段,即便这些段是不连续的。

例如,收到段 #1、#2、#4、#5,丢了 #3,那么接收方会告诉发送方:我收到了 #1-#2 和 #4-#5。发送方据此只需重发 #3,而不是整个窗口。

对比快速重传:SACK 更细粒度、效率更高。

1.4 Duplicate SACK

一种对 SACK 的增强,用于进一步标明哪些段被重复收到了,有助于快速判断拥塞与丢包状态。

ack包丢失:

网络延时:


二、滑动窗口机制

2.1 滑动窗口定义

滑动窗口是 TCP 中的核心机制之一,用于控制发送方可以连续发送多少字节而无需等待 ACK。其大小取决于接收方通告窗口(rwnd)和拥塞窗口(cwnd)中较小的值。

我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个,这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。

一发一ack:

为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率

2.2 工作原理

  • 每次发送新的数据后,窗口向右滑动;

  • 收到 ACK 后,窗口继续向右滑动;

  • 丢包或拥塞时,窗口收缩。

作用:保持网络“流水线式”的高效传输。


三、流量控制

3.1 基本思想

流量控制主要是为了防止发送方“发太快”,而接收方“接不过来”。这依赖于接收方通告窗口(rwnd),它告诉发送方“我还能接收多少数据”。

3.2 缓冲区与窗口的关系

接收方在操作系统内核中分配一段 缓冲区 存储 TCP 数据。rwnd 就是这个缓冲区剩余大小的反映。

⚠️ 若发送数据快于应用层消费速度,缓冲区满,rwnd=0,发送方必须暂停发送。

可能出现的情况:

为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况

3.3 窗口关闭

当 rwnd=0 时,TCP 会暂时关闭窗口,不再发送数据。发送方会周期性发送“窗口探测包”(Zero Window Probe)询问接收方缓冲是否已空。

3.4 糊涂窗口综合症(Silly Window Syndrome)

当接收方的缓冲区空闲很少就通告窗口,或发送方每次只发一点点数据,这会导致网络效率极低。这种现象称为“糊涂窗口综合症”。

解决方式:
  • 接收方策略:不通告过小窗口;

  • 发送方策略(Nagle算法):累积数据后再发送。


四、拥塞控制

拥塞控制目标是防止发送方过快发送数据导致网络拥塞。TCP 通过以下机制动态调节发送速率:

4.1 慢启动(Slow Start)

初始时 cwnd 很小(1 MSS),每收到一个 ACK 就将 cwnd 加倍(指数增长)。直到达到阈值(ssthresh)或出现丢包为止。

✅ 作用:逐步探测网络能力,防止突发冲击。

4.2 拥塞避免(Congestion Avoidance)

当 cwnd > ssthresh 后,进入线性增长阶段,即每个 RTT 只增长 1 MSS,避免过快增大窗口。

4.3 拥塞发生(例如快速重传触发)

  • cwnd 减半(乘法减小);

  • ssthresh 设置为一半;

  • 重回慢启动或进入快速恢复。

4.4 快速恢复

当触发快速重传时,不进入慢启动,而是认为网络并未严重拥塞,因此采用 快速恢复算法

  • 将 cwnd 设置为 ssthresh;

  • 继续进入拥塞避免阶段。


五、四大机制的联系与整体架构

我们将四部分的核心关系梳理如下:

模块控制目标核心机制所需信息
重传机制保证可靠传输超时重传、快速重传、SACKACK、RTT
滑动窗口提升效率流水线式传输发送窗口
流量控制防止接收方被压垮接收窗口控制 rwnd缓冲区
拥塞控制保持网络稳定慢启动、拥塞避免、快速恢复丢包信号、ACK 统计

总结一句话
TCP 通过滑动窗口提高吞吐,通过流量控制保护接收端,通过拥塞控制避免网络瘫痪,而重传机制是保证可靠性基石。

参考:4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding

http://www.xdnf.cn/news/372025.html

相关文章:

  • 考研408《计算机组成原理》复习笔记,第三章数值数据的表示和运算(定点数篇)
  • Ping 不通外网,Ping 得通主机问题解决小记
  • BUUCTF——Cookie is so stable
  • 《C++探幽:模板从初阶到进阶》
  • Docker Desktop安装在其他盘
  • [面试]SoC验证工程师面试常见问题(七)低速接口篇
  • rust-candle学习笔记13-实现多头注意力
  • Skyvern:用 AI+视觉驱动浏览器自动化
  • FreeTex v0.2.0:功能升级/支持Mac
  • Ubuntu 22.04(WSL2)使用 Docker 安装 Zipkin 和 Skywalking
  • 【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现
  • 基本句子结构
  • 前端取经路——现代API探索:沙僧的通灵法术
  • 每天五分钟机器学习:KTT条件
  • 在 Excel 中有效筛选重复元素
  • Stable Diffusion XL 文生图
  • 【金仓数据库征文】金融行业中的国产化数据库替代应用实践
  • C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比
  • 365打卡第R8周: RNN实现阿尔茨海默病诊断
  • RAG 2.0 深入解读
  • 内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切
  • 海盗王64位服务端+32位客户端3.0版本
  • k8s删除pv和pvc后,vg存储没释放分析
  • Leetcode (力扣)做题记录 hot100(543,102,35,101)
  • AI:PS软件:ps软件中如何使用人工智能(AI)?
  • SierraNet协议分析使用指导[RDMA]| 如何设置 NVMe QP 端口以进行正确解码
  • 画立方体软件开发笔记 js three 投影 参数建模 旋转相机 @tarikjabiri/dxf导出dxf
  • 代码随想录第41天:图论2(岛屿系列)
  • Git简介和发展
  • 代码复用与分层