第三次握手防止 SYN攻击

在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
Syn攻击就是 攻击客户端 在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直 至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
TCP四次挥手
总结:
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的
LISTEN状态下的
SOCKET当收到
SYN报文的建连请求后,它可以把
ACK和
SYN(
ACK起应答作用,而
SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的
FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭
SOCKET,也即你可能还需要发送一些数据给对方之后,再发送
FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的
ACK报文和
FIN报文多数情况下都是分开发送的.
2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
这是因为虽然双方都同意关闭连接了,而且握手的
4个报文也都协调和发送完毕,按理可以直接回到
CLOSED状态(就好比从
SYN_SEND状态到
ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的
ACK报文会一定被对方收到,因此对方处于
LAST_ACK状态下的
SOCKET可能会因为超时未收到
ACK报文,而重发
FIN报文,所以这个
TIME_WAIT状态的作用就是用来重发可能丢失的
ACK报文。