Appearance
题目
若主机甲主动发起一个与主机乙的 TCP 连接,甲、乙选择的初始序列号分别为 2018 和 2046,则第三次握手 TCP 段的确认序列号是( )。
错因
A
把"甲的 SYN 序号"误填成"第三次握手的确认号"——根本搞错了 ACK 的确认对象。第三次握手是甲发的 ACK,甲是在确认乙刚发来的 SYN+ACK,所以 ACK 字段的值应基于乙的序号,不是甲自己的。
B
知道要看甲的序号 + 1 = 2019,但搞错了哪一方的序号。第三次握手的 ACK 是确认乙的 SYN,应该用乙的初始序号 + 1 = 2047,而不是甲的 + 1。
C
知道要用乙的序号(2046),但忘记了 SYN 占一个序号——直接用乙的初始序号 2046 作为 ACK 值。SYN 和 FIN 都是控制段(不携带数据),但它们各自占一个序号空间,对方的 ACK 必须比 SYN 大 1。
总解析
第一步:明确三次握手的序号 / 确认号关系
| 步骤 | 方向 | seq | ack | 说明 |
|---|---|---|---|---|
| ① SYN | 甲 → 乙 | 2018 | — | 甲的初始序号 = 2018,SYN 占 1 个序号(消耗序号空间) |
| ② SYN + ACK | 乙 → 甲 | 2046 | 2019 | 乙的初始序号 = 2046;ack = 甲的 SYN 序号 + 1 |
| ③ ACK | 甲 → 乙 | 2019 | ? | seq = 2018 + 1 = 2019(甲的 SYN 已占 2018);ack = 乙的 SYN 序号 + 1 |
第二步:算第三次握手的 ack
第三次握手是甲发出的 ACK,对乙的 SYN 的确认:
第三步:核对
| 选项 | 值 | 含义 |
|---|---|---|
| A | 2018 | 甲的初始序号本身(不带 +1) |
| B | 2019 | 甲的 SYN 后的下一个序号(这是第三次握手的 seq,不是 ack) |
| C | 2046 | 乙的初始序号本身(漏 +1) |
| D | 2047 | 乙的 SYN + 1(正确) |
记忆要点:
- "你给我什么序号,我就 ACK 你的序号 + 1"——SYN 和 FIN 各占 1 个序号
- 第三次握手 seq = 2019、ack = 2047 是正确组合
最终答案是 D(2047)。
编者注(生僻术语):TCP 序号空间是 32 位无符号整数(0 ~ ≈ 4.3G),从初始 ISN 开始按字节计数。SYN 和 FIN 各消耗 1 个序号——尽管它们不带应用数据,但都是"虚拟的 1 字节",方便对端用统一的 ACK 机制确认。普通数据段则按字节数累加序号。这条规则是 TCP 序号 / 确认号题的核心,记牢即可解大半此类题。