《计算机网络》深入学:流量控制与可靠传输

5.1 引言

在计算机网络通信中,发送方和接收方往往存在处理能力的差异。如果发送方发送数据的速度过快,超出了接收方的处理能力,就会导致接收缓存溢出,进而造成数据丢失。此外,底层信道(如物理层和数据链路层)在本质上是不可靠的,可能会出现比特错误、丢包或乱序等问题。

为了解决上述问题,网络协议栈中引入了 流量控制(Flow Control)可靠传输(Reliable Transmission) 机制。本章将深入探讨这两种机制的理论基础,特别是**自动重传请求(ARQ)**协议的演变:从最简单的停止-等待协议,到高效的滑动窗口机制(包括后退 N 帧协议和选择重传协议),并结合现代 TCP 协议分析其实际应用。


5.2 基本概念界定

在深入协议细节之前,我们需要明确两个核心概念的区别与联系。

5.2.1 可靠传输

可靠传输是指发送方发送的数据,接收方能够准确无误地接收。具体要求包括:

  1. 无差错:数据内容不损坏。
  2. 无丢失:数据包不丢弃。
  3. 无重复:接收方不处理重复包。
  4. 按序到达:接收方按发送顺序将数据交付给上层。

实现可靠传输的核心技术是确认(ACK)重传

5.2.2 流量控制

流量控制是一种速度匹配机制。其目的是控制发送方的发送速率,使之不超过接收方的接收能力。这通常通过接收方向发送方反馈当前可用的缓存空间大小来实现。

:虽然流量控制和拥塞控制(Congestion Control)都涉及到降低发送速率,但两者对象不同。流量控制是为了照顾"接收方"的承受能力,而拥塞控制是为了照顾"网络链路"的承受能力。

5.3 停止-等待协议(Stop-and-Wait Protocol)

这是最简单的流量控制与可靠传输协议,也是后续复杂协议的基础。

5.3.1 基本原理

停止-等待协议的核心思想是"一问一答"。

  1. 发送方:发送一个数据帧后,就停止发送,启动定时器,等待接收方的确认。
  2. 接收方:收到正确的数据帧后,向发送方发送确认帧(ACK)。
  3. 处理丢包:如果发送方在定时器超时前未收到 ACK,则认为发送失败,重传该数据帧。

图 5-1 :停止-等待协议的时序逻辑

5.3.2 性能分析

停止-等待协议的优点是简单,对缓存要求低。但其缺点非常明显:信道利用率极低

假设数据帧发送时间为 TDT_{D}TD,往返时间为 RTTRTTRTT,确认帧发送时间忽略不计。则信道利用率 UUU 为:
U=TDTD+RTT U = \frac{T_{D}}{T_{D} + RTT} U=TD+RTTTD

在长距离光纤通信(高带宽、高延迟)中,RTTRTTRTT 远大于 TDT_{D}TD,导致 UUU 趋近于 0。这就像拥有一条宽阔的高速公路,但规定路上同一时间只能跑一辆车。

5.4 滑动窗口机制与流水线技术

为了提高信道利用率,必须允许发送方在收到确认之前,连续发送多个数据分组。这种技术称为流水线(Pipelining)传输。实现流水线的核心逻辑是滑动窗口(Sliding Window)机制

5.4.1 滑动窗口的基本原理

滑动窗口在发送方和接收方各维护一个"窗口"结构,本质上是缓存中的一部分连续序列号。

  • 发送窗口 (WTW_TWT):允许已发送但未被确认,以及允许立即发送的序列号集合。
  • 接收窗口 (WRW_RWR):允许接收并暂存的序列号集合。

图 5-2:滑动窗口的工作状态

根据窗口大小的不同配置,衍生出了两种主流协议:后退 N 帧协议(GBN)选择重传协议(SR)

5.5 后退 N 帧协议(Go-Back-N, GBN)

GBN 是对停止-等待协议的直接改进。

5.5.1 工作原理

  1. 发送方 :维持一个大小为 NNN 的发送窗口。可以连续发送窗口内的所有分组,不需要等待 ACK。
  2. 接收方只维持一个大小为 1 的接收窗口
    • 它只能按序接收。如果收到序号 nnn,且正是期望的序号,则接收并发送 ACKnACK_nACKn。
    • 如果收到乱序分组(例如期望 3,来了 4),接收方直接丢弃 4,并重发 ACK2ACK_2ACK2(表示 2 及其之前都已收到)。
  3. 累积确认 :GBN 采用累积确认机制。如果收到 ACKnACK_nACKn,表明序号 nnn 及之前的所有分组都已正确接收。

5.5.2 异常处理(后退 N 帧的由来)

如果发送方发送了 1, 2, 3, 4, 5。假设 2 号包在链路中丢失。

  • 接收方收到 1,回 ACK1ACK_1ACK1。
  • 接收方收到 3,发现不是期望的 2,丢弃 3 ,重发 ACK1ACK_1ACK1。
  • 接收方收到 4、5,同理,全部丢弃,重发 ACK1ACK_1ACK1。
  • 发送方超时后,发现 2 未被确认,只好将 2 及其之后已发送的 3, 4, 5 全部重传。

结论:GBN 在信道质量好时效率很高,但一旦出错,会导致大量不必要的重传,浪费带宽。

5.6 选择重传协议(Selective Repeat, SR)

为了解决 GBN 在高误码率环境下效率低下的问题,选择重传协议(SR)应运而生。

5.6.1 工作原理

  1. 接收窗口扩大 :接收方不再只接收 1 个,而是维护一个大于 1 的接收窗口 WRW_RWR。
  2. 逐个确认 :接收方对每个正确接收的分组进行单独确认,不再使用累积确认。
  3. 缓存乱序包 :如果期望收 3,但来了 4。SR 接收方会收下 4 并放入缓存,发送 ACK4ACK_4ACK4,但暂不交付给上层,直到收到 3 为止。
  4. 选择性重传:发送方只重传那些超时未收到 ACK 的分组,而不是重传后续所有分组。

图 5-3:SR 协议的乱序接收

5.6.2 窗口大小的限制

在 SR 协议中,窗口大小不能随意设置。若采用 nnn 比特对分组编号(序列号范围 0∼2n−10 \sim 2^n - 10∼2n−1),则发送窗口 WTW_TWT 和接收窗口 WRW_RWR 需满足:
WT+WR≤2n W_T + W_R \le 2^n WT+WR≤2n

通常取 WT=WR=2n−1W_T = W_R = 2^{n-1}WT=WR=2n−1。如果窗口过大,会导致新旧窗口的序列号重叠,接收方无法区分这是"新的第 0 号帧"还是"重传的旧的第 0 号帧"。

5.7 理论与实践的结合:现代 TCP 协议

在实际的计算机网络(如 Internet)中,传输控制协议(TCP)是上述理论的集大成者。TCP 并没有照搬标准的 GBN 或 SR,而是采用了一种混合机制。

5.7.1 TCP 的可靠传输与流量控制

  1. 基于字节流的滑动窗口:TCP 的窗口不是以"包"为单位,而是以"字节"为单位。
  2. 混合确认机制
    • TCP 标准实现类似于 GBN,使用累积确认(ACK 告知期待的下一个字节序号)。
    • 但是,现代 TCP(RFC 2018)引入了 SACK(Selective Acknowledgment,选择确认) 选项。允许接收方在 TCP 首部中告知发送方:"我收到了 1000-2000 和 3000-4000,但缺了 2000-3000"。这实际上实现了 SR 的功能,避免了不必要的重传。
  3. 动态流量控制
    • TCP 报文段首部有一个 Window 字段。接收方通过该字段告诉发送方:"我现在接收缓存还剩多少空间(rwnd)"。
    • 发送方动态调整自己的发送窗口,确保 SendWindow≤rwndSendWindow \le rwndSendWindow≤rwnd。这就是典型的流量控制应用。

5.7.2 发展现状

随着网络速度从 Mbps 迈向 Gbps 甚至 Tbps 级别,传统的 TCP 流量控制也面临挑战:

  • 长肥管道(Long Fat Network, LFN) :在高带宽、高延迟的网络中,需要的窗口尺寸非常大(带宽时延积 Bandwidth×RTTBandwidth \times RTTBandwidth×RTT)。传统的 16 位窗口字段(最大 65535 字节)已不够用,现代系统必须启用 TCP 窗口缩放选项(Window Scaling)
  • QUIC 协议的崛起:为了解决 TCP 在传输层可能出现的队头阻塞(Head-of-Line Blocking)问题,Google 提出了 QUIC 协议(HTTP/3 的基础)。QUIC 在 UDP 之上重新实现了类似的可靠传输和流量控制机制,代表了该领域最新的发展方向。

5.8 本章小结

特性 停止-等待 (SW) 后退 N 帧 (GBN) 选择重传 (SR)
发送窗口 1 >1>1>1 >1>1>1
接收窗口 1 1 >1>1>1
确认方式 单个确认 累积确认 单个确认
接收策略 按序接收 只按序接收,丢弃乱序 缓存乱序
重传策略 重传当前帧 重传出错帧及后续所有帧 只重传出错帧
信道利用率 较高 最高
复杂度 高(需接收缓存)

流量控制与可靠传输是构建稳定互联网的基石。从简单的"停-等"逻辑到复杂的"滑动窗口"算法,体现了计算机网络设计中对效率可靠性平衡的不懈追求。理解这些底层原理,对于掌握现代 TCP/IP 协议栈及新一代网络传输协议至关重要。

相关推荐
Tandy12356_2 小时前
手写TCP/IP协议栈——TCP数据接收
c语言·网络·网络协议·tcp/ip·计算机网络
九成宫4 小时前
计算机网络期末复习——第4章:网络层 Part Two
网络·笔记·计算机网络·软件工程
小李独爱秋4 小时前
计算机网络经典问题透视:媒体播放器与媒体服务器的AB面
运维·服务器·网络协议·计算机网络·媒体
你要飞18 小时前
考研线代第四课:线性方程组
笔记·线性代数·考研·矩阵
小李独爱秋19 小时前
计算机网络经典问题透视:TLS协议工作过程全景解析
运维·服务器·开发语言·网络协议·计算机网络·php
九成宫20 小时前
计算机网络期末复习——第4章:网络层 Part One
网络·笔记·计算机网络·软件工程
不穿格子的程序员20 小时前
计算机网络篇1:OSI + HTTP进化史 + 三次握手四次挥手
网络协议·计算机网络·http
swan41620 小时前
SCAU期末笔记 - 计算机网络雨课堂习题整理
arm开发·笔记·计算机网络
2501_901147831 天前
环形房屋打家劫舍算法
考研·算法·leetcode·高考