一 真题2009-38
2009-38题. 主机甲与主机乙之间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300B和500B的有效载荷,第一个段的序列号为200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是()。
A. 500
B. 700
C. 800
D. 1000
二 题目要素解析
场景: TCP 连接的数据传输阶段。
已知条件:
- 发送方:主机甲
- 接收方:主机乙
- 第一个段:序列号(Seq)= 200,数据长度 = 300B
- 第二个段:紧接第一个段,数据长度 = 500B
- 接收状态:主机乙正确接收了这两个段
求: 主机乙返回的确认序列号(ACK)。
核心考点: TCP 的确认机制 ------累积确认(Cumulative Acknowledgment)。
TCP 的 ACK 号表示 "期望收到的下一个字节的序列号"。
三 哔哔详解
这道题考察的是 TCP 最基础也最重要的序列号计算逻辑。
-
理解序列号(Seq)的含义:
TCP 是面向字节流的协议。每个字节都有一个编号。
- 第一个段的 Seq = 200,意味着这个段里的第 1 个字节编号是 200。
- 该段有 300B,所以它覆盖的字节范围是:200 ~ 499(计算:200 + 300 - 1 = 499)。
-
推算第二个段的序列号:
题目说是 "连续" 的 TCP 段。
- 第二个段紧接着第一个段,所以它的起始序列号应该是第一个段的结束号 + 1。
- 第二个段的 Seq = 500。
- 该段有 500B,所以它覆盖的字节范围是:500 ~ 999(计算:500 + 500 - 1 = 999)。
-
理解确认号(ACK)的含义:
TCP 使用累积确认 。接收方回复的 ACK 号,代表它已经正确接收了该序号之前的所有字节 ,并且期望接收该序号的字节作为下一个数据。
- 公式:ACK=最后一个正确收到的字节序号+1。
-
计算 ACK 号:
- 主机乙收到了两个段,最后一个正确收到的字节序号是 999。
- 那么,它期望下一次收到的字节序号就是 999 + 1 = 1000。
- 所以,确认号 ACK = 1000。
四 参考答案
参考答案 D
五 考点精析
5.1 TCP 序号与确认号基本规则
1. 序号(Sequence Number, SEQ)
- 定义 :标识本报文段中第一个字节在发送方字节流中的位置。
- 编号单位 :按字节编号(不是按报文段)。
- 初始值:ISN(Initial Sequence Number),随机生成(防 SYN Flood 攻击)。
- 递增规则:
- 每发送 n 字节数据,下一段 SEQ = 当前 SEQ + n
- SYN/FIN 标志位也消耗一个序号(即使无数据)
✅ 示例:
SEQ=100,载荷=200B → 字节范围 [100, 299],下一段 SEQ=300
2. 确认号(Acknowledgment Number, ACK)
- 定义 :表示期望收到的下一个字节的序号。
- 含义 :已成功接收 [0, ACK−1] 的所有字节(累积确认)。
- 有效条件 :仅当 ACK 标志位 = 1 时,确认号字段有效。
- 响应关系:
- 对方发来 SEQ=x,载荷=L → 本端应回复 ACK = x + L
- 若含 SYN 或 FIN,则 ACK = x + 1(因它们各占 1 个序号)
✅ 示例:
收到 SEQ=500,500B 数据 → 回复 ACK=1000
收到 SYN(SEQ=100)→ 回复 ACK=101
5.2 SYN/FIN 对序号的影响
关键规则:
- SYN 消耗 1 个序号(即使无数据)
- FIN 消耗 1 个序号
- 纯 ACK 段不消耗序号
5.3 三次握手 (3-Way Handshake) 过程
第一次握手 (Client *→* Server):
- 标志位:SYN = 1
- 序号:Seq = x (ISN, 初始序列号)
- 注意:此时 Client 没有发送数据,但消耗了 1 个序号。
第二次握手 (Server *→* Client):
- 标志位:SYN = 1, ACK = 1
- 序号:Seq = y (Server 的 ISN)
- 确认号:ACK = *x+1* (期望收到 Client 的第一个数据字节)
- 注意:Server 回复了 SYN,所以自己的 Seq 也要 +1 供下次使用。
第三次握手 (Client *→* Server):
- 标志位:ACK = 1
- 序号:Seq = *x+1* (因为第一次握手的 SYN 消耗了 1)
- 确认号:ACK = *y+1* (期望收到 Server 的第一个数据字节)
5.4 四次挥手 (4-Way Wavehand) 过程
注意 FIN 报文也消耗序号。
- 第一次挥手 (Client *→* Server):
- 标志位:FIN = 1
- 序号:Seq = u
- 状态:Client 进入 FIN_WAIT_1。
- 第二次挥手 (Server *→* Client):
- 标志位:ACK = 1 (仅仅是确认关闭请求,还没准备好关闭)
- 序号:Seq = v
- 确认号:ACK = *u+1* (FIN 消耗了 1)
- 状态:Server 进入 CLOSE_WAIT;Client 进入 FIN_WAIT_2。
- 第三次挥手 (Server *→* Client):
- 标志位:FIN = 1, ACK = 1 (Server 数据发完了,准备关闭)
- 序号:Seq = w (通常 w=v,除非中间发了数据)
- 确认号:ACK = u+1 (重复确认)
- 注意:FIN 消耗 1 个序号。
- 第四次挥手 (Client *→* Server):
- 标志位:ACK = 1
- 序号:Seq = u+1
- 确认号:ACK = *w+1* (确认 Server 的 FIN)
5.5 序号回绕 (Sequence Wraparound)
概念: TCP 序号是 32 位的。当序号达到 232−1 后,下一个序号变为 0。
考点: 计算序号回绕时间。
公式:T=232带宽T = \frac{2^{32}}{\text{带宽}}T=带宽232
例子: 1Gbps 链路的回绕时间约为 34 秒。为了防止旧报文干扰,TCP 规定了 PAWS(Protect Against Wrapped Sequences)机制。
5.6 窗口与确认的关系
滑动窗口: 接收方在 ACK 报文中会携带一个 Window Size 字段。
含义: 告诉发送方 "我现在的接收缓冲区还剩多少空间,请以此控制发送速率"。
考点: 发送方的发送窗口大小取决于 Min [拥塞窗口 cwnd, 接收窗口 rwnd]。
5.3 易错点总结
| 错误认知 | 正确认知 |
|---|---|
| "确认号 = 最后收到的 SEQ" | ❌ 应为 最后收到的 SEQ + 载荷 |
| "SYN 不占序号" | ❌ SYN/FIN 各占 1 个序号 |
| "ACK 段会改变 SEQ" | ❌ 纯 ACK 段 SEQ 不变(除非同时携带数据) |
| "序号按报文段编号" | ❌ 按字节编号 |
六 考点跟踪
| 年份 | 题号 | 考查内容 | CSDN 参考链接 | VX参考链接 |
|---|---|---|---|---|
| 2009 | 第38题 | TCP 序列号与确认号计算(基础累加) | ||
| 2011 | 第39题 | TCP三次握手中的 SEQ/ACK | ||
| 2012 | 第47题 | TCP三次握手中的 SEQ/ACK | ||
| 2013 | 第39题 | TCP 序列号与确认号计算 | ||
| 2016 | 第41题 | TCP三次握手 | ||
| 2020 | 第39题 | 反推发送的字节数 | ||
| 2021 | 第41题 | TCP 序列号与确认号计算 | ||
| 2023 | 第47题 | TCP 序列号与确认号计算 | ||
| 2024 | 第38题 | TCP 释放连接最少时间 | ||
| 2025 | 第38题 | 反向计算可发送的段数 |
说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。