TCP 序列号增加但不发送数据的情况

1. 连接建立阶段(三次握手)

  • 第一次握手(SYN 报文)
    • 客户端发送 SYN=1, Seq=x
    • 序列号行为x 为初始序列号(ISN),虽无数据发送,但序列号被占用(SYN 占用 1 个序号,下次数据从 x+1 开始)。
  • 第二次握手(SYN+ACK 报文)
    • 服务器回复 SYN=1, ACK=1, Seq=y, Ack=x+1
    • 序列号行为y 为服务器初始序列号,SYN 同样占用 1 个序号(下次数据从 y+1 开始)。
  • 第三次握手(ACK 报文)
    • 客户端发送 ACK=1, Seq=x+1, Ack=y+1
    • 序列号行为Seq=x+1(因 SYN 已占 x),但此报文不携带数据,序列号未实际消耗(下次数据仍从 x+1 开始)。

关键点

  • SYN 和 FIN 标志位会隐式占用 1 个序列号,即使无数据发送。
  • 第三次握手的 ACK 不占用序列号(仅确认,无数据或控制标志)。

2. 连接释放阶段(四次挥手)

  • 第一次挥手(FIN 报文)
    • 主动关闭方发送 FIN=1, Seq=uu 为最后数据字节序号 +1)。
    • 序列号行为FIN 占用 1 个序号(下次确认号应为 u+1)。
  • 第二次挥手(ACK 报文)
    • 被动关闭方回复 ACK=1, Seq=v, Ack=u+1
    • 序列号行为Seq=v 为正常数据序号,此报文不消耗序列号(仅确认)。
  • 第三次挥手(FIN 报文)
    • 被动关闭方发送 FIN=1, ACK=1, Seq=w, Ack=u+1w 可能等于 v 或后续序号)。
    • 序列号行为FIN 占用 1 个序号(w 被占用,下次确认号应为 w+1)。
  • 第四次挥手(ACK 报文)
    • 主动关闭方发送 ACK=1, Seq=u+1, Ack=w+1
    • 序列号行为:不消耗序列号(无数据或控制标志)。

关键点

  • FIN 和 SYN 类似,均占用 1 个序列号。
  • 第二、四次挥手的 ACK 不增加序列号。

例子

  1. 连接建立阶段
    • 第一次握手(SYN):A→BSeq=211
  2. 连接释放阶段
    • 第四次挥手:A→BSeq=985

实际发送字节数

  1. 初始序列号
    • 第一个数据字节的序列号 = 第一次握手 SYN 的 Seq+1 = 211 + 1 = 212
  2. 结束序列号
    • 最后一次数据字节的序列号 = 第一次挥手 FIN 的 Seq-1 = 984 - 1 = 983
      • (FIN 占用 984,最后一个数据字节是 983
  3. 总字节数
    • 实际发送字节数 = 983 - 212 + 1 = 772
  • 计算式FIN的Seq(984) - SYN的Seq(211) - 1(SYN和FIN各占1) = 984 - 211 - 1 = 772

:SYN 和 FIN 各隐式占用 1 个序列号,但不携带数据,因此需从总跨度中扣除。