当前位置:网站首页>三次握手与四次挥手

三次握手与四次挥手

2022-08-11 08:57:00 学习record

目录

重要概念

三次握手

第一次握手:

第二次握手:

第三次握手:

问题1:为什么要三次握手?

问题2:为什么是三次握手,不是两次,四次?

四次挥手

 第一次挥手:

第二次挥手:

第三次挥手:

第四次挥手:

问题1:为什么客户端需要等待2秒?

重要概念

        SYN(同步请求信号)

        ACK(响应信号)

                ACK=1,响应有效

                ACK=0,响应无效

        ack(确认信号)

        seq(序列号)

三次握手

第一次握手:

        客户端向服务端发送SYN=1同步请求信号,序列号seq=x;客户端进入SYN_SEND状态(同步请求状态)

第二次握手:

        服务端收到客户端的信号后,向客户端发送SYN=1信号,ack=x+1,ACK=1响应,seq=y;服务端状态有LISTEH转为SYN_SEND

第三次握手:

        客户端收到信号后,发送SYN=1,seq=x+1,ack=y+1;客户端进入ESTABLISHED状态(连接状态),服务端收到信号后也进入ESTABLISHED状态。

问题1:为什么要三次握手?

答:第一次握手服务端知道客户端有信号发送功能;第二次握手,客户端知道服务端有信号接收和发送能力;第三次握手,服务端自导客户端有信号接收能力。

问题2:为什么是三次握手,不是两次,四次?

答:假设两次握手,客户端向服务端发送同步请求SYN=1,因为信号中断等特殊原因,服务端没有收到信号,一直在LISTEN状态;然后客户端因为网络原因认为数据没有被发送,再次向服务端发送相同的信号,接着服务端收到信号建立连接,但是网络突然恢复,使发送到的第一条信号又发送给服务端,在两次握手后,服务端等待客户端确认,但是客户端认为只发送了一条请求,导致两边的信息不对等,使服务端一直处于等待确认状态。三次握手本质上是解决网络信道不可靠问题

四次握手则会造成资源浪费,因为三次握手客户端和服务端都可以知道彼此的信号发送和接收能力。

四次挥手

 第一次挥手:

        客户端向服务端发送FIN信号(结束信号),并且发送一个序列号seq=m ,客户端从ESTABLISHED状态进入FIN_WAIT1状态(等待结束1状态)。

第二次挥手:

        服务端收到信号后,向客户端发送响应(ACK=1)、序列号seq=y和确认信号ack=m+1,同时服务端进入CLOSE_WAIT状态(关闭等待状态)。

第三次挥手:

        客户端在CLOSE_WAIT(等待关闭状态)时,可以发送数据给客户端。同时服务端向客户端发送结束信号(FIN)、响应(ACK)、序列号(seq=n)和确认信号ack=m+1。服务端进入最后确认状态(LAST_ACK);客户端收到信号后进入FIN_WAIT2(等待结束2状态)

第四次挥手:

        客户端收到信号后,向服务端发送响应(ACK),序列号(seq=m+1),确认号(ack=n+1),同时自身进入等待时间(TIME_WAIT),两秒后直接关闭连接;服务端收到信号后关闭连接(CLOSE)。

问题1:为什么客户端需要等待2秒?

答:是为了保证服务端能够收到确认信号。因为假设客户端发送完信号直接关闭连接,一旦信号在传输过程中丢失,则会导致服务端一直在等待关闭状态。但是客户端等待两秒,这是服务端没有收到信号客户端会再次发送信号,保证了信号传输的可靠下性。

原网站

版权声明
本文为[学习record]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_60787657/article/details/126266575