Appearance
题目
若主机甲与主机乙建立 TCP 连接时发送的 SYN 段中的序号为 1000,在断开连接时,甲发送给乙的 FIN 段中的序号为 5001,则在无任何重传的情况下,甲向乙已经发送的应用层数据的字节数为:
错因
A
把 SYN 和 FIN 都不算占序号,把端点都包含进数据范围:,然后做调整凑到 4002。错的根源:SYN 和 FIN 各占 1 序号是 TCP 的硬规则,无论怎么算都不能两端都不扣。
B
把 SYN 不占序号、FIN 占 1 序号——即第一字节序号 = 1000、最后字节序号 = 5000,。错的根源:把 SYN 当成了"起始字节"。TCP 规定 SYN 段的 seq 字段是 ISN(初始序号),SYN 本身消耗 1 个序号,所以第一字节数据的序号是 ISN+1,不是 ISN。
D
按"FIN 占 2 序号"或"SYN + FIN 之间相差 N+2"等非标准约定凑出 3999——比正确的 4000 少 1。错的根源:把 FIN 也当成"占 2 序号"或者把整个序号空间多扣了一个。TCP 协议规范里 SYN 和 FIN 各占且仅占 1 序号,多扣或少扣都会差一位。
总解析
第一步:明确 TCP 序号约定
| 段类型 | 是否占用序号空间 | 该段 seq 字段含义 |
|---|---|---|
| SYN | ✅ 占 1 序号 | ISN(初始序号) |
| 数据段 | ✅ 占 N 序号(N = 字节数) | 该段第一字节的序号 |
| FIN | ✅ 占 1 序号 | 上一个数据字节序号 + 1 |
| ACK(不带数据) | ❌ 不占序号 | 下一个待发字节序号(用于通知对端"我下个会发什么") |
第二步:列时序方程
设甲发送的应用数据共 字节。
| 阶段 | 序号占用 |
|---|---|
| SYN | 1000 |
| 数据 | 1001 ~ |
| FIN |
题面 FIN seq = 5001,得:
第三步:核对
按 TCP 标准约定推导得 ,命中选项 C。
最终答案是 C(4000)。
编者注(生僻术语):TCP 协议规范(RFC 793 / 9293)明确规定 SYN 和 FIN 各占 1 个序号——这两个控制位本身不带应用数据,但占用序号空间是为了让对方能用统一的"累计 ACK"机制确认。本题陷阱就在 SYN 占 1 这条:很多人把 SYN seq 1000 当成"第一个数据字节序号 = 1000",于是漏算 1。记住"SYN 是消耗序号的虚拟字节"是关键。