2009年第38题
主机甲与主机乙之间已建立一个 TCP 连接,主机甲向主机乙发送了两个连续的 TCP 段,分别包含 300B 和 500B 的有效载荷,第一个段的序列号为 200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是( )
A. 500 \qquad B. 700 \qquad C. 800 \qquad D. 1000
解析
本题主要考查 TCP(Transmission Control Protocol)协议中的序列号和确认序列号机制,以及累积确认原则。
-
TCP 序列号(Sequence Number):
- 定义与作用:TCP 序列号是一个 32 位的无符号整数,用于标识发送数据字节的顺序。每个 TCP 段(segment)的序列号表示该段中第一个数据字节的序列号。
- 计算规则:如果某 TCP 段的序列号为 S S S,有效载荷长度为 L L L 字节,则该段覆盖的字节序列范围是 S S S 到 S + L − 1 S + L - 1 S+L−1(包含端点)。
- 连续性:在同一个 TCP 连接中,数据字节的序列号是连续的。下一个 TCP 段的序列号必须是前一个段结束序列号的下一个值(即 S + L S + L S+L)。
-
TCP 确认序列号:
- 定义与作用:当接收方正确收到数据后,会发送一个确认(ACK)。确认序列号(Acknowledgment Number)表示接收方期望收到的下一个字节的序列号,它采用累积确认机制。
- 累积确认原则:TCP 使用累积确认,即一个确认序列号确认所有序列号小于该值的数据字节都已正确接收。例如,如果确认序列号为 X X X,则表示所有序列号小于 X X X 的字节均已被接收,接收方期望发送方从序列号 X X X 开始发送新数据。
- 触发时机:接收方可以在收到每个段后立即发送 ACK,也可以在收到多个段后发送一个累积 ACK(本题属于后者,因为主机乙在收到两个段后才发送确认)。
-
有效载荷(Payload)与序列号的关系:
- 有效载荷指 TCP 段中携带的实际数据部分(不包括 TCP 头部)。序列号的递增完全基于有效载荷的字节数。
- 例如,序列号 S S S 的段携带 L L L 字节有效载荷,则下一个段的序列号为 S + L S + L S+L。
本题中,主机甲向主机乙发送两个连续的 TCP 段,第一段包含 300B 的有效载荷,且序列号为 200,即: S 1 = 200 S_1 = 200 S1=200,有效载荷长度 L 1 = 300 B L_1 = 300 \text{B} L1=300B。所以,该段覆盖的字节序列范围为 S 1 S_1 S1 到 S 1 + L 1 − 1 S_1 + L_1 - 1 S1+L1−1,即: 200 到 200 + 300 − 1 = 499 200 \text{ 到 } 200 + 300 - 1 = 499 200 到 200+300−1=499 。因此,该段包含字节序列号 200 至 499(共 300 字节)。
由于两个段是连续的,第二个段的序列号必须紧接第一个段结束的下一个字节。第一个段结束于序列号 499,所以下一个字节序列号为 500,即:序列号 S 2 = 500 S_2 = 500 S2=500,有效载荷长度 L 2 = 500 B L_2 = 500 \text{B} L2=500B。该段覆盖的字节序列范围为 S 2 S_2 S2 到 S 2 + L 2 − 1 S_2 + L_2 - 1 S2+L2−1: 500 到 500 + 500 − 1 = 999 500 \text{ 到 } 500 + 500 - 1 = 999 500 到 500+500−1=999 。
主机乙正确接收两个段,因此接收的字节序列号为:
- 第一段:200 至 499(300 字节)。
- 第二段:500 至 999(500 字节)。
合并后,接收的总字节序列号为 200 至 999(共 800 字节)。根据 TCP 累积确认原则,确认序列号是接收方期望接收的下一个字节的序列号,即为 1000。
本题答案:D