第二次握手打三个数字,n个人依次握手共握多少次

首页 > 教育 > 作者:YD1662024-04-05 00:57:07

四次挥手

四次挥手,顾名思义就是客户端和服务端四个步骤的释放连接,断开连接需要发送四个包,别名连接终止协议。由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

第二次握手打三个数字,n个人依次握手共握多少次(9)

刚开始客户端和服务端都处于ESTABLISHED状态,假如客户端主动发起关闭请求:

第一次挥手:TCP客户端向服务端发送一个FIN报文,用来关闭客户端到服务端的数据传送,其中包含一个序列号seq=u,发送完后,客户端进入**FIN_WAIT_1状态,**即主动关闭TCP连接,不再发送数据,(但是可以接收服务器发来的报文),等待服务端回复。

第二次挥手:服务端接收到FIN报文后,会发回一个ACK,表明自己已经接收到了此报文,(此时客户端接就知道服务端接收到了自己的断开连接请求),(但是服务端可能还有数据要传输),并且seq=v,ack的值为序列号 1,此时服务端进入CLOSE_WAIT关闭等待状态和SYN一样,一个FIN将占用一个序号。这个时候TCP处于半关闭状态,当客户端接收到服务端的回复后,进入FIN_WAIT_2终止等待2状态。

第三次挥手:服务器关闭客户端的连接,发送一个FIN报文给客户端,并且指定一个序列号,ack的值为u 1,此时服务器处于LAST_ACK最后确认状态,等待客户端回应。

第四次挥手 :客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w 1),且把服务端的序列值 1 作为自己 ACK 报文的序号值(seq=u 1,此时客户端处于 TIME_WAIT(时间等待状态)TIME-WAIT状态是为了等待足够的时间以确保远程TCP接收到连接中断请求的确认。

注意 :

这个时候由服务端到客户端的 TCP 连接并未释放掉,客户端需要经过时间等待计时器设置的时间 2MSL(一个报文的来回时间) 后才会进入CLOSED状态(这样做的目的是确保服务端收到自己的 ACK 报文。如果服务端在规定时间内没有收到客户端发来的 ACK 报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK报文给服务端)。服务端收到 ACK 报文之后,就关闭连接了,处于 CLOSED 状态。

这里解释一下需要等待2MSL的原因:

1、防⽌客户端最后⼀次发给服务器的确认在⽹络中丢失以⾄于客户端关闭,⽽服务端并未关闭,导致资源的浪费。
2、等待最⼤的2MSL可以让本次连接的所有的⽹络包在链路上消失,以防造成不必要的⼲扰。

如果客户端t直接closed,然后⼜向服务端r发起了⼀个新连接,我们不能保证这个新连接和刚关闭的连接的端⼝号是不同的。假设新连接和已经关闭的⽼端⼝号是⼀样的,如果前⼀次滞留的某些数据仍然在⽹络中,这些延迟数据会在新连接建⽴后到达服务端,所以socket就认为那个延迟的数据是属于新连接的,数据包就会发⽣混淆。所以客户端要在TIME_WAIT状态等待2倍的MSL,这样保证本次连接的所有数据都从⽹络中消失

为什么客户端需要TIME_WAIT状态:
假设最终的ACK丢失,服务端将重发FIN,客户端必须维护TCP状态信息以便可以重发最终的ACK,否则会发送RST(TCP连接出现错误),结果服务端认为发生错误。TCP实现必须可靠地终止连接的两个方向(全双工关闭),客户端必须进入TIME_WAIT 状态,因为客户端可能面临重发最终ACK的情形。

第二次握手打三个数字,n个人依次握手共握多少次(10)

为什么四次挥手,三次挥手不行吗

首先为什么握手是三次,而挥手是四次:

因为握手的时候并没有数据传输,所以服务端的 SYN 和 ACK 报文可以一起发送,但是挥手的时候有数据在传输,所以 ACK 和 FIN
报文不能同时发送
,需要分两步,所以会比握手多一步。

其次为什么三次挥手不可行:

因为服务端在接收到FIN, 往往不会立即返回FIN ,必须等到服务端所有的报文都发送完毕了,才能发FIN。因此先发一个ACK表示已经收到客户端的FIN,延迟一段时间才发FIN。这就造成了四次挥手。

如果是三次挥手会造成:
如果将服务端的两次挥手合为一次,等于说服务端将ACK和FIN的发送合并为一次挥手,这个时候长时间的延迟可能会导致客户端误以为FIN没有到达客户端,从而让客户端不断的重发FIN。所有只能第二次握手先发送ACK确认接收到了客户端的数据,等服务器发送完了数据,再发送FIN包进行第三次挥手。

用一个生活中的案例来说明

前提:假如你在外边玩,此时你拨通了妈妈的电话
1.你:“娘亲俺饿了,能给我做一份香喷喷的合罗面吗”

2.你的妈妈:“好,我现在准备准备,买买菜,等会做好了喊你”
。。。。。。家长做饭的过程。。。。。。
3.你的妈妈:“儿砸,饭做好了,该下面条了,什么时候回来呀”

4.你:“好嘞妈,你先下面条吧,我正在上楼”
( 。。。。最后,你吃上了香喷喷的合罗面,并表示:妈妈的味道。。。。)

通过此例子,第二个步骤和第三个步骤肯定不能合并,因为第二个步骤妈妈确定了,你饿了,但还没有做好饭,所有等饭做好了(数据发完了),才会通知你一切都准备好了。

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论

第二次握手打三个数字,n个人依次握手共握多少次(11)

上一页123末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.