TCP的三次握手和四次挥手

Posted 勤奋的年轻人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP的三次握手和四次挥手相关的知识,希望对你有一定的参考价值。

前言

我们假设两个人隔一扇门进行沟通,肯定不会一上来A就噼里啪啦讲一堆话,在正式开始对话之前,肯定要先进行确认门后是否有人。那我们思考要进行怎样的步骤才能最小化的进行确认。
同样在沟通之后,我们结束了,假设沟通很重要,要保证完整性,那要怎么样进行礼貌的离开呢。
这就引起了我们对于tcp的三次握手和四次挥手的概念了。

TCP三次握手

正常来说如果A找B,B一般都会在门后等着(需要先Listen),当然也可能不在(资源不够,在处理其他的事情)。这个时候A说你在吗,结果B不在(各种原因,导致丢弃),然后A又说你在吗(重试),这个时候B事情忙完了,发现有人找他(第一次握手),就回答我在。回答完的时候,B就要在门后等着了,A可能没有听到,B又回答我在了,A终于听到了(第二次握手),这个时候A回答我也在了,B听到A的回答(第三次握手),就完成了正式交流前的确认工作。
那我们分析一下过程:

整体的三次握手简单描述就是这样,三次简单的沟通之后,就开始的交流,这个时候就进入了连接状态。
我们画一下tcp的三次握手的示意图:

真实情况可能会更复杂,整体过程和上面的描述差不多。不过要注意几点:
1、任何情况下都可能因为网络或者资源的问题导致接收失败,或者主动丢弃。
2、第三步,有可能Sever没有资源或者网络问题,并没有收Ack,这个时候会Server会重试2步骤

不过上面都好理解,重试的机制可能受不同的环境和配置影响,可能会很长,重试次数也有限制。

我们简单描述一下整体的过程:
1、Server通过Socket、bind、listen等方法,进入等待连接的状态
2、Client发送SYN给Server
3、Server接收到客户端发送的SYN请求之后进入SYN-RCVD状态
4、Server发送SYN+ACK给Client
5、Clinet接收到SYN+ACK,发送ACK给Server,进入可以传输的连接状态
6、Server收到ACK,进入可以传输数据的连接状态

四次挥手

我们又回到上面隔门相望的例子中。交流是双方都在表达自己的想法。那么需要双方都要说我没话说了,这个时候才能进入断开状态。A对B说,我没话了,B回我知道了。B对A说我没话了,A回我知道了。整体的过程简单描述就是这样。我们进入示意图:

用我们的Server和Client替换之后如下:

有一些需要注意的事项:
主动关闭的一方发送FIN,可能是Server端,也可能是Client端。由于Server和Client都可能主动断开,我们就以主动方和被动方表示。

整体过程的描述:

1、主动方发起FIN给被动方,自己会进入到FIN—WAIT状态
2、被动方接收到FIN之后,发送ACK给主动方,进入CLOSE-WAIT状态
3、主动方收到ACK之后进入FIN-WAIT2状态,等待被动方的关闭指令
4、被动方发送FIN给主动方,同时进入LAST-ACK状态
5、主动方接收到被动方的FIN会发送ACK给主动方,同时进入TIME-WAIT
6、被动方接受到ACK之后会进入CLOSED状态。

由于大家再工作中会经常看到TIME-WAIT,下个章节我们会重点讲一下TIME-WAIT这个状态。

(有谁知道图片怎么缩小,麻烦和我说一下,排版很难受)

以上是关于TCP的三次握手和四次挥手的主要内容,如果未能解决你的问题,请参考以下文章

揭秘——TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

一文搞懂TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

关于TCP的三次握手和四次挥手及其衍生问题