TCP流量控制:滑动窗口让数据传输更高效
引言 在前面的文章中,我们学习了TCP如何建立连接(三次握手)和断开连接(四次挥手)。今天我们来学习TCP如何在连接建立后高效可靠地传输数据:流量控制机制(Flow Control)。 为什么需要流量控制? 发送方可能发送得很快,接收方可能处理得很慢 如果发送方不控制速度,接收方的缓冲区会溢出,数据丢失 流量控制让接收方告诉发送方:我能接收多少数据 今天我们来理解: ✅ 滑动窗口(Sliding Window)的工作原理 ✅ 接收窗口(rwnd)和发送窗口的关系 ✅ 零窗口问题与窗口探测 ✅ 如何调整TCP窗口大小以提升性能 第一性原理:为什么需要流量控制? 问题:接收方处理不过来 场景:文件传输 发送方(高性能服务器) 接收方(低性能客户端) | | | 发送1GB数据,速度1Gbps | 接收速度只有100Mbps |----------------------------> | 接收缓冲区64KB | | | 继续疯狂发送... | 缓冲区满了! |----------------------------> | ❌ 数据丢失 | | 不同场景的速度差异: 场景 发送方 接收方 问题 服务器 → 客户端 10Gbps网卡 100Mbps网卡 速度差100倍 内存 → 磁盘 内存写入50GB/s 磁盘写入500MB/s 速度差100倍 批量导入 10万条/秒 DB只能处理1万条/秒 处理能力差10倍 流量控制的目标:让发送方的速度匹配接收方的处理能力 滑动窗口:TCP流量控制的核心机制 核心思想 接收方告诉发送方:“我还有X字节的缓冲空间,你最多发送X字节” 接收方 发送方 | | | TCP头部:Window=8192 | |<-------------------------| | | 含义: "我的接收缓冲区还有8192字节空间, 你最多发送8192字节" 接收窗口(rwnd) 接收窗口(Receive Window):接收方在TCP头部的Window字段通告给发送方的值 ...