【计网】SW、GBN、SR、TCP
目录
三种可靠传输机制(数据链路层)
停止-等待(Stop and Wait,SW)协议
回退N帧(Go-back-N,GBN)协议
选择重传(Selective Repeat,SR)协议
传输控制协议 (Transmission Control Protocol, TCP)
滑动窗口 (Sliding Window)
所有这些协议都基于滑动窗口机制,用于在不可靠的、但能检测错误的信道(如 IP) 上实现可靠、有序的数据传输。
窗口机制的核心思想是:
发送窗口 (Sending Window): 允许发送方连续发送多个数据包(帧)而无需等待每个包的确认 (ACK)。窗口大小定义了当前可以发送的最大未确认包数。
接收窗口 (Receiving Window): 定义了接收方愿意接收并缓存的数据包范围。接收方维护一个按序接收的期望序列号。
滑动: 当发送方收到对窗口内最老(最早发送)的数据包的 ACK 时,发送窗口向前“滑动”,允许发送新的数据包。接收窗口在成功按序交付数据后也向前滑动。
特性 停止等待 (SW) 回退 N 帧 (GBN) 选择重传 (SR) TCP (核心机制) 发送窗口大小 1 N (N > 1) N (N > 1) 动态可变 (cwnd + rwnd) 接收窗口大小 1 1 N (N > 1) 动态可变 (rwnd) 确认机制 单独确认 (Individual ACK) 累积确认 (Cumulative ACK) 选择确认 (Selective ACK / SACK) 累积确认 (ACK) + 选择确认扩展 (SACK) 重传策略 仅重传超时或出错的那个包 重传所有未确认的包 (从出错包开始到窗口末尾) 仅重传超时或明确未收到的包 超时重传 (GBN式) / 快速重传 (SR式,基于重复ACK) 接收方处理乱序包 丢弃 丢弃 缓存 (直到可以按序交付) 缓存 (直到可以按序交付) 接收方确认策略 收到一个有效包,发一个ACK 仅对按序到达的最高序列号包发累积ACK 对任何按序或乱序但有效的包都发ACK (通常是SACK) 发送期望接收序列号的累积ACK,SACK选项报告收到的乱序块 主要优点 实现极其简单 比SW吞吐量高,实现相对简单 带宽利用率最高 (只重传丢失包),适合高误码率 可靠、有序、流量控制、拥塞控制、广泛应用 主要缺点 信道利用率极低 (尤其高延迟链路) 乱序或丢包导致大量不必要重传 (尤其大窗口/高误码) 发送方和接收方逻辑更复杂,需要更大的缓存 协议复杂,实现复杂,开销相对大 适用场景 理论模型,极少实际使用 链路延迟低、误码率低的简单环境 (如旧式链路) 链路延迟高、误码率较高的环境 互联网主流传输层协议,处理各种复杂网络环境 本质 滑动窗口大小为1的特例 发送方滑动窗口 >1,接收方窗口=1 发送方和接收方滑动窗口 >1 结合了GBN(累积ACK)和SR(SACK/缓存)思想的混合协议,并加入拥塞控制
【计算机网络】第四章 数据链路层-CSDN博客
三种可靠传输机制(数据链路层)
停止-等待(Stop and Wait,SW)协议
分组重复--分组加上序号(1bit,0/1)
丢失重复的书分组,再发送一个确认ACK(补发)
回退N帧(Go-back-N,GBN)协议
发送窗口
(一口气发出的量)
𝟏<
≤ (
−𝟏) n比特(
)
(
,
为停-等协议)
接收窗口
超时重传
失序(序号不匹配) 补发ACK(上一次最后收到的正确ACK)
重复确认---重发
超时---自动重传
接收方采用累计确认
选择重传(Selective Repeat,SR)协议
n个比特给分组编号(n>1)
传输控制协议 (Transmission Control Protocol, TCP)
【计算机网络】第七章 运输层-CSDN博客
停止等待 (Stop-and-Wait, SW):
核心: 最简单的形式,发送窗口大小=1,接收窗口大小=1。
过程:
发送方发送一个数据包 (Seq Num = x)。
等待接收方对该包 (x) 的确认 (ACK x)。
收到 ACK x 后,发送下一个包 (Seq Num = x+1)。
如果超时未收到 ACK x,则重发包 x。
优点: 概念简单,实现容易。
缺点: 信道利用率极低。发送方大部分时间在等待 ACK,尤其在链路延迟 (RTT) 大或带宽高时。公式:
利用率 ≈ (Packet Size / Bandwidth) / RTT
。RTT 越大,利用率越低。定位: 主要是理解可靠传输的基础概念,实际网络几乎不用。
回退 N 帧 (Go-Back-N, GBN):
核心: 发送方有一个大小为 N 的发送窗口,可以连续发送最多 N 个未确认的包。接收方窗口大小固定为 1。
过程:
发送方连续发送窗口内的包 (Seq Num 从 base 到 base+N-1)。
接收方只接收按序到达且序列号等于期望值 (next expected) 的包。
如果收到期望的包 (Seq Num = next expected):交付给上层,发送一个累积 ACK (ACK next expected),该 ACK 表示所有小于 next expected 的包都已正确接收。
next expected++
。如果收到乱序的包 (Seq Num > next expected):直接丢弃! 但仍会为最近按序接收的包发送一个重复的累积 ACK (ACK next expected - 1)。(这是触发重传的关键)。
如果收到损坏的包:丢弃,不发送任何 ACK。
发送方:
如果收到对包
n
的累积 ACK (ACK n):这表示所有序号 <= n 的包都已被正确接收。发送窗口滑动到 n+1 (base = n+1
)。如果发生超时:发送方重传所有已发送但未确认的包 (即整个发送窗口 base 到 base+N-1 的包)。
如果收到重复的累积 ACK (例如连续收到 3 个相同的 ACK):在基础 GBN 中,通常只依赖超时触发重传。但在 TCP 中,重复 ACK 是触发快速重传的关键信号。
优点: 比 SW 吞吐量高很多,尤其在低延迟链路中。实现比 SR 简单(接收方逻辑简单)。
缺点:
效率低下: 任何单个包丢失或乱序都会导致发送方重传该包及其之后窗口内所有已发送但未确认的包,即使这些包可能已经被接收方正确接收(只是由于前面的包丢失/乱序而被接收方丢弃了)。这在误码率高或窗口大时尤其浪费带宽。
接收方缓存要求低: 只需要缓存一个包(等待按序交付)。
定位: 比 SW 更高效,但重传策略比较“粗暴”。适合链路质量较好、延迟较低的环境。是理解累积 ACK 和窗口滑动的基础。
选择重传 (Selective Repeat, SR):
核心: 发送方和接收方窗口大小都大于 1 (通常相等为 N)。 目标是只重传真正丢失或损坏的包。
过程:
接收方:
维护一个接收窗口,缓存所有落在窗口内的、正确接收但尚未按序交付给上层的包(无论是否按序到达)。
当一个包按序到达 (Seq Num = next expected):
交付该包给上层。
next expected++
。检查缓存中是否有连续的包可以接着交付(滑动接收窗口)。
当一个包乱序但落在窗口内且正确接收:
缓存该包。
立即发送一个针对该特定包的 ACK (选择确认 SACK)。即使它是乱序的!
发送 ACK (通常是 SACK 形式) 给任何正确接收的包(按序或乱序)。
发送方:
为发送窗口内的每个包维护一个独立的定时器。
收到一个 ACK (SACK):
如果该 ACK 确认的包在发送窗口内,标记该包为已确认。
如果该包是发送窗口的起始位置 (
base
):
将窗口滑动到最小未确认序列号处 (
base
移动到新的位置)。超时: 如果某个包的定时器超时,仅重传那个超时的包。
(可选优化) 收到一定次数的重复 ACK (表明某个特定包可能丢失) 也可以触发对该包的快速重传(类似 TCP)。
优点:
带宽效率最高: 只重传丢失或损坏的包,避免了 GBN 的不必要重传。在高误码率或高延迟网络中优势明显。
接收方缓存允许接收和处理乱序包。
缺点:
实现最复杂: 发送方需要为每个包管理独立定时器;接收方需要更大的缓存来存储乱序包,并管理更复杂的确认 (SACK) 逻辑。
序列号空间要求: 为了避免歧义(新旧包的序列号重叠),序列号空间大小通常需要至少是窗口大小的两倍 (2N)。
定位: 理论效率最高的滑动窗口协议,但实现复杂度高。是理解选择性重传和缓存的基础。许多可靠传输协议借鉴了其思想(如 TCP 的 SACK)。
传输控制协议 (TCP - Transmission Control Protocol):
核心: TCP 是一个极其复杂的、面向连接的、提供可靠字节流传输服务的实际协议。它融合了 GBN 和 SR 的思想,并加入了关键的拥塞控制机制。
关键机制与对比:
字节流 & 序列号: TCP 传输的是字节流,序列号基于字节编号。这与 SW/GBN/SR 基于“包”或“帧”的序列号不同。
累积确认 (GBN 思想): TCP 接收方发送的 ACK 号是期望收到的下一个字节的序列号。这隐含地确认了所有在该序列号之前的字节都已正确按序接收。这是累积确认的核心思想(来自 GBN)。
选择确认扩展 - SACK (SR 思想): 标准的 TCP ACK 是累积的。但是,TCP 有一个重要的可选扩展 SACK (Selective Acknowledgment)。启用 SACK 后,接收方可以在 ACK 包中携带额外的 SACK 选项,明确指出接收方已经收到的、但尚未按序交付的乱序数据块。这为发送方提供了 SR 式的选择确认信息。
重传机制 - 混合策略:
超时重传 (RTO - Retransmission Timeout): 类似于 GBN,当发送方检测到某个数据段(可以看作一个包)超时未确认时,它会重传那个最早未确认的数据段 (
snd.una
)。但是,TCP 的重传粒度是段,并且 RTO 是动态计算且复杂的(基于 RTT 测量)。注意: TCP 通常只重传超时的段,而不是整个窗口(这点更像 SR 的目标,但触发机制像 GBN的超时重传整个最早的未确认段)。快速重传 (Fast Retransmit - SR 思想): 这是 TCP 提高效率的关键机制。当发送方连续收到 3 个重复的 ACK (DupACK) 时(例如 ACK 50, ACK 50, ACK 50),它强烈暗示某个特定的数据段(序列号在 50 之后的某个段)可能丢失了,而后续的数据段已经到达接收方(触发了重复的累积 ACK)。发送方不等超时,立即重传这个被认为丢失的段。这直接借鉴了 SR 中“只重传丢失包”的思想,并利用重复累积 ACK 作为 SR 中 SACK 的一种替代信号。
接收方缓存 (SR 思想): TCP 接收方有接收缓冲区 (rwnd),可以缓存乱序到达的正确数据段,等待前面的缺失部分到达后再按序交付给应用层。这是 SR 的核心思想。
流量控制 (rwnd): 接收方通过 TCP 头部中的
rwnd
(接收窗口) 字段动态告知发送方自己还有多少空闲缓冲区。发送方保证未确认数据量 (Flight Size
) 不超过min(cwnd, rwnd)
。这是滑动窗口的直接应用。拥塞控制 (cwnd): TCP 最核心的创新之一。发送方维护一个拥塞窗口 (cwnd),它是对网络承载能力的估计。实际的发送窗口大小是
min(cwnd, rwnd)
。TCP 通过复杂的算法(慢启动、拥塞避免、快速恢复等)动态调整cwnd
来探测可用带宽、响应丢包(视为拥塞信号),避免压垮网络。这是 SW/GBN/SR 等理论协议完全没有考虑的关键部分,也是 TCP 能主导互联网的根本原因之一。窗口动态可变:
cwnd
和rwnd
都是动态变化的,导致 TCP 的实际发送窗口大小不断变化。这与 SW/GBN/SR 通常假设固定窗口大小不同。定位: 实际互联网的基石协议。它不是一个“纯”的 GBN 或 SR,而是取其精华(GBN 的累积确认简单性、SR 的选择性重传/缓存高效性),并加入了革命性的拥塞控制机制和面向字节流的抽象,以应对复杂多变的互联网环境。
总结:
-
SW: 基础模型,效率最低,仅用于理解概念。
-
GBN: 使用累积确认和发送窗口 >1 来提高效率,但接收窗口=1 导致乱序包被丢弃和大量不必要重传。实现相对简单。
-
SR: 使用选择确认 (SACK) 和接收缓存 (接收窗口>1) 来最大化效率(只重传丢失包),但实现最复杂。
-
TCP: 实际标准协议。核心使用累积确认 (GBN 思想) 和接收缓存 (SR 思想)。通过SACK 扩展 (SR 思想) 和快速重传机制 (基于重复ACK) 实现高效的选择性重传 (SR 思想)。其超时重传行为更接近 GBN(重传最早未确认段)。最大的创新和核心是动态的拥塞控制 (cwnd)。TCP 是一个融合了 GBN 和 SR 优点,并加入拥塞控制、流量控制、面向字节流等复杂机制的混合体,专门为应对互联网的挑战而设计。