我们知道,TCP是面向连接的,可靠的传输层协议,那么TCP是100%可靠无缺陷的吗?
不是的,TCP协议为了实现可靠传输,在三次握手的实现过程中设置了一些异常处理机制。比如说,在三次握手的第三步,如果服务器一直没有收到客户端的ACK报文,服务器一般会进行重试,也就是再次发送SYN+ACK报文给客户端,并且一直处于SYN-RECV状态,将客户端加入等待列表(半连接队列)。重发一般会进行3~5次,大概每隔30秒会轮询一次半连接队列,重试所有的客户端。此外,服务器在发送SYN+ACK报文后,会预留一部分资源给即将建立的TCP连接,这个资源在等待重试期间会一直保留。
然而,服务器的资源是有限的,可维护的等待列表大小超过一定限度后,服务器就不在接受新的SYN报文了,也就是说服务器拒绝建立新的TCP连接了。
攻击者可以伪造大量的IP地址给服务器发送SYN报文,由于伪造的IP地址几乎不可能存在,服务器也就收不到从伪造的IP地址发来的任何回应,因此服务器将会维护一个很大的等待列表,并不断地尝试向等待列表中的IP地址发送SYN+ACK,这样不仅会占用很大的系统资源,而且由于服务器等待队列已满,服务器拒绝建立新的TCP连接,这样正常的客户端想要建立连接时,反而不能成功。
这样的攻击方式称为SYN Flood攻击,是DoS(Deny of Service 拒绝服务)攻击的一种。