tcp为什么是三次握手而四次挥手

通信过程最重要的就是打成一致,而要打成一致需要的最小通信量就是关键,因为通信带宽是需要成本的。这是最重要的原因。

前提:信源与信宿是不对称的,也就是发送方可以到达目标,并不意味着目标可以到达发送者。

三次握手:

建立连接的关键就是原宿双方都要确定是否能到达对方,如果确认就可以建立连接套接字。

第一次握手:客户端发送过来,服务器收到后,对于服务器来说客户端可以到达自己,但是自己是否可以到达客户端不知道;而对于客户端来说,自己是否能到达服务器也并不知道。为了信息对等,客户端需要等待服务器的回应,而服务器需要发送响应包来看看自己是否可以到达发送者;

第二次握手:服务器发送ack数据包到发送者;当客户端收到包后,对于客户端说明服务器跟自己是双向都通的,这是客户端的信息齐活了;但是服务器并不知道自己的包客户端是否收到了,所以就产生了第三次握手;

第三次握手:客户端发送ack+2到服务器,服务器收到这最后一个ack包后信息就对称了,就可以建立连接socket了。

但是为什么要四次挥手呢?

这就是安全关闭的需要,因为,信道是不可信的,需要确认通道中双方发送的数据包都对等了,才能关闭,我们详细解构下:

任何一端都可以发起关闭;我们就从客户端发起说起:

第一次挥手:客户端在发送完最后一个数据包后就想,我done了,想退出,发个fin的包给服务器吧;这是第一次挥手;这个包有两个含义:1、表明自己要中断连接了,2、标记了最后一个包的id;潜台词就是,这是我最后一个包,如果之前的包都收到了请关闭连接,如果没收到我等你发重传的信号;看,这多靠谱!

第二次:服务器接收到请求后,明白客户端想退出,并知道客户端发送的最后的数据id;这时,服务器就要做两件很重要的事情:1、告诉客户端自己收到了中断连接的请求,2、检查包的完整性;这时,服务器会马上发送一个fin ack给客户端,告诉他,你等着,我检查下包是不是都收齐了哈,一会儿给你答复;

第三次挥手:服务器检查后,嗯,收齐了,同时,服务器已经收齐了所有数据包,所以可以清理内存了;当然也可以告诉客户端中断连接了,也不能让客户端等太久,于是主动发送fin的请求包给客户端;

第四次挥手:客户端收到后,好嘞,没白等,总算是包对等了,关了吧,拜拜,发送了最后一个fin ack给服务器,然后自己就清理内存去了。


分享到:


相關文章: