首页 > 编程知识 正文

为什么是三次握手不是四次,为什么四次挥手要比三次握手多一次

时间:2023-05-05 10:01:42 阅读:174389 作者:935

【三次握手】

初次握手:客户端发送SYN标志为1的数据包,随机取随机数SEQ=x作为自己的初始序列号,发送后进入SYN-SEND状态。

第二次握手: SYN=1的标记到达服务器端,表明客户端正在尝试与自己建立连接,此时处于侦听状态。 因此,确立确认标签ack(ack=seq1 )、连接标签SYN=1,并且发送随机生成的包(seq )=y,发送后进入SYN-RECV状态。

第三次握手: Client方在收到来自Server方的数据包后,检查ACK的值seq1和SYN是否为1,确认无误后,包含ack=seq(s ) 1、SEQ=z之一进行发送

【4挥手】

4挥手有两种情况,在此客户主动提出关机请求并进行说明。

第一次挥手:客户端积极切断,FIN=1,SEQ=u (发送之前发送的数据的最后一个字节的序列号加1后的编号。 这是因为TCP协议规定了即使FIN报文段不具有数据也不消耗顺序号(),发送后进入FIN-WAIT-1状态;

第二次挥手:服务器收到断开请求信息后,发送包含ACK=u 1、SEQ=z的确认信息,发送后进入“关闭-等待”状态。 客户端收到服务器端的确认信息后,客户端进入等待状态,继续接收服务器端发送的最后一条消息;

第三次手势:所有数据传输完成后,服务器端发送包含FIN=1、SEQ=w、ACK=u 1的断开连接信息,此时服务器端处于最后确认状态。

第四次手势:客户端收到断开消息后,必须发送包括ACK=w 1、SEQ=u 1在内的断开确认消息。 此时,客户端进入TIME-WAIT状态,服务器进入CLOSED状态,等待2MSL (最长信息寿命)时间后,服务器进入CLOSED状态

1、为什么连接的时候3次握手,合上的时候4次握手呢?

这是因为服务器端在收到客户端的SYN连接请求消息后,可以直接发送SYN ACK消息。 其中,ACK消息用于响应,SYN消息用于同步。 但是,关闭连接时,服务器收到FIN消息时,很可能不会马上关闭套接字,所以首先向客户端回复ACK消息,告知“你发送的FIN消息收到了” 在我的服务器端的所有消息都被发送之前,我不能发送FIN消息,所以不能一起发送。 所以四步握手是必要的。

2、为什么TIME_WAIT状态需要2MSL (最大消息段生存时间)才能返回到CLOSE状态?

按理说,四个消息都被发送了,我们可以直接进入CLOSE状态,但是我们必须幻想网络不可靠,最后的ACK可能会丢失。 因此,TIME_WAIT状态用于重新发送可能丢失的ACK消息。 在TIME_WAIT状态下,如果TCP客户端上上次发送的ACK丢失,则会重新发送。 TIME_WAIT状态所需的时间取决于实现方法。 典型值为30秒、1分钟、2分钟。 然后,连接将正式关闭,并等待释放所有资源,包括端口号。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。