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 |
| 窗口内数据 | 可以发送(已发送未确认 + 未发送可发送) |
题目:A 向 B 发送数据,初始序号 $seq = 100$,发送 200 字节数据。解答:第一段 $seq = 100$,数据 200 字节;B 收到后回复 $ack = 300$(期望第 300 字节),即确认了序号 100~299 的全部数据。
题目:发送窗口大小 = 400 字节,初始 $seq = 0$。
初始状态: [已确认|待确认|可发送|不可发送] 0 0 400 ∞ 发送 seq=0,100,200,300 各 100 字节后: [已确认|待确认|可发送|不可发送] 0 0 400 ∞ ← 全部待确认,窗口满 收到 ack=200 后(前 200 字节确认): [已确认|待确认|可发送|不可发送] 0-199 200 600 ∞ ← 窗口右移 200 字节
题目:初始 $RTTs = 100$ms,$RTTd = 5$ms,新 RTT 依次为 110、90、100ms。
GBN:发送 0,1,2,3 → 窗口满(W=4);帧 1 丢失,接收方丢弃 2,3($Wr=1$ 只接受按序帧);超时重传 1,2,3(回退 N)。SR:帧 1 丢失,接收方缓存 2,3($Wr>1$);超时仅重传帧 1(选择性),效率高但需缓存。
seq 和 ack。↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。