(一)三次握手
ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
发送序列号:Sequence Number
确认序列号:Acknowledgment Number
CLOSED: 初始状态。
LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处 于监听状态,可以接受连接了。
SYN_RCVD: 在收到和发送一个连接请求后等待对连接请求的确认
SYN_SENT: 在发送连接请求后等待匹配的连接请求
ESTABLISHED:建立连接了
服务器通过listen系统调用进入listen状态,被动打开,服务器一旦监听到某个连接请求,这个连接请求就是收到的同步报文段,之后就将该连接放入等待队列中。
客户端connect系统调用主动与服务器建立连接。发送一个同步报文段给服务器,连接转移为SYN_SENT。connect失败返回:
1.connect连接的目的端口不存在或被TIME_WAIT占用
2.在超时时间内未收到服务器的确认报文
connect失败立即返回CLOSED状态,成功进入ESTABLISHED状态。
第一次握手:客户端主动打开连接,发送带有SYN=1,ACK=0的TCP报文到服务器,初始序号X,保存在包头的序列号(Sequence Number)中,同时客户端进入SYN_SEND状态。
第二次握手:服务器收到SYN包,确认SYN(ack=x+1)将确认序号(Acknowledgement Number)设置为客户的ISN加1以.即X+1,自己发送一个SYN(seq=y),同时服务器进入SYN_RECV状态
第三次握手: 客户端收到服务器的SYN+ACK, 回复ACK=1, ack=y+1,在数据段放写seq+1(即ISN+1)。同时端和服务器进入ESTABLISHED状态,完成三次握手。
**为什么是三次握手,而不是两次握手
客户端为A,服务器为B
当要进行连接时,A发送一个连接请求,如果连接请求报文丢失,A再会重新发送一个请求连接,等B收到请求确认连接后,建立起连接。
但如果A发出的第一个连接请求报文并没有丢失,而是被滞留在网络,延迟到A第二个连接请求建立后达到。如果没有第三次握手,B以为A有发出一个新的连接请求,B确认建立连接。A在这时却没有发出连接请求,不理B的确认,不发送数据,B却等待A发送数据,B的资源浪费。
采用三次握手,B确认后收不到A的确认,连接就建立不起来。
(二)攻击
在TCP三次握手时,攻击者故意不完成三次握手,导致服务器资源耗费,直到瘫痪
DoS(拒绝服务攻击 Denial Of Service)
就是“单挑”,比谁机器性能好,你发出每秒10个攻击数据包,而被攻击机器每秒能接受处理100个攻击数据包,那么你的攻击就没效果,你的服务器可能崩溃。
DDoS(分布式拒绝服务攻击Distributed Denial of Service)
就是“群殴”,多个机器发动DoS攻击去攻击一台机器,这是由一名黑客操作的,他是通过他的机器在网络上占领很多的“肉鸡”,并且控制这些“肉鸡”来发动DDoS攻击
DRDoS(分布反射式拒绝服务攻击Distributed Reflection Denial of Service)
它是DDoS攻击的变形,它与DDoS攻击不同在于在进行攻击前不需要占有大量的“肉鸡”。DRDos是可以在广域网上的,它的作用原理是基于广播地址与回应请求的。一台计算机向另一台计算机发送一些特殊的数据包如ping请求时,会接到它的回应;如果向本网络的广播地址发送请求包,实际上会到达网络上所有的计算机,这时就会得到所有计算机的回应。首先把伪造了源地址的SYN连接请求包发送到那些被欺骗的计算机上,这些回应是需要被接收的计算机处理的,每处理一个就要占用一份系统资源,如果同时接到网络上所有计算机的回应,接收方的系统是有可能吃不消的,就象遭到了DDoS攻击一样。根据TCP三次握手的规则,这些计算机会向源IP发出SYN+ACK或RST包来响应这个请求。黑客所发送的请求包的源IP地址是被攻击主机的地址,这样受欺骗的主机就都会把回应发到被攻击主机处,造成被攻击主机忙于处理这些回应而瘫痪
TCP协议栈的弱点:TCP连接的资源消耗,其中包括:数据包信息、条件状态、序列号等。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽。
SYN洪水攻击(SYN-Flood)是DoS与DDoS方式之一
客户端和服务器在网络中使用TCP协议发起会话时,在服务器内存中会开辟一小块缓冲区来处理会话过程中消息的握手交换。
伪装虚拟IP地址发动攻击
拦截客户机应答报文
多客户端情况下,大量第二次握手确认报文发出,再拦截,再发出,导致服务器瘫痪。
防御措施:
缩短SYN Timeout时间 限制同时打开的SYN半连接数目
SYN Flood攻击效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,设置20秒以下可以成倍的降低服务器的负荷。
设置SYN Cookie
在TCP服务器接收到TCP SYN包并返回TCP SYN + ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。这个cookie作为将要返回的SYN ACK包的初始序列号。当客户端返回一个ACK包时,根据包头信息计算cookie,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被丢弃。
为防止TCP会话劫持,加密传输
防火墙