TCP很经典的一个问题,就是三次握手和四次挥手的问题,这也是一个高频的面试题,所以掌握这个知识点至关重要。看了网上的一些文章和公众号,我这里做了一个小小的总结和个人的理解,本人才疏学浅,难免存在纰漏,如果发现有错误的地方,欢迎指出。
首先需要知道的内容是:
三次握手:建立连接
四次挥手:关闭连接
SYN:同步连接序号,SYN=1(请求建立连接);
ACK:请求/应答状态,ACK=0(请求状态),ACK=1(应答状态);
FIN: 结束连线,FIN=0(结束连线请求),FIN=1(结束连线)。
一、三次握手
比喻篇:
TCP的三次握手可以想象成男生女生表白,这里做一个比喻男生(客户端)、女生(服务端)
1)男生送消息给女生,告诉她,我喜欢你,可以做我女朋友吗? (第一次握手,男生——>女生)
2)女生回复男生,我收到了,其实我也喜欢你。(第二次握手,女生——>男生)
3)男生收到回复,告诉女生我会爱你一辈子。表白成功,双方在一起。(第三次握手,男生——>女生)
通过上面例子,可以得知,男生和女生都知道要表述的意思已经传达给双方,并且收到了反馈意思,最后成功在一起。同理,三次握手的目的是为了确认客户端和服务端的收发功能是正常的,因此可以建立连接。
专业篇:
刚开始客户端和服务端都是处于关闭的状态,而且服务器 B 端一直处于监听的状态,时刻监听是否有建立连接的请求,接下来开始握手:
上面是整个三次握手的过程,现在我们分析一下为什么三次握手可以可靠的确定客户端和服务端都能支持的发送和接收数据。
第一次握手:第一次握手是客户端发送同步报文到服务端,这个时候客户端是知道自己具备发送数据的能力的,但是不知道服务端是否有接收和发送数据的能力;
第二次握手:当服务端接收到同步报文后,回复确认同步报文,此时服务端是知道客户端具有发送报文的能力,并且知道自己具有接收和发送数据的能力,但是并不知道客户端是否有接收数据的能力;
第三次握手:当客户端收到服务端的确认报文后,知道服务端具备接收和发送数据的能力,但是此时服务端并不知道自己具有接收的能力,所以还需要发送一个确认报文,告知服务端自己是具有接收能力的。
当整个三次握手结束过后,客户端和服务端都知道自己和对方具备发送和接收数据的能力,随后整个连接建立就完成了,可以进行后续数据的传输了。
看到这里,如果大家理解了就会知道很明显,两次握手是不行的,因为服务端并不知道客户端是具备接收数据的能力,所以就不能成为面向连接的可靠的传输协议。就像我们上面提到的打电话的例子,也是为了双方能够正常的进行交流,只不过我们现实生活中不会那么严谨,并不是每次都这样,但是程序是不一样的。
二、四次挥手
比喻篇:
TCP的四次辉手可以想象成男生女生分手,这里做一个比喻男生(客户端)、女生(服务端)
1)男生送消息给女生,告诉她,我不爱你了,我们分手吧! (第一次挥手,男生——>女生)
2)女生回复男生,我还爱着你,我不要分手【进入冷战期】。(第二次挥手,女生——>男生)
3)女生发消息给男生,我想了很久,觉得还是分手吧,好聚好散。(第三次挥手,女生——>男生)
4)男生收到消息,告诉女生我知道了,对不起,不是你不好,其实是我配不上你。分手成功,双方关系结束。(第四次挥手,男生——>女生)
通过上面例子,可以得知,男生和女生都知道要表述的意思已经传达给双方,并且收到了反馈意思,最后成功分手,关系结束。同理,四次挥手的目的是为了让客户端和服务端双方都知道自己要关闭连接了。
专业篇:
第一次挥手客户端发起关闭连接的请求给服务端;
第二次挥手:服务端收到关闭请求的时候可能这个时候数据还没发送完,所以服务端会先回复一个确认报文,表示自己知道客户端想要关闭连接了,但是因为数据还没传输完,所以还需要等待;
第三次挥手:当数据传输完了,服务端会主动发送一个 FIN 报文,告诉客户端,表示数据已经发送完了,服务端这边准备关闭连接了。
第四次挥手:当客户端收到服务端的 FIN 报文过后,会回复一个 ACK 报文,告诉服务端自己知道了,再等待一会就关闭连接。
三、疑问
转载请注明:路飞博客 » 通俗易懂的理解TCP 三次握手 四次挥手