一、三次握手和四次挥手
对于TCP为什么需要进行三次握手我们可以一样的理解:
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
一般来说两次握手就够了,如下步骤1,2,但是要考虑请求步骤1可能是被客户端B伪造的一个请求,所以服务器还要等待客户端A的一个确认信息之后才可以发送数据。
步骤:
1.请求建立连接,客户端A->服务器
2.验证客户端,服务器->客户端A
3.确认客户端,客户端A->服务器
三次握手四次挥手 图示:
二、第三次握手失败时怎么办?
RTS(Round Trip Sample):往返样本
RTT(Round Trip Time):往返时间
服务器收到SYN包后发出SYN+ACK数据包,服务器进入SYN_RECV状态。
而这个时候客户端发送ACK给服务器失败了,服务器没办法进入ESTABLISH状态,这个时候肯定不能传输数据的,不论客户端主动发送数据与否,服务器都会有定时器发送第二步SYN+ACK数据包,如果客户端再次发送ACK成功,建立连接。
如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发RTS报文,进入CLOSED状态,(这样做的目的是为了防止SYN洪泛攻击)这个时候客户端应该也会关闭连接。
SYN洪泛攻击:利用的是TCP的三次握手机制,攻击端利用伪造的IP地址向被攻击端发出请求,而被攻击端发出的响应 报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。
TCP SYN泛洪发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手。攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。这样更加会浪费服务器的资源。攻击者就对服务器发送非常大量的这种TCP连接,由于每一个都没法完成三次握手,所以在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机,就无法为正常用户提供服务了。
参考: https://baike.baidu.com/item/SYN%E6%B3%9B%E6%B4%AA%E6%94%BB%E5%87%BB
http://www.cnblogs.com/heyonggang/p/3386415.html
https://www.zhihu.com/question/49324380