Alex_McAvoy

想要成为渔夫的猎手

TCP 流量控制

【概述】

TCP 提供了流量控制服务,以消除发送方使接收方缓冲区溢出的可能性,其本质上是一个速度匹配服务,使发送方的发送速率与接收方的接收速率相匹配

TCP 提供了一种基于滑动窗口协议的流量控制机制,与链路层的流量控制机制十分相似

两者的区别在于:传输层定义了端到端用户间的流量控制,链路层定义了两个中间相邻结点的流量控制

此外,链路层的滑动窗口协议的窗口大小不能动态变化,传输层的窗口可以动态变化

【TCP 窗口机制】

发送方在确定发送报文段的速率时,既要从流量控制的角度考虑接收方的接收能力,也要从拥塞控制的角度考虑网络全局是否会发生拥塞

因此,TCP 协议要求发送方维护接收窗口 rwnd 和拥塞窗口 cwnd 这两个窗口,并根据这两个窗口的值来设置发送窗口的值

发送窗口的上限值,一般取 rwndcwnd 两者的最小值,即:

而对于接收窗口 rwnd 和拥塞窗口 cwnd 来说,有:

1)接收窗口 rwnd

接收窗口 rwnd根据接收方的接收缓存大小,反映了接收方允许连续接收的最大能力

流量控制,就是由接收方根据其放在 TCP 报文段首部的窗口字段来通知发送方,从而保证将未确认的数据量控制在 rwnd 范围内

2)拥塞窗口 cwnd

拥塞窗口 cwnd根据发送方自己估算的网络拥塞程度来设置的窗口值,这个窗口值反映了当前网络的容量,其大小与网络的带宽和时延密切相关

拥塞控制,就是通过一定的算法,来维护拥塞窗口 cwnd 的大小

【接收窗口与流量控制】

假设有效数据只从 A 发往 BB 仅向 A 发送确认报文

这时,B 就可以通过设置 TCP 确认报文段首部的窗口字段,来将 rwnd 通知给 A

发送方 A 会根据最新收到的 rwnd 来限制自己的发送窗口大小,保证 A 不会使 B 的接收缓存溢出

下图中的例子说明了利用滑动窗口进行流量控制的过程

一般来说,接收方总是有足够大的缓存空间,发送窗口的大小由网络拥塞程度决定,因而实际上并不需要考虑对 TCP 进行流量控制

也就是说,可以将发送窗口等同于拥塞窗口

感谢您对我的支持,让我继续努力分享有用的技术与知识点!