三次握手与四次挥手
分类:
文章
•
2024-03-18 22:03:46
(1)三次握手是怎么个意思?
三次握手的是为了是建立可靠的通信信道,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。
这个三次握手只能是客户端去发起,服务器端接收确认的。正常来说服务器是一直在监听的,客户端上线后去请求服务器端,然后通过Tcp协议进行连接。没见过哪个服务器一直不停地去询问客户端:你上线没?你上线没?要不要建立连接~~
第一次握手:Client什么都不能确认;Server确认了对方发送正常(因为Client不确定自己是否真的发出去了,只能是我发了,希望你能收到。Service端接收到信息后表示,Client发送是没有问题的)
第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常(这时候Server还不确定是否自己发送正常,也不能确定对面接收正常,所以就需要继续握手了)
第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常。
然后大家都正常了,三次握手就完毕了,接下来就开始发送数据了。

上面这个图就是具体的要求了,值得说的一点就是两边用的协议就是TCP协议。服务器端一开始不知道对面用的什么协议,没准是客户端乱发的什么东西,然后通过三次握手,就知道对方是不是TCP协议了。(类似的就是你跟一个人说话,你我不喜欢吃鱼翅,对方如果回:吃那干啥,再卡住嗓子了,那就是他压根跟你不一个频道。)
四次挥手:
首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,这里客户端、服务器端都可以发起。 这里用客户端发起的例子说明。
(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。(意思是:客户端除了确认信息以外不给服务器端发送别的数据了)
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。(意思是,服务器知道了,服务器也不接收客户端除了确认信息以外的东西了)
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。(意思是服务器也没什么要发给客户端了了。服务器除了接收确认信息别的都不干了,这里要注意:客户端接收到这条信息后会进入TIME_WAIT状态,这是为了防止自己发送的确认信息丢失,服务器端会再重新发送一次刚刚的信息。这个2MSL(最大报文段生存时间)保证了服务器端重发的数据到客户端,如果这个时间过去了,还没接到服务器重发的确认信息,那么就是说服务器端已经收到了自己发送的数据,客户端就可以关了)。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。(服务器接收到后就关了,不会再确认了)

为啥握手需要3次,挥手就要4次?
说白了就是:握手的时候服务器端二次握手的时候其实是确认了两项:服务器既能收到,又能发送,而挥手的时候就是要拆开说了。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,
收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。
这里有一个问题,如果谁知道可以告知一下,问题是:
假如第三次挥手完了,也就是客户端进入到TIME_WAIT的时候,这时候客户端突然网断了,服务器端会怎么做?
它是否会去一直等待客户端发送的ACK,还是用别的方法关闭掉自己?比如心跳检测~
https://blog.****.net/stpeace/article/details/44162349