你在刷视频的时候有没有遇到过卡顿?明明网速测试很快,但视频就是加载不出来。这可能不是宽带的问题,而是网络传输过程中流量控制没做好。
TCP滑动窗口机制
TCP是最常用的传输协议之一,它的流量控制核心是“滑动窗口”。简单来说,接收方会告诉发送方自己还能处理多少数据,这个数值就是窗口大小。如果接收方缓存快满了,就会把窗口调小,甚至设为0,让发送方暂停发送。
比如你用手机下载一个大文件,后台其实并不是一股脑全发过来,而是一段一段地传。每收到一段确认后,窗口向前滑动,继续接收下一批。这种动态调节避免了设备被数据淹没。
Sequence Number: 1000, Window Size: 4096
Sends data from byte 1000 to 5095
After ACK for 3000, window slides to start at 3000
拥塞控制与流量控制的区别
很多人容易把这两个搞混。流量控制是点对点之间的协调,关注的是接收方能不能吃得消;而拥塞控制是全局性的,防止整个网络路径因为太多数据堵死。
就像高速公路上的车流,流量控制像是收费站根据工作人员处理能力放行车辆,拥塞控制则是交管部门看到前方拥堵,提前在入口限流。
UDP的无流量控制特性
UDP不提供流量控制,它只管发,不管对方收不收得下。这听起来很粗暴,但在实时语音、在线游戏这类场景中反而更合适。丢几个包没关系,关键是低延迟。
你打王者荣耀时队友的声音突然断了一下,可能就是因为UDP丢了个包,但系统不会停下来等重传,否则延迟就爆了。
现代应用层的自适应策略
现在很多App自己实现了流量控制逻辑。比如微信视频通话会根据你的网络状况自动调整画质和码率。网差时变成模糊小窗,网好时恢复高清,这就是应用层做的动态调控。
这类做法不再完全依赖底层协议,而是结合RTT(往返时间)、丢包率等指标实时决策,比传统方式更灵活。