三次握手
TCP所谓三次握手是指建立一个TCP连接时需要客户端和服务端总共发三个包已确认建立连接。
第一次握手
客户端将指标位 SYN置为1,随机产生一个值seq,比如J,即seq=J,并将数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器应答。
第二次握手
服务器收到客户端的数据包后由标志位为SYN=1知道客户端请求连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,也随意产生一个seq=K,并将数据包发给客户端以确认连接请求,这时候服务器的状态为SYN_RCVD.
第三次握手
客户端收到服务器数据包检查ack是否等于J+1,ACK是否等于1,如果都正确,将ACK置为1,ack=K+1,并将数据包发送给服务器端,服务器端收到包后检查ACK是否等于1,及ack是否等于K+1,如果都正确则连接建立成功,客户端及服务器端都进入ESTABLISHED状态,完成呢过三次握手,随后就可以传输数据了。
为什么 TCP 握手需要三次?
TCP是面对连接的,所以需要双方都确认连接的建立
TCP 是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小 次数。
TCP 的三次握手的漏洞-SYN 洪泛攻击
TCP三次握手中是有一个缺陷的,三次握手中第二次握手,服务器向客户端应答请求,应答请求需要客户端的IP,如果攻击者伪造IP,往服务器狂发第一次握手的数据包,从而服务器端不断去客户端确认请求,当然这个客户端ip是伪造的,是收不到应答的,从而服务器忙于大量的第二次握手得不到结果,所以导致服务器被拖死宕机。
这个攻击就是 SYN 洪泛攻击。
解决这种攻击最好的方法就是防火墙。
防火墙
防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起 SYN 请求,