为什么TCP连接需要三次握手,四次挥手?

一直搞不明白为什么TCP连接一定需要三次握手和四次挥手。现在终于想明白了。三次握手是为了建立可靠的连接。注意可靠这两个字。四次挥手是为了可靠的关闭连接,同样注意可靠这两个字。

下面分享一下我的想法和总结:

具体的三次握手和四次挥手的过程可以查阅下面的链接。

下面来说说“为什么”。

第一:为什么是三次握手,不是一次、两次、四次?

为什么不是一次?

如果一次就建立连接:那么客户端怎么知道服务端接收到了呢?

ok,我们假设一次握手就建立连接的情况,

  客户端向服务端发送建立连接的报文,然后不管服务端有没有收到报文信息,直接发送数据报文?这种情况可靠吗?答案肯定是不可靠的,类似与UDP。建

立连接的报文和数据报文到达服务端的时间无法确定,连接报文是否丢失也不一定。

服务端忽然收到一个数据报文会很懵逼。

为什么不是两次?

  由于网路阻塞,客户端第一次发送的连接没有及时到达,然后重新发送报文,然后建立通信,然后通信结束,然后第一次发送的报文到达了。然后服务端无端端的又激活了,但是客户端已经不需要在和服务端通信了。这种情况是不是浪费服务端资源?

所以两次也不可靠,为什么不是两次的原因下面的参考连接也有说。

为什么不是四次?

如果是四次握手:仔细看看第四次要做的是不是和第二次很像?其实非要说四次行不行?我觉得是行的,但是四次就冗余了,所以其实4次、5次、6次都是可以的,为了兼顾性能和可靠性三次就够了。第四次以后的握手已经可以用来传输数据了

为什么是三次?

因为三次握手刚好完成了两次一问一答的通信。说明可以建立全双工的通信了。

下面来说说,为什么是四次挥手?

 因为四次最可靠,最顺利。

客服端告诉服务端,我的数据发完了。你看看你还有没有数据要发给我,没有的话,我们的通信就可以断了。

服务端也告诉客户端,我的数据也发完了,我们一起关闭吧。 你看都顺畅,一点都没有冗余,也不用等待,大家都顺顺利利,愉快的快速结束。

我们来看看一次挥手行不行?

答案是行,其实0次都行。客户端和服务端都有重试和超时机制,如果触发了这两个机制,就会主动关闭。

应用层,也可以主动关闭tcp并且不发出通信信息。想想两台电脑同时断电了?是不是一次挥手也没有?但是连接已经断了。

所以实际情况0次挥手,1次挥手,2次挥手,3次挥手都是可能发生。超过四次的挥手就冗余了,不需要那么多次。

所以兼顾性能和可靠性,四次挥手是最合适的。1次、2次、3次都是不可靠的。

为什么A要先进入TIME-WAIT状态,等待2MSL时间后才进入CLOSED状态? 

解释是说为了保证B能收到A的确认应答。这一点我一直有点疑惑,等待2MSL的时间就一直能保证B收到应答了吗?我认为是不能的。

我们想象这个情况,A向B回复了应答,但是因为网络阻塞没有在规定时间内到达,然后B在向A发送FIN报文,巧了,因为网络阻塞,到达A的时间,超过了2MSL。这时候客户端已经关闭了。之前A回复的应答也因为网络丢包,消失了。

最后的结果就是客服端关闭了,服务端一直在等待直到超时,然后关闭。

所以我认为客户端等待2MSL时间,是为了尽最大努力确保服务端可以及时关闭。不是为了确保服务端一定可以及时关闭。这是一种取舍。在性能,效率,可靠性之间的取舍。

等待2MSL的时间可以在一定程序上减少服务端因为网络阻塞不能及时关闭的情况。

参考链接:

 https://www.zhihu.com/question/24853633/answer/254224088

https://www.cnblogs.com/zxpo/p/5234220.html

猜你喜欢

转载自www.cnblogs.com/liuyu7177/p/11428914.html