TCP三次握手的过程
客户端向服务端发起一个SYN的包,服务端返回对应的SYN的ACK响应以及新的SYN包,然后客户端返回对应的ACK。
其中:
SYN(synchronous)同步序列编号
ACK(acknowledgement)确认字符
详细见思维导图:
使用的队列
半连接队列(syn队列)和全连接队列(accept队列)
服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列,等待进程调用 accept 函数时把连接取出来。
如何防御SYN攻击
• 增大半连接队列
• 开启tcp_syncookies功能
服务器根据当前状态计算出一个值,放在己方发出的 SYN+ACK 报文中发出,当客户端返回 ACK 报文时,取出该值验证,如果合法,就认为连接建立成功。
• 减少syn+ack重传次数