5.2 TCP 可靠传输、流量控制与拥塞控制
TCP 的序号、累积确认、超时重传(RTO 的计算)与快重传;基于滑动窗口的流量控制与零窗口;拥塞控制的慢开始、拥塞避免、快重传与快恢复。
TCP 可靠传输
TCP 的任务是在 IP 层不可靠的、尽力而为服务的基础上建立一种可靠数据传输服务。TCP 提供的可靠数据传输服务保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样。TCP 使用了校验、序号、确认和重传等机制来达到这一目的。
- 序号:TCP 首部的序号字段用来保证数据能有序提交给应用层,TCP 把数据视为一个无结构但有序的字节流,序号建立在传送的字节流之上,而不建立在报文段之上;
- 确认:TCP 首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。TCP 默认使用累积确认,即 TCP 只确认数据流中至第一个丢失字节为止的字节;
- 重传:有两种事件会导致 TCP 对报文段进行重传:超时和冗余 ACK。
超时重传与 RTO
TCP 每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。由于 TCP 的下层是一个互联网环境,IP 数据报所选择的路由变化很大,因而传输层的往返时延的方差也很大。为了计算超时计时器的重传时间,TCP 采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间 RTT。TCP 保留了 RTT 的一个加权平均往返时间 RTTs,它会随新测量 RTT 样本值的变化而变化:
第一次测量时, 取所测得的 RTT 样本值, 取样本值的一半。Karn 算法:报文段每重传一次,就把 RTO 增大一些(通常加倍),且不采用重传报文段的往返时间样本。
冗余 ACK(快重传)
超时触发重传存在的一个问题是超时周期往往太长。所幸的是,发送方通常可在超时事件发生之前通过注意所谓的冗余 ACK 来较好地检测丢包情况。冗余 ACK 就是再次确认某个报文段的 ACK,而发送方先前已经收到过该报文段的确认。TCP 规定每当比期望序号大的失序报文段到达时,就发送一个冗余 ACK,指明下一个期待字节的序号。当发送方收到对同一个报文段的 3 个冗余 ACK 时,就可以认为跟在这个被确认报文段之后的报文段已经丢失,于是立即重传,不必等待计时器超时——这就是快重传。
TCP 流量控制
TCP 提供流量控制服务来消除发送方使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。TCP 提供一种基于滑动窗口协议的流量控制机制:
- 在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口 rwnd,即调整 TCP 报文段首部中的”窗口”字段值,来限制发送方向网络注入报文的速率;
- 同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口 cwnd,其大小与网络的带宽和时延密切相关;
- 发送窗口的上限值 = min(rwnd, cwnd);
- 当接收方通告 rwnd = 0 时,发送方停止发送并启动持续计时器;持续计时器超时后发送一个零窗口探测报文段(仅携带 1 B 数据),对方确认时给出当前窗口值,以防止双方因窗口更新报文丢失而互相等待(死锁)。
TCP 拥塞控制
所谓拥塞控制,是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时,端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。因特网建议标准定义了进行拥塞控制的 4 种算法:慢开始、拥塞避免、快重传和快恢复。
慢开始与拥塞避免
- 慢开始:在 TCP 刚刚连接好并开始发送 TCP 报文段时,先令拥塞窗口 cwnd = 1,即一个最大报文段长度 MSS。每收到一个对新报文段的确认后,将 cwnd 加 1,即增大一个 MSS。用这样的方法逐步增大发送方的 cwnd,可使分组注入网络的速率更加合理。使用慢开始算法后,每经过一个传输轮次(即往返时延 RTT),cwnd 就会加倍,即 cwnd 的大小指数式增长。这样,慢开始一直把 cwnd 增大到一个规定的慢开始门限 ssthresh,然后改用拥塞避免算法;
- 拥塞避免:发送端的拥塞窗口 cwnd 每经过一个往返时延 RTT 就增加一个 MSS(而不是加倍),具有加法增大的特点;
- 网络拥塞的处理(超时):只要发送方判断网络出现拥塞(未按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方的 cwnd 值的一半(但不能小于 2),然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
快重传与快恢复
- 快重传:当发送方连续收到三个重复的 ACK 报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时;
- 快恢复:当发送端收到连续三个冗余的 ACK(即重复确认)时,执行”乘法减小”算法,把慢开始门限 ssthresh 设置为此时发送方 cwnd 的一半。这是为了预防网络发生拥塞。但发送方现在认为网络很可能没有发生(严重)拥塞,否则就不会有几个报文段连续到达接收方,也不会连续收到重复确认。因此与慢开始不同之处是它把 cwnd 值设置为慢开始门限 ssthresh 改变后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
即时练习
- 1(408 真题 2009)一个 TCP 连接总是以 1 KB 的最大段发送 TCP 段,发送方有足够多的数据要发送。当拥塞窗口为 16 KB 时发生了超时,如果接下来的 4 个 RTT 时间内的 TCP 段的传输都是成功的,那么当第 4 个 RTT 时间内发送的所有 TCP 段都得到肯定应答时,拥塞窗口大小是( )。
- 2(408 真题 2010)主机甲和主机乙之间已建立一个 TCP 连接,TCP 最大段长度为 1000 字节,若主机甲的当前拥塞窗口为 4000 字节,在主机甲向主机乙连续发送两个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的接收窗口大小为 2000 字节,则此时主机甲还可以向主机乙发送的最大字节数是( )。
- 3(408 真题)若主机甲向主机乙发起一个 TCP 连接,最大段长 MSS = 1 KB,RTT = 5 ms,乙开辟的接收缓存为 64 KB,则甲从连接建立成功至发送窗口达到 32 KB,需经过的时间至少是( )。
- 4设 TCP 当前的加权平均往返时间 RTTs = 30 ms,现测得一个新的 RTT 样本为 38 ms,α = 1/8,则更新后的 RTTs 为( )。
- 5TCP 发送方收到 3 个重复的 ACK 时,若当时 cwnd = 20,则执行快恢复后( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。