目录
在学习物联网通信过程中,时常会听到一段话“三次握手,四次挥手”,基于其中的含义与理解是否清楚呢?本文将着重记录一下自己的理解,若有不对还望大家指点!
1.三次握手
1.1 三次握手与流程图
我们都知道,在通信建立过程中,服务器是不会主动发起连接的,所以作为主动方的客户端将会发送一个SYN包给服务器,请求连接,当服务器接收到SYN包时则会回应一个SYN+ACK包给客户端,表示同意建议连接,此时的客户端收到服务器发来的包会再次向服务器发送一个ACK包,告知服务器客户端已经收到了它的消息,自此建立连接成功,具体如下流程图演示;
*注:ACK包的发送,即连接的建立应在accept返回之前,图示此位置有误;
1.2 两次握手与流程图
三次握手以后可能有这样的疑问,客户端发送连接请求后,服务端也告知同意了,为什么要“多此一举”发一个ACK包呢,两次握手不就够了吗?那现在我们来谈谈两次握手;
当没有ACK包,会出现什么情况呢?举个例子,客户端是员工,服务端是老板,早上员工在大山里监工,发消息给老板请求打款,员工说:“老板,打20万到xxx账户,钱不够”,老板说:“我明天早上十点叫财务给你汇款,你去给我办个事xxx”,但是当时信号不好,可能员工没听清回答,就会一直等待老板回复,这样是不是就不是很人性化呢?又或者是员工收到信息后直接不回复了,那老板是否会心里想,山里信号不好,员工到底收没收到呢,老板也会在等待员工去做另一件事;又或者是,员工发第一条信息的时候,没发出去,这时候员工又再发了一条,老板分别在早上和晚上收到了这两条消息,是不是就以为是一共需要40万,员工多收到的钱当作奖金了怎么办,这样信息传输的可靠性就大大降低了不是吗?假若这个时候,员工收到消息后回一句“后面消息延迟老板别理采”,是不是就不会有这样的误会啦;
1.3 两路握手与三路握手的比较
由上面的分析可以看出,三次握手在保证传输可靠性的前提下实现了最少通信量,节约了资源也很可靠。
2.四次挥手
有了上述三次握手的理解,再来理解四次挥手就简单许多了;
2.1 四次挥手详解与流程图
不同于三次握手的主动方(客户端)与被动方(服务端)区别,断开连接可以由任意一方发起,以下以客户端发起断开连接请求为例;客户端首先向服务端发送一个FIN包请求断开连接并进入终止等待1状态,此为第一次挥手;服务端接收到消息后回复一个ACK包表示收到信息并进入关闭等待状态,此为第二次 挥手;紧接着由服务端发送一个FIN包告诉客户端“我要断开连接了”,而后静茹最后确认状态,此为第三次挥手;若此时客户端接收到服务端发来的FIN包则会再回复一个ACK包,表示收到,之后进入超时等待状态,收到ACK包的服务端则“立即关闭连接”,客户端在等待时间内未收到消息则关闭连接,此为第四次挥手;
(1)第三次挥手的最后确认状态有什么意义呢?
————就比方说某位同学作为班长,经过办公室的时候老师给他说:“班长,你把xxx同学叫来办公室一下,他妈妈找他有急事”,然后班长就去了,可老师左等右等,盼星星盼月亮xxx同学还是没来,那这个时候就不闻不问了吗?那肯定是不可能的,恰好班长再次过来,老师是不是还会让班长去叫一遍xxx同学呀,服务端就是如同老师,班长就是FIN包,xxx同学就是客户端,服务端给客户端发了FIN包,未见回复ACK包,是不是就不知道是不是客户端没有接收到消息呢,进而会重发FIN包;
(2)那什么是超时连接呢,有什么必要呢,少几次挥手可不可以呢?
————超时连接就是,设置一段时间,在这段时间内,客户端未收到服务端所发来的信息,就会断开连接了,同上述,当客户端发送一个ACK包后,倘若服务端收到,就会立即断开连接,那么就不会再给客户端重发消息,没有消息自然客户端就知道服务端已经关闭连接,那自己也关闭连接了;好比班长回来说xxx已经和他妈妈见面了,这样老师就不会再派班长去找人了,xxx同学也不会收到老师的召唤了;
3.总结
以上就是我对三次握手和四次挥手的理解与总结,作为一种笔记也作为一种分享,有不同想法可以在评论区积极提出来呀,我会多多改进!