1. TCP 三次握手的完整过程与每一步的语义,为什么两次不行、四次没必要,半连接队列与 SYN Flood 的关系如何?
请描述 TCP 三次握手的完整过程及每一步的语义,解释为什么需要三次握手(两次不行、四次没必要),并说明半连接队列与 SYN Flood 攻击的关系?
- 三次握手各报文段(SYN、SYN+ACK、ACK)的语义与作用
- 两次握手无法保证双向可达性、四次握手为多余状态
- 半连接队列(syn queue)与全连接队列(accept queue)的区别
三次握手过程为:客户端发送 SYN(seq=x,并携带初始序号 ISN),进入 SYN_SENT 状态;服务端收到后回复 SYN+ACK(seq=y, ack=x+1),同时为连接分配半连接队列中的条目,进入 SYN_RECV 状态;客户端收到后回复 ACK(seq=x+1, ack=y+1),服务端将连接从半连接队列移入全连接队列,连接建立,双方进入 ESTABLISHED。第一次握手确认客户端能发、服务端能收;第二次握手确认服务端能发、客户端能收,同时服务端也确认了客户端能发;第三次 ACK 让服务端确认客户端已收到自己的 SYN+ACK。两次握手存在缺陷:服务端无法确认客户端收到了自己的 SYN+ACK,若丢包将导致服务端误以为连接已建立而浪费资源,且无法正确处理旧连接延迟到达的 SYN(序列号问题)。四次握手则冗余,因为第三次 ACK 已能同时报到达和确认,无需额外一次。半连接队列保存已收到 SYN 但尚未完成握手的连接;SYN Flood 正是通过发送大量伪造源 IP 的 SYN 而不回复 ACK,使半连接队列被占满,从而拒绝正常连接。
三次握手本质是双方确认"既能发也能收"所需的最小报文数,核心是 TCP 的可靠性与双向全双工特性。TCP 序号(ISN)的随机化与半连接队列配合,防止了旧包与新连接混淆。理解半连接队列与 SYN Flood 的关系,是排查"服务端连接数异常但进程正常"类故障的关键。