网络-四次挥手

之前有写过建立连接的时候使用的方法为三次握手,现在描述一下断开连接的方法:四次挥手。
图示如下:在这里插入图片描述

其中:FIN为终止标志位,断开连接时有效;ACK:确认标志位,收到对方的数据包,用于通知对方已收到; seq:序列号;ack:确认号;序列号和确认号之间的依次+1就保证了数据包传输的完整性,如果中间有丢失数据包,能够通过序列号和确认号之间的关系找到是哪一个数据包丢失。

可以形象的记忆为:客户端需要断开连接,就发送一个数据包(FIN = 1:断开连接,ACK = 1:确认收到你之前的数据包,seq = u:我的序列号),发送完成之后客户端的连接就断开了;服务器收到之后回复一个等待数据包(FIN = 0:先不断开,我没有准备好,ACK = 1:确认收到你的消息,seq = v:我的序列号,ack = u+1:上一个数据包中对方的序列号+1 ),之后服务器就进行断开的准备,准备好之后再次发送断开连接的数据包(FIN = 1:断开连接,ACK = 1:确认收到你之前的数据包,seq = w:我最终的序列号,ack = u+1:上一个数据包中对方的序列号+1 ),发送完成之后服务器就会断开连接,服务器在收到消息之后会发送数据包( FIN = 0:因为已经断开了,不能再此置1 ,ACK = 1:确认收到你的数据包,seq = u+1:我的序列号,即上一个数据包中对方的确认号,ack = w+1:上一个数据包中对方的序列号+1),但是最后一个数据包没有已经连接,客户端不会管服务器是否收到。反之亦然。

思考:四次挥手能不能三次挥手结束?
通过形象记忆可以知道前面的三次挥手都是不能忽略的,那么问题就转换为最后一次挥手能不能省略了,答案是不能省略,虽然说最后一个数据包已经没有了连接,但是也是很重要的,如上描述,如果客户端没有发送最后一个数据包,在下一次需要连接的时候,服务器会处在等待的状态(虽然没有连接,但是最后一个数据包可以理解为广播包),这就和建立连接的步骤不相符,因为服务器在等待最后一个数据包的确认,而现在发过来的数据包没有确认信息,这就会出错。

那为什么最后一个数据包需要等待两个数据传输周期呢?
因为最后一个数据包可以理解为广播包,有了两个数据传输周期之后就能够确认传输途总已经没有最后一个数据包信息了,就可以去重新创建新的通讯通道。这是个人观点,不喜勿喷。还不清楚的小伙伴可以添加我的个人微信 lqy—1997 (中间是三个英文的杠)进行交流。

发布了31 篇原创文章 · 获赞 52 · 访问量 8866

猜你喜欢

转载自blog.csdn.net/yuanbaba_123/article/details/104248228
今日推荐