「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
前言
TCP在现如今面试中已然是常客,常听面试官问你:知道TCP吗?知道TCP连接为什么要三次握手吗?那四次挥手呢?虽然答案我们都有大致的了解过,也默默的在一次次面试中,知道了要怎么回答这个问题,可是我们真的了解TCP吗?今天就让我们从重新认识TCP的三次握手与多一次挥手(四次挥手),相信在文章结束的时候,你下次可以反问面试官,你真的了解TCP吗?(狗头保命)
TCP的前世今生
在MDN上,关于TCP的定义如下:
传输控制协议(TCP)是主要的网络协议之一。它使两台主机能够建立连接并交换数据流。
TCP 能保证数据的交付,维持数据包的发送顺序。
TCP 在1970年代被两位 DARPA 的科学家 Vint Cerf 和 Bob Kahn 所设计出来,他们当时被称为互联网之父。
复制代码
从上面的定义上我们发现几点:
- TCP是作为网络协议的一种
- TCP连接两台主机并交换数据
- TCP传输的数据有一定的顺序
TCP—传输控制协议
TCP全称是Transport Control Protocol,是一种主机到主机的连接导向协议。什么是主机到主机呢?也就是我们的两个设备之间,包括但不限于PC,手机,平板电脑等。而且TCP是一种支持全双工的协议,什么是双工呢?就好比我们的一条路有来回两条道,而相对应的,单工就好比是我们的单向道,只能从这端到那端,所以,在双工的支持下,我们的两个主机之间就能相互发送消息了。
那么说了这么多,现在我们知道了TCP实际上是一种连接,能够为应用之间的通信提供桥梁,那么我们为什么会使用TCP呢?使用TCP又有什么好处呢?实际上,TCP的传输有很强的可靠性,为什么这么说呢?因为这就是我们需要掌握的三次握手和四次挥手的保证,也就是无损传输,每次发送的包都有序号,收到后需要给一个反馈,如果超过一定的时间没收到反馈,就会重发,直到收到反馈为止。
TCP—三次握手
终于到了三次握手的环节了,如果没有听过的同学肯定会很懵逼,啊,三次握手,握手么握个一次就好了,干嘛握三次?这么友好,这么客气吗?没错TCP就是一种我们上面说道的可靠的协议,因为每次发送数据前,我们首先需要建立连接,而连接的建立又有TCP自身需要携带的参数,比如建立连接的时候,一方应用发起连接需要带上SYN;而接收方如果要表示收到信息了,回馈的时候要带上ACK;如果需要向另一方推送数据的话,又被称为PSH;如果一方需要断开连接,那么就要发送FIN,我们来看一下下图,可能就会好理解了:
从上图我们就可以看到我们刚才提到的SYN,ACK等,那么它到底是什么作用呢?
两个应用之间需要建立连接,首先A会发送一个消息给B,携带一个SYN以及seq=x,然后B收到后回复表示收到了,并携带一个seq以及ack,这里的ack作为回复上一次发送过来的消息,会在x的基础上加1,表示回复的是这条消息,并将这次回复过去的消息也会带一个seq=y,A收到消息后,再回复一个好的,seq和ack和上述表示的一样,至此,A与B之间就完成了三次挥手建立了连接,双方都能发送和接受消息了。
不理解?没关系,看了下面小明与女神的故事你就明白了。
小明先向女神发起了邀请,但是女神没有回复他,他过了一段时间发现没收到消息,他就重新发送了一遍给女神,女神这次收到了,并委婉拒绝了他,小明表示知道了,至此,小明和小红就聊上天了,作为女神的忠实粉丝,必定不会放过和女神聊天的机会!
TCP—四次挥手
说完了三次握手,我们再来聊聊四次挥手,挥挥手不带走一片云彩~,对不起,不自觉就接上了。说回正题,TCP断开连接为什么要四次,整个过程其实是和三次差不多,首先是A向B表示,我要断开连接了,B表示我知道了,然后B再发送我要断开连接了,这是最后一条消息,A最后发送回一条,已经确认是最后一条消息,断开连接,我们看一下下图:
如图所示,我们发现A发送了一个FIN结束信息给了B,seq=u,B在处理完自己手头上的请求之后回复A表示你刚刚的结束消息我收到了,我手头上的事情已经处理完了,对应的seq为u+1,然后B也发送一个FIN标志给A,表示我要断开连接了,seq=w,最后A表示已经收到你的结束标志seq为u+1,然后B断开连接,A等待一段时间没有收到B的消息后,断开连接,至此A与B的通信就结束了。
是不是不明白,没关系,小红和小明的故事也要收尾了。
小红找到了自己的富家公子,自然要甩掉小明,就跟小明说了再见,并发了好人卡,小明难受的表示我接受了,然后最后一句祝福了小红,小红一边表示你也是,一边想着终于甩掉了一个备胎,哎,我这该死的魅力!
总结
至此,小明和小红的故事就结束了,对了,这里要特别强调一下,图中小明与女神的故事,仅仅只是用来解释三次与四次之间主机与主机的关系,这已经属于应用层的会话了,而不是传输层的连接,大家不要搞混哦。我们的TCP的认识也结束了,相信经历了上述图文的描述,你一定对TCP有了深刻的印象,如果记不清了,想象小明的经历,相信会提示到你,下次面试的时候,如果面试官问起了TCP,我们就给他讲述一个小明的故事,动之以情,晓之以理,相信面试官会被你打动,成功拿下offer!