【概述】
TCP 提供了流量控制服务,以消除发送方使接收方缓冲区溢出的可能性,其本质上是一个速度匹配服务,使发送方的发送速率与接收方的接收速率相匹配
TCP 提供了一种基于滑动窗口协议的流量控制机制,与链路层的流量控制机制十分相似
两者的区别在于:传输层定义了端到端用户间的流量控制,链路层定义了两个中间相邻结点的流量控制
此外,链路层的滑动窗口协议的窗口大小不能动态变化,传输层的窗口可以动态变化
【TCP 窗口机制】
发送方在确定发送报文段的速率时,既要从流量控制的角度考虑接收方的接收能力,也要从拥塞控制的角度考虑网络全局是否会发生拥塞
因此,TCP 协议要求发送方维护接收窗口 rwnd
和拥塞窗口 cwnd
这两个窗口,并根据这两个窗口的值来设置发送窗口的值
发送窗口的上限值,一般取 rwnd
和 cwnd
两者的最小值,即:
而对于接收窗口 rwnd
和拥塞窗口 cwnd
来说,有:
1)接收窗口 rwnd
接收窗口 rwnd
即根据接收方的接收缓存大小,反映了接收方允许连续接收的最大能力
流量控制,就是由接收方根据其放在 TCP 报文段首部的窗口字段来通知发送方,从而保证将未确认的数据量控制在 rwnd
范围内
2)拥塞窗口 cwnd
拥塞窗口 cwnd
是根据发送方自己估算的网络拥塞程度来设置的窗口值,这个窗口值反映了当前网络的容量,其大小与网络的带宽和时延密切相关
拥塞控制,就是通过一定的算法,来维护拥塞窗口 cwnd
的大小
【接收窗口与流量控制】
假设有效数据只从 A
发往 B
,B
仅向 A
发送确认报文
这时,B
就可以通过设置 TCP 确认报文段首部的窗口字段,来将 rwnd
通知给 A
发送方 A
会根据最新收到的 rwnd
来限制自己的发送窗口大小,保证 A
不会使 B
的接收缓存溢出
下图中的例子说明了利用滑动窗口进行流量控制的过程
一般来说,接收方总是有足够大的缓存空间,发送窗口的大小由网络拥塞程度决定,因而实际上并不需要考虑对 TCP 进行流量控制
也就是说,可以将发送窗口等同于拥塞窗口