文章目录
- 三次握手过程
- SYN Flood攻击原理
- 防御措施
- 协议层优化
- 网络层拦截
- 系统配置调整
TCP协议是 TCP/IP 协议栈中一个重要的协议,平时我们使用的浏览器,APP等大多使用 TCP 协议通讯的,可见 TCP 协议在网络中扮演的角色是多么的重要。
TCP 协议是一个可靠的、面向连接的流协议,由于 TCP 协议是建立在 IP 协议这种面向无连接的协议,所以 TCP 协议必须自己来维护连接的状态。
三次握手过程
TCP 协议通过 三次握手来建立客户端与服务端的连接,三次握手 过程的原理如下图
建立连接三次握手过程如下:
- 客户端需要发送一个
SYN包
给服务端(包含了客户端初始化序列号),并且将连接的状态设置为SYN_SENT
,这个过程由connect()
系统调用完成。 - 服务端接收到客户端发送过来的
SYN包
后,回复一个SYN+ACK包
给客户端(包含了服务端初始化序列号),并且设置连接的状态为SYN_RCVD
。 - 客户端接收到服务端发送过来的
SYN+ACK包
后,设置连接状态为ESTABLISHED
(表示连接已经建立),并且回复一个ACK包
给服务端。 - 服务端接收到客户端发送过来的
ACK包
后,将连接状态设置为ESTABLISHED
(表示连接已经建立)。
当 三次握手 过程完成后,一个 TCP 连接就此建立完成。
SYN Flood攻击原理
上面介绍了建立一个 TCP 连接的 三次握手 过程,我们可以发现,三次握手 属于一个协商的过程,也就是说客户端与服务端必须严格按照这个过程来进行,否则连接就不能建立。
这时,如果客户端发送 SYN包 企图与服务端建立连接,但发送完 SYN包 后就不管,那会发送什么事情呢?
客户端发送一个 SYN包 给服务端后就退出,而服务端接收到 SYN包 后,会回复一个 SYN+ACK包 给客户端,然后等待客户端回复一个 ACK包。
但此时客户端并不会回复 ACK包,所以服务端只能一直等待直到超时。服务端超时后,会重发 SYN+ACK包 给客户端,默认会重试 5 次,而且每次等待的时间都会增加(可以参考 TCP 协议超时重传的实现)。
另外,当服务端接收到 SYN包 后,会建立一个半连接状态的 Socket。所以,当客户端一直发送 SYN包,但不回复 ACK包,那么将会耗尽服务端的资源,这就是 SYN Flood 攻击。
防御措施
协议层优化
- SYN Cookie:服务器不立即分配资源,通过哈希算法验证连接合法性后再分配。
- 缩短SYN Timeout:减少半连接等待时间,加速无效请求释放。
网络层拦截
- 防火墙/IP过滤:识别并拦截伪造IP的SYN包,限制单IP连接速率。
- 流量清洗:通过DDoS防护设备过滤异常流量,仅转发合法请求。
系统配置调整
-
扩大连接队列:增加
backlog
队列容量,缓解短时高并发冲击。
调整 -
扩大连接队列:增加
backlog
队列容量,缓解短时高并发冲击。 -
负载均衡:将流量分散至多台服务器,降低单点压力。