什么是滑动窗口?
- 接收方窗口
这是接收端通告给发送端的缓冲区空间。 意思是接收端还能接收多少字节的数据,
还没被应用程序处理/读取的那些数据占用了接收缓冲区,它能接受的新数据有限。
- 接收方窗口
- 发送方窗口
发送方要考虑两个窗口的限制
接收方窗口 rwnd 和拥塞窗口
实际上,发送窗口(可以同时在“飞行中”未被确认的数据量) = min(rwnd, cwnd)。发送方不能超过这个
- 发送方窗口
什么是拥塞窗口
拥塞窗口是TCP用来实现拥塞控制的关键变量,是用来控制发送方对网络的可用容量的探测和使用.
网络中同时存在多个TCP流,链路带宽不稳定,路由器的缓冲区有限,如果每次都发送大量的数据,就很容易造成队列的挤压,丢包,网络拥堵。(就行公路开车加塞)
CWND 大小动态变化,由发送方根据反馈(ACK与丢包/超时)来调节
在网络状况良好时间,CWND就会逐步增长,若检测到拥塞(丢包,重传 超时等信号) 就会减少CWND
CWND 是 每条 TCP 连接 的私有状态,也就是说,不同连接(不同 5 元组:源 IP + 源端口 + 目的 IP + 目的端口 + 协议)会有各自的 CWND。每个连接会单独维护其拥塞控制的变量(包括 CWND、慢启动阈值 ssthresh、RTT 估计等)
慢启动(Slow Start)机制
慢启动是TCP拥塞控制中的一个阶段,用于连接刚开始/刚恢复(例如连接建立后,或者之前发生拥塞时重置窗口后),安全的探测网络能承载多少流量(动态调整CWND)
- 初始化
在TCP三次握手后建立连接后,发送方将CWND设置为一个较小值(通常为1MSS) - 指数增长
每次收到一个ACK CWND就翻倍 - 慢启动阈值(ssthresh)
当 cwnd < ssthresh 时使用慢启动指数增长
当 cwnd >= ssthresh 时,就切换到 “线性增长” 的拥塞避免阶段,以更加温和的方式继续增大,以避免引起拥塞过度恶化 - 遇到拥塞/丢包处理
如果在慢启动阶段出现丢包或重传超时,意味着网络已经达到当前的承载极限,通常的做法是:
将ssthresh设置为当前CWND的一半(或者某个函数/比例)
将CWND设置为一个较小值
出现进入慢启动阶段
可发送量 ≤ min(rwnd, cwnd)