首页/计算机网络/05-transport/TCP可靠传输 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

TCP可靠传输

重要度 ⭐⭐计算机网络/传输层
速查
TCP 用序号、确认号、超时重传、滑动窗口实现可靠传输,保证数据无差错、不丢失、不重复、按序到达。确认方式为累积确认$ack=N$ 表示 N 之前全部正确接收;$RTO = RTTs + 4 \times RTTd$;发送窗口 = min(rwnd, cwnd),右边界 = 左边界 + rwnd。

核心概念

TCP 通过序号、确认号、超时重传、滑动窗口等机制实现可靠传输,确保数据无差错、不丢失、不重复、按序到达

可靠传输四大机制

机制作用核心思想
序号机制标识字节顺序每个字节都有唯一序号
确认机制反馈接收情况累积确认,告知期望下一字节
超时重传丢失恢复超时未确认则重传
滑动窗口流量控制基础限制发送速率

关键定义

TCP 序号与确认号

字段说明
seq(序号)本报文段数据部分第一个字节的编号
ack(确认号)期望收到对方下一个报文段的第一个字节编号
确认方式累积确认:确认号 N 表示 N 之前所有数据已正确接收

确认方式对比

方式说明TCP 使用
逐条确认每收到一个报文段就确认
累积确认确认号表示"该号之前全收到"
延迟确认等待一段时间再发送 ACK(最多 500ms)

超时重传机制

要素说明
RTO(超时重传时间)动态计算,略大于 RTT
RTT(往返时间)从发送到收到确认的时间
RTTs(加权平均 RTT)$RTTs = (1-\alpha)\times RTTs_{旧} + \alpha\times RTT_{新}$,$\alpha = 0.125$
RTTd(偏差)$RTTd = (1-\beta)\times RTTd_{旧} + \beta\times|RTTs - RTT_{新}|$,$\beta = 0.25$
RTO 计算$RTO = RTTs + 4\times RTTd$

滑动窗口

发送窗口结构:
|<--- 已发送已确认 --->|<--- 已发送未确认 --->|<--- 可发送 --->|<--- 不可发送 --->|
                     发送窗口左边界                              发送窗口右边界
窗口参数说明
发送窗口大小由接收方通告的 rwnd(接收窗口)决定
窗口左边界最早未确认的序号
窗口右边界左边界 + rwnd
窗口内数据可以发送(已发送未确认 + 未发送可发送)

手算示例

示例 1:序号与确认号计算

题目:A 向 B 发送数据,初始序号 $seq = 100$,发送 200 字节数据。解答:第一段 $seq = 100$,数据 200 字节;B 收到后回复 $ack = 300$(期望第 300 字节),即确认了序号 100~299 的全部数据。

示例 2:滑动窗口滑动过程

题目:发送窗口大小 = 400 字节,初始 $seq = 0$。

初始状态:
[已确认|待确认|可发送|不可发送]
 0      0       400    ∞

发送 seq=0,100,200,300 各 100 字节后:
[已确认|待确认|可发送|不可发送]
 0      0      400    ∞      ← 全部待确认,窗口满

收到 ack=200 后(前 200 字节确认):
[已确认|待确认|可发送|不可发送]
 0-199  200     600    ∞      ← 窗口右移 200 字节

示例 3:超时重传时间计算

题目:初始 $RTTs = 100$ms,$RTTd = 5$ms,新 RTT 依次为 110、90、100ms。

  • 第 1 次:$RTTs = 0.875\times100 + 0.125\times110 = 101.25$ms;$RTTd = 0.75\times5 + 0.25\times|101.25-110| = 5.94$ms;$RTO = 101.25 + 4\times5.94 = 125$ms
  • 第 2 次:$RTTs = 0.875\times101.25 + 0.125\times90 = 99.84$ms;$RTTd = 0.75\times5.94 + 0.25\times|99.84-90| = 6.92$ms;$RTO = 99.84 + 4\times6.92 = 127.5$ms

示例 4:GBN 与 SR 协议手算

GBN:发送 0,1,2,3 → 窗口满(W=4);帧 1 丢失,接收方丢弃 2,3($Wr=1$ 只接受按序帧);超时重传 1,2,3(回退 N)。SR:帧 1 丢失,接收方缓存 2,3($Wr>1$);超时仅重传帧 1(选择性),效率高但需缓存。

常见考法

  1. 给出某段报文,求 seqack
  2. 窗口滑动题:给窗口大小 + 已确认长度,求窗口位置。
  3. 计算 RTO:给 RTTs、RTTd、新 RTT,套 $RTO = RTTs + 4\times RTTd$
  4. GBN vs SR 协议手算:确定重传范围。

易错点

  • ❌ 确认号含义:确认号 N 表示期望收到第 N 字节(N 前全部收到),不是"收到 N 字节"。
  • ❌ RTO 不是常数:是动态计算的,$\alpha=0.125$、$\beta=0.25$。
  • ❌ 窗口右移时机:收到确认后窗口才右移,不是发送完立即右移。
  • ❌ GBN/SR 区别:GBN 缓存只有一个,SR 需多个缓存(接收窗口 $Wr>1$)。

核心结论

  1. TCP 可靠传输 = 序号 + 确认号 + 超时重传 + 滑动窗口。
  2. 确认号是累积的:告诉对方"该号之前全收到"。
  3. RTO 动态计算:$RTO = RTTs + 4 \times RTTd$。
  4. 发送窗口 = 接收窗口 rwnd(不做拥塞时);窗口右边界 = 左边界 + rwnd。
  5. GBN 回退重传(丢一重 N),SR 选择性重传(效率高需缓存)。

记忆卡片

TCP 可靠传输三/四大机制?
序号、确认、超时重传、滑动窗口。保证无差错、不丢失、不重复、按序到达。
ack=N 表示什么?
N 之前所有字节全部正确接收,期望收到序号 N 的字节。是累积确认。
RTO 公式?
$RTO = RTTs + 4 \times RTTd$;$RTTs=(1-\alpha)RTTs+\alpha RTT_{new}$(α=0.125);$RTTd=(1-\beta)RTTd+\beta|RTTs-RTT_{new}|$(β=0.25)。
GBN 和 SR 核心区别?
GBN 丢一个重传窗口全部;SR 只重传丢失的那一个(需接收缓存 $W_r>1$)。

交互动画 · 超时重传(GBN vs SR)

发送方 接收方 帧0 帧1 ✗ 丢失 帧2 帧3 重传 帧1 重传 帧2 重传 帧3 ack=1(累积确认) ack=2 ack=3
选择协议,观察丢帧后的重传范围
点击按钮开始
GBN:帧 1 丢失,回退重传 1、2、3(橙色虚线);SR:只重传丢失的帧 1,帧 2、3 无需重传。

重传场景时序演示(序号 / 确认号)

相关知识点

udp-protocol tcp-three-way-handshake tcp-flow-and-congestion tcp-congestion-algorithm

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。