美文网首页
TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

作者: 一个前端小菜鸟 | 来源:发表于2020-03-21 21:14 被阅读0次

    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一样的效果。

    相关文章

      网友评论

          本文标题:TCP的三次握手和四次挥手

          本文链接:https://www.haomeiwen.com/subject/rztscqtx.html