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=u(u为最后数据字节序号 +1)。 - 序列号行为:
FIN占用 1 个序号(下次确认号应为u+1)。
- 主动关闭方发送
- 第二次挥手(ACK 报文)
- 被动关闭方回复
ACK=1, Seq=v, Ack=u+1。 - 序列号行为:
Seq=v为正常数据序号,此报文不消耗序列号(仅确认)。
- 被动关闭方回复
- 第三次挥手(FIN 报文)
- 被动关闭方发送
FIN=1, ACK=1, Seq=w, Ack=u+1(w可能等于v或后续序号)。 - 序列号行为:
FIN占用 1 个序号(w被占用,下次确认号应为w+1)。
- 被动关闭方发送
- 第四次挥手(ACK 报文)
- 主动关闭方发送
ACK=1, Seq=u+1, Ack=w+1。 - 序列号行为:不消耗序列号(无数据或控制标志)。
- 主动关闭方发送
关键点:
FIN和SYN类似,均占用 1 个序列号。- 第二、四次挥手的
ACK不增加序列号。
例子
- 连接建立阶段:
- 第一次握手(SYN):
A→B,Seq=211
- 第一次握手(SYN):
- 连接释放阶段:
- 第四次挥手:
A→B,Seq=985
- 第四次挥手:
实际发送字节数
- 初始序列号:
- 第一个数据字节的序列号 = 第一次握手 SYN 的
Seq+1=211 + 1 = 212
- 第一个数据字节的序列号 = 第一次握手 SYN 的
- 结束序列号:
- 最后一次数据字节的序列号 = 第一次挥手 FIN 的
Seq-1=984 - 1 = 983- (FIN 占用
984,最后一个数据字节是983)
- (FIN 占用
- 最后一次数据字节的序列号 = 第一次挥手 FIN 的
- 总字节数:
- 实际发送字节数 =
983 - 212 + 1 = 772
- 实际发送字节数 =
- 计算式:
FIN的Seq(984) - SYN的Seq(211) - 1(SYN和FIN各占1) = 984 - 211 - 1 = 772
注:SYN 和 FIN 各隐式占用 1 个序列号,但不携带数据,因此需从总跨度中扣除。