TCP的三次握手和四次挥手
TCP/IP是面向连接的协议。运输连接是用来发送TCP报文的。TCP的运输连接又三个过程,即建立连接,传输数据和连接释放。
TCP的连接建立:
image.png
1.首先,客户机与服务器的TCP进程都处于CLOSED(关闭)状态,当要进行TCP连接时,客户机主动打开连接,服务器被动打开连接
2.然后,服务器的TCP进程先创建传输控制块TCB(传输控制块TCB存储了每一个连接中的重要信息,如:TCP连接表,指向发送和接收缓存的指针,指向重传队列的指针,当前的发送和接收序号,等等),此时,服务器就处于LISTEN(收听)状态。同样的,客户机也会首先创建一个传输控制块TCB发送给服务器。这样,准备工作就做好了。
3.开始真正的三次握手了。首先客户端会给服务器发送一个同步位SYN=1(这个时候SYN=1说明,客户端想要给服务器发送数据),同时随机生成一个初始序号x(表明,下次客户端发送数据的时候为x+1),那么此时客户机就会进入同步发送状态。
4.当服务器收到客户端的请求后,如果同意与该客户端进行连接,那么这时就会给客户端发送确认报文,首部中的同步位SYN=1(表明服务器想要和客户端进行连接),ACK=1(表明这时服务器同同意和客户端进行连接),并且随机生成一个初始序号y,确认号为x+1(表明服务器希望收到的下一个报文段的第一个数据字节的序号,因为之前客户端发送的是x,所以下一个序号为x+1),那么此时的服务器就会进入一个同步收到状态。
(前面的两个握手阶段会发生SYN flooding攻击)
5.TCP客户端收到了服务器的确认后,那么这时就会给服务器再次给出确认。确认报文的首部同步位ACK=1(表明客户端同意和服务器进行连接),确认号为y+1(表明客户端希望收到服务器的下一个报文的第一个数据字节为y+1),此时客户机发送的序号为x+1,那么此时的客户机和服务器就会进行已连接状态。
通俗点说: 、
客户端:服务器我想和你建立连接(SYN=1),你同意吗?
服务器:客户端,我同意和你连接(ACK=1),发送连接请求(SYN=1);
客户端:服务器,我同意和你连接(ACK=1)。
TCP的连接建释放:
image.png
1.如果数据传输结束后,通信的双方都会释放连接,但是此时的客户端和服务器都处于一个已建立连接的状态。
2.假如客户机请求的资源完毕了以后,想要释放连接,首先会给服务器发送连接释放的报文段,报文段的首部终止控制FIN为1(表明客户端想要和服务器断开连接),并且发送序号u(此时的u不是随机产生的,而是客户端传送的最后一个字节+1),那么此时客户端就会进入终止等待1状态,等待服务器的确认。
3.服务器在收到客户端的请求断开的报文后,发出确认报文,将报文首部的ACK置为1(表明服务器同意与客户端断开连接),并且产生序号v(此时的序号也不会随机产生的,而是服务器给客户端发送数据的最后一个字节+1),并且发出确认序号u+1,此时服务器就进入关闭等待状态,客户机就进入终止等待2的状态。
时啊,客户端收到服务器的的确认报文后就释放了,也就是说,客户端已经没有数据向服务端发送了,但是如果服务端向客户端发送数据,客户端任然需要接受,也就是说客户端到服务器的连接已经被释放了,但是服务器到客户端的连接并没有被释放。tcp处于一个半关闭状态。
4.如果服务器已经不向客户端发送数据了,那么服务器的应用进程就可以向客户端发送连接释放的报文段,该报文的首部终止位FIN为1(表明服务器想要和客户端断开连接),ACK置为1,并且序号为w(w并不一定等于v+1,因为在客户端释放连接后,可能服务器还向客户端发送过数据,总而言之如果发送给那么就是发送的最后一个数据的字节+1),再发送u+1的确认序号(因为之前发送了u),此时服务器就进入了最后确认的状态。
5.那么在客户端收到了服务器的释放报文后,必须对此进行确认。在该报文中将ACK置为1,确认号为w+1,产生序号为u+1(上次客户端发送的序号为u),此时的服务器进入等待状态。但是TCP连接还没有被释放掉,必须要经过4分钟后服务器才进入closed状态。
通俗来讲:
客户端:服务器,我想和你断开连接(FIN=1)
服务器:同意断开连接(ACK=1)
服务器:客户端,我想和你断开连接(FIN=1)
客户端:同意(ACK=1)
SYN FLOODING与FIN FLOODING攻击?
syn flooding是一种很古老的攻击,该攻击蛀牙是利用了TCP/IP的三次握手,利用大量虚假ip的身份建立不完整连接,消耗主机的CPU,从而使主机近于瘫痪。
image.png
SYN FLOODING就是利用红色框中的阶段进行攻击。
攻击者向服务器或者主机发送SYN请求连接,服务器或者目标主机在收到请求时会进行请求确定,即向攻击者进行连接确定,而此时的攻击者会停止向服务器发送确认连接的确认包,因此,服务器就处在了等待确认的状态,在正常的情况下,服务器或者目标主机在等待一定的时间后就会停止等待,此次的连接也就自然而然的结束了,也就不会造成什么危害。但是攻击者会在短时间内伪造大量的SYN请求连接包发给服务器,即使每条SYN包请求会在短时间内被丢弃,但是大量的请求包在同一时间进行请求连接,服务器或者目标主机就没有足够的时间去处理这些请求包,因此就会使服务器或者目标主机的Cpu利用率下降,甚至使服务器瘫痪
其实,还可以进行FIN flooding攻击,原理与SYN攻击一样,攻击者向服务器或者目标主机发送大量的FIN请求包,由于攻击者并未和服务器进行过通讯,因此,在服务器或目标主机接收到该FIN请求后,会对FIN包进行分析,这就耗费了服务器或者目标主机的时间,当攻击者向服务器或者目标主机发送大量的FIN数据包时,就会消耗大量的CPU使用率,达到和SYN FLOOD一样的效果。