一、TCP连接的三次握手
第一次握手:客户端首先向服务器发送一个特殊的TCP报文,这个报文段首部不包含应用层数据,但是在报文段中有一个SYN标志位被置1。因此这个特殊的报文段也被叫做SYN报文段,然后客户端随机选择一个初始序列号(client_isn),并将此数字放入初始TCP SYN段的序列号字段中,SYN段又被封装到IP数据段中发送给服务器。
第二次握手:一旦包含IP数据段到达服务器后,服务端会从IP数据段中提取TCP SYN段,将TCP缓冲区和变量分配给连接,然后给客户端发送一个连接所允许的报文段,这个连接所允许的报文段不包括应用层数据,包括了SYN =1, TCP报文段的首部确认号被设置为client_isn+1,服务器选择自己的初始序号(server_isn),然后放到报文中。
第三次握手:在收到SYNACK报文段后,客户端也要为该连接分配缓冲区和变量。客户端主机向服务器发送另一个报文段,最后一个报文段对服务器发送的响应报文做了确认,确认的标准是客户端发送的数据段中确认号为server_isn+1,因为连接已经建立,SYN = 0。
1、SYN泛洪攻击
在这里开始服务器为了响应一个收到的SNY,分配并初始化变量连接和缓存,然后服务器发送一个SYNACK作为响应,然后等待来自于客户端的ACK报文。如果客户端不发送ACK来完成最后一步的话,那么这个连接就处在一个挂起的状态,也就是半连接的状态。
攻击者通常在这种情况下(第二次握手完毕第三次握手没完成)发送大量的TCO SYN报文段,服务端持续相应,但是每次连接都完不成三次握手的步骤。随着SYN的不断增加,服务器会不停地为这些半开连接分配资源,导致服务器的连接最终被消耗殆尽。
抵御这种攻击的方法使用SYN cookie,当服务器收到SYN报文段时,它并不知道这个报文段来自哪里,是来自攻击者主机还是正常