一、知识点介绍
1.什么是三次握手?
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
本质:是确认通信双方收发数据的能力 。
2.什么是四次挥手?
建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。TCP 的连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务器均可主动发起挥手动作。
本质:目的是关闭一个连接。
二、三次握手和四次挥手的过程:
1.三次握手的过程:
- 第一次握手: 首先是客户端向服务器发送了报文
这次的握手是具有重大意义的:它说明了客户端它的发送能力是正常的- 第二次握手:然后服务器端接收到了客户端向它发送的报文,并且也同时向客户端发送报文
这次的握手也很重要:它说明了服务器端自身的接收能力和发送能力都是正常的- 第三次握手:客户端再一次向服务器发送了报文
这次的握手依旧重要:因为证明客户端的接收能力正常
那有的同学可能就有疑问了,为什么最后还要在握一次手?不纯纯多余嘛...
漏漏漏,大漏特漏。我的好基友, 让我这样解释给你听:
首先你想想,当你给你的女朋友发了条消息问她在不在(相当于第一次握手)
然后你的女朋友看见了,她收到了你的发出的消息,也同时回了你的消息(相当于第二次握手)
很快你也收到了她回的信息,但如果你长时间不再发一次消息,她就不清楚你到底看没看到她给你发的信息,让她一直等,那她就很生气,那你就得完蛋。(相当于第三次握手)
就是这样,基友们你们懂了吗?没懂可以去找女朋友试试,如此你就会有深刻印象。
说专业点就是:
当客服端和服务端进行通信,客户端发送了一条消息,到达了服务端
对于服务端而言,服务端收到了你发送的内容,同时向客服端发送确认。
对于客服端而言,如果客服端不理睬服务端的这个确认,那么服务端则会一直等待客服端的消息。
这就导致了服务端的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,
这就是为什么不能两次握手的原因了
图示为三次握手
2.四次挥手的过程:
- 第一次挥手:
客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态- 第二次挥手:
服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态- 第三次挥手:
客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。- 第四次挥手:
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,四次挥手完成
那看到这里依旧有人想问,为什么连接时只要三次,而断开连接时却要四次???
那我再用男女朋友那点事来告诉你,首先你设想这样的场景:
你和你女朋友今天相约一起出去玩,那玩肯定会有个结束。约完会了肯定要各回各家,各找各妈 要互相再见吧!
哈哈哈哈,那重点来了,
你:再见宝贝,你回去吧(第一次挥手)
女朋友:好的宝宝,那我走了(第二次挥手)
女朋友:那你也回去吧宝宝(第三次挥手)
你:好的,那我走了,拜拜宝贝(第四次挥手)
就是这样,就像和女朋友说拜拜时那样的不舍。
图示为四次挥手