为何TCP链接须要三次握手,四次挥手?

一直搞不明白为何TCP链接必定须要三次握手和四次挥手。如今终于想明白了。三次握手是为了创建可靠的链接。注意可靠这两个字。四次挥手是为了可靠的关闭链接,一样注意可靠这两个字。html

下面分享一下个人想法和总结:网络

具体的三次握手和四次挥手的过程能够查阅下面的连接。tcp

下面来讲说“为何”。性能

第一:为何是三次握手,不是一次、两次、四次?htm

为何不是一次?blog

若是一次就创建链接:那么客户端怎么知道服务端接收到了呢?资源

ok,咱们假设一次握手就创建链接的状况,io

  客户端向服务端发送创建链接的报文,而后无论服务端有没有收到报文信息,直接发送数据报文?这种状况可靠吗?答案确定是不可靠的,相似与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

相关文章
相关标签/搜索