向服务器发送同四元组不同序列号的两个SYN包会发生什么?
同一四元组下发送不同序列号SYN包的结果
当在未收到服务器SYN-ACK前,发送两个源/目IP、端口完全相同,仅序列号不同的SYN包时,实际行为取决于TCP栈的实现,核心结果如下:
服务器端处理逻辑
- 两个SYN属于同一个TCP四元组(源IP、源端口、目的IP、目的端口),服务器不会创建两个独立的半连接条目。
- 若服务器尚未回复第一个SYN的SYN-ACK,收到第二个SYN后,会更新半连接队列中对应条目的客户端序列号为第二个SYN的序列号,重新发送SYN-ACK报文:确认号为第二个SYN的序列号+1,服务器初始序列号按实现规则生成(多数场景下保持逻辑一致性)。
- 若服务器已回复第一个SYN的SYN-ACK,此时收到第二个SYN,仍会判定为同一连接的重试请求,再次回复对应新序列号的SYN-ACK,覆盖半连接条目中的旧客户端序列号。
客户端处理逻辑
- 客户端处于
SYN_SENT状态时,通常只跟踪最近发送的SYN包序列号。收到服务器SYN-ACK时,会检查确认号是否等于自己最近发送的SYN序列号+1:- 匹配的SYN-ACK会被正常处理,客户端回复ACK完成三次握手,连接进入
ESTABLISHED状态。 - 不匹配的SYN-ACK(对应更早发送的SYN)会被TCP栈判定为无效报文直接丢弃。
- 匹配的SYN-ACK会被正常处理,客户端回复ACK完成三次握手,连接进入
- 若两个SYN-ACK先后到达客户端,只有与当前期望序列号匹配的那个会触发后续ACK回复,另一个会被忽略。
特殊场景
- 若服务器半连接队列已满,第二个SYN可能被直接丢弃,服务器不会回复SYN-ACK。
- 部分TCP实现会对重复SYN做速率限制,多次发送可能触发服务器的SYN flood防护机制,导致后续SYN被拦截。
内容的提问来源于stack exchange,提问作者Aashish Aggarwal
相关产品推荐
相关产品推荐

