00:01
大家好。欢迎大家继续收看上硅谷的Linux云计算课程,我们这节课继续来学习面试题,那我们来看网络基础类面试题的这个第二类第二个题。那这个其实是说简述TCP3次握手的过程。那我们前面已经说过了,我们在讲这个这个OS赛模型,我们说77B是这样的,A问B说你在吗。他说我在啊,我要跟你通信才发现三次握手对吧?但是如果面试题真要问你这样的东西,你就不能这么简单的描述一下,说这个过程就是这样了,不行,他肯定问的就是具体的底层原理了。这个其其实出现的几率非常高,那不光有三次握手,还会有四次挥手就结束的过程,我们后边待会儿我们来说这个四次挥手,那这个过程我们就要来这个详细来学习一下,那这里考察的还是TCP协议的原理和它的作用。
01:02
那这种底层原理其实不是太好背,也不是太好理解啊。那首先这传输层的两个协议,这个名字,包括它的基本的优缺点,其实我们都讲过了,这个把它背下来。好了,那我们来看看TCP包头的这样的包头格式,那上面这个数。指的是二进制位数,也就是说包头这一行是32个二进制位,从零开始计算了那端口,原端口和目标端口各是16个二进制位,也就是拥有二的十六次方,所以所以端口数是65535个。那接下来下面这两个序列号。和这个确认号序列号也叫SEQ号,这个我们待会记一下,待会儿我们讲原理的时候会说它。那确认号叫AP号,这两个号就是用来干嘛进行我们TCP3次握手,或者是TCP4次挥手这样的过程的,这个互相确认的,也就是说。
02:04
A和B之间要告诉他,我问你在吗?你是不是要回复我在他就是靠这俩号来进行来进行什么加减,在这个原有的号上面加一,然后回复告诉给他,诶。这个A给B发的时候,A的seq号是随机的。诶,32个二的32次方,42亿9000万重叠的可能性几乎没有对吧?那B怎么能告诉A我收到了你的信息呢?简单把这个SE qq号给它加一。然后给A再发回去,哎,那我问你A这个SEQ是A自己发出来的,虽然是随机产生的。那A知不知道这个SEQ是多少呢?当然知道,这是我发给你的吗?那B在上面加个E再发回来,那是不是就告诉A,哎,哥们,你这个信息我收到了,我给你做个小标记,你看到这个标记就证明我收到了,对吧?那我们就说它的位数,因为非常大。
03:03
所以呢,重复的可能就恰巧刚好碰到回复了这个信息加了一可能性几乎没,所以我们其实就通过这两个序号来确认这个东西到底是这个啊,如何来进行这个这个沟通的啊,我们通过它待会儿来具体看过程。接下来这里有六个标志位。六个二进制位,这里要不然就是零,要不然就是一对吧,每个标志位都可以选零还是一,那这六个标志位当中,哎,我们这里看一下它的作用,这里说了这两个序列号的作用啊,SEQ是发起访问的时候起作用,AC序号是回复访问的时候起作用,OK,那这六个序列号其实真正起作用的对我们四次这个。呃,三次握手和四次挥手,真正起作用的是这三个标记,一个是A标记。那也就是说一个是syn标记这个区别a syn是发起访问的。A是回复访问的,而fin是终止访问的,这仨标记,换句话说啊。
04:06
如果syn发过来这个标记位这里是一证明,也就是说A给B发的第一个包,他的这个标记SY位就应该是一证明。A告诉B说,哥们,我要跟你聊天了。那B给A回复的呢?AC这里就应该是一,其他的都是零。哎,证明哥们儿,我收到了,你要跟我聊,那咱就聊呗,来证明这个事儿。那如果是要是终止连接呢,A2跟B终止连接,那这两个位其实就是都是零,然后in这个位是一,那也就是说这每个标记六个标记六个二星之位,只有零和一两个状态可以选,如果是一,代表我要跟你发起这个标记标志的这个连接了。那其他的这几个标记呢,我们一般都用不着,我们就只需要知道这仨标记就可以了。各位SY,我们也把它叫信啊信包啊,注意只要说信包指的就是发起连接包啊。
05:06
好。那我们来看看三次握手的具体过程啊,那我们就说这个事儿,你就不能说是,诶哥们儿,我要通信,你要在吗?这个不行了,他要真要是考试的时候。面试题里问的这样,他问的就一定是这样的一个具体原理,那我们来看一下。那客户端也就是A要想跟B发起连接,比如说我要对它进行外部访问,各位,我们互联网上绝大多数访问都是GCP的啊,只有一些什么实时性的聊天工具呢,一般是udp的啊。那这个时候A会给。B发送一个包,发出来的TCP包头,它的这个syn标记是一,注意这里啊,这个地方指的是它的标志位。也就是这里。SY是一,标志是一,而后面这个AC这块有可能这里也是一,后面说A这A信号这个指的是序号。
06:02
为啥这里有时候写写不太像,所以我可能都是写的AC怕你搞混,那我们说前面这个是标记,就证明A给B发,这里标记是E。假设它的序列号是这,因为这是随机的,随机生成了一个32位的这个序列号,也就是这个。号假32位了,我假设我设为它的变量等于这对吧,那A给B发过来给B。发过来。发完这个包之后,A的状态就会变成信sent,就是我发起了信包,我的状态是这个。各位。我们都知道啊,我们可以通过net state命令net。State网络状态命令杠A来查询我们所有的网络连接,对吧?如果你的电脑是台真正的服务器,它的访问连接可能有可能很多,那这个时候你有可能就会抓到这样的,除了S历的这个正常连接之外,有可能就会抓到这样的段。
07:02
这就证明有人正在跟你进行三次握手连接。所以。这个时候A发完这个包之后。他的状态是SSN就等我发出去了,等着你回复我呢。那B收到了这个包之后呢?他会怎么办?他会一定要回复A,回复的时候怎么办?他需要让A来知道,我是接收到了你的请求,我是响应你的。而不是我自己主动连接你的,对吧,所以。B回复的这个包的包头里面,它的信号syn和A都是一。S是发起请求连接了对吧,那这里代表AK代表我是回复你了。其次呢?他会给他的序列号。把它把这个序列号,当时A发过来的这个序列号保存在ACK序列号里,变成J加一,给他加一啊,就是我说的,你给我写了封信,我偷偷摸摸上面,在上面点个点,我们俩约好我在哪个位置点,你只要看到这个点,就证明我收到信了,就这个意思,但是我需要把它保存在AC号里,诶回来再看看包头啊,也就是说。
08:15
A发过来的时候,他的这个J号写在这里。B回复的时候呢,他会把这个J号写在这儿,然后给它加一,然后给他返回回去。那为啥要这样呢?因为。B回复的时候,B自己也需要有一个SEEQ序列号,为啥?这里假设是K,为啥?因为什么?我不光必要告诉A说,我收到你的信息了。你是不是还得告诉我,你也收到我的信息了?所以我是不是还要把我的Q号给他,等他再回复我的时候。当然,我这个东西一旦发过来,B在回复之前,它的状态就已经变成establish。这个单词的意思代表连接已经建立,我们之间就是A认为它和我的连接已经完成了,但是他现在需要让B也知道连接完成,对吧?所以它继续回复,把标记变成A,然后把AC这个序列号变成K加一,也就是之前的这个加一。
09:16
诶,那s seq就无所谓了,当然也还有啊,就是随机一个已经不参与运算了,对吧,只是B现在一看一收到一看,哦,A是我的,之前发出去的这个K后面加了一证明这哥们也收到了,那我们之间连接建立,我们俩的状态就都会变成s establish。连接建立,我们就可以正常通信了。这是三次握手。各位。这个题我们说肯定要比我们之前讲。简单的,这个简单聊一下,它的基本原理,可能要复杂。但是我也说。考了三次握手还真不是太少见,这个东西我还是说网络底层基础知识啊,对任何工作来讲,只要是计算机类的,只要是和互联网相关的,它都有这个需求,所以各位这个图,它整个描述过程,你可能在。
10:13
记下来,然后还要能用你自己的语言来复述出来。那我后面详细写了它的这个过程。其实就是我前面讲的这个过程,OK,那我其实说啊,超课上课的时候呢,一般很讨厌出现这样大段的这种文档,那这个文档我不会念,那给你的目的其实是为了让让你做一个参考,其实他就是我前面说的这个过程,对吧,那讲一遍不一定能好记下来,那我怎么办?我把它整理下来,你这边参考这个图。参考这个笔记,你就容易理解一下好了。这是TCP3次握手的过程,可以吧,那类似面试题。简述TCP包头的内容,哎,各位之前我们已经看过了,对吧,TCP包头。
11:03
我们因为要讲这个三次握手嘛,包头我们是不是都要知道一下对吧,那像他这样的数据偏移啊,窗口啊,这个都窗口基本用不着校验,就是用来做插座校验的,A给B发过来。A给B发过来,A把校验盒写在这里,B呢,收到之后再校验一遍,和这个和对比,如果两个一致,证明这个数据包没问题,如果不一致,证明报错了,那如果是TCP协议,TCP协议B就会要求A重传。那如果是UGP协议,他们之间没有连接,那这个时候他就会把这个包丢了啊,这就是交验盒的作用。那后面就是他发送的真正数据,那这个选项是可选的,现在直到目前为止都是空白的,没有什么作用啊。好,这就是包头的作用。这是第一个这个扩展面试,第二个就是四次挥手的过程,那我们来看看这个比刚刚那个还要复杂一点,啥意思?
12:02
A和B传数据。对吧。我不能总跟你在那聊吧啊聊聊聊聊完了是不是就该就该拜拜了对吧?挥手拜拜对吧?我不能总跟你没事儿就瞎腻歪着对不对,我你又不是我女朋友啊不,就算你是我女朋友,也不能一天到晚的在这腻歪对吧?所以呢,我们总要说再见。那怎么说呢?A会给这样说,A会给B发出一个它的这个状态包是in,哎,我们说了这是它的这个状态位,也就是这里啊,我们再看一下爆头。这里。我们说这个标志是不是代表了是结束连接对吧,那好了,那我们说我给他发一个标志是。Fi等于一的,然后我的SEQ这个序列号假设是M。发完之后我的状态就会变成fin这个V杠一,那这个代表我要跟你终止连接了,我在等着你确认了要终止,哎,分手啊,总不能我偷偷摸摸就跑了,对吧,我来干嘛?我告诉你我咱俩不合适。
13:10
你,你妈需要30万彩礼,我手里我只有300块钱,我娶不起你,那咱结束吧。啊,当然一般情况是反过来是你女朋友跟你说你是个好人,咱俩之间不合适,对吧,一般是这样的,但是不管怎么说吧,她总得还得告诉你,你是个好人吧,这是不是才符合我们的分手程序,要不然这个事儿是不是就不符合程序,对吧?所以呢,我告诉你我要分手了,我现在的状态是等待一,我等着你确认给我说一声。然后B所有端一收到这个信息。哦,这哥们儿要跟我分手,我是不是得同意啊,诶,各位。我们这个是网络连接啊,就是说我要跟你连这个,你不能说不学,就是我要A号跟你访问,你你只要TCB协议这个正常的,你这个端口是开。比如说你的网页八零窗口是打开了,我要访问你,你就不能说不许,除非防火墙把我给阻拦了,我的访问请求没有到达你这。
14:08
否则我只要把数据包发给你,你就一定要通知。那挥手,分手的时候也是你没有选择余地,你别说那那个亲爱的不行,我一定要娶你,这个事儿没有死皮赖脸的是没用的,我告诉你要分手这事就只能分手了。那所以。各位。B是没有选择的,服务器端是没有选择的,他只能说好分手,分就分呗,他的状态他就会把回复一个标记位是A。是一的,它的标记是这个,然后把序号当中把这个M加一加一。然后回复他,分就分呗。各位,它的状态就会变成close,然后A的状态就会变成等待二。为啥还要等着人家?我们的网络访问是这样的,分手是双向的,你告诉我要分手,我回复你可以,你是不是就离开了,那不行啊,我这里还不知道我要跟你分手了,我这个这个东西就是啥这样的,这这么说吧。
15:10
你要跟我分手,女朋友要跟你分手,你觉得心里不平衡,分就分,但是这个分手要求我也在气,我也要告诉你我要分手,所以啊各位,他的这个分手是。这个B接下来需要进入last a状态,他会再发一个包,告诉客户端,我也要跟你分手。换句话说。上两个连接。是客户端和服务器端,告诉服务器端我要跟你终止连接。而后两个连接,后两个连接是服务器端告诉客户端,我要跟你分手。这才是一个完整的过程。也就是说,不能说你女朋友说跟你分手这事就结束了,你还要有点骨气,你得跟她说我也要跟你分手这事才行,明白吧?所以这个时候B会给A也发一个包,发出来这个包信号。
16:06
即使Fi也是A,因为它不是主动分手了,他是被迫应答分手,所以AC是一哈明白,然后,但是它的标记也得有SI终止连接,就是说我的服务器端,B要告诉A,我也要跟你终止连接。这个时候呢?刚刚这个序列号ACK发出去了,从这里加过来对吧,我现在继续保存在这里,告诉你,我也要跟你连终终止连接了,我还要把我的EQ也告诉你,然后呢,你要干嘛。回复我,这个时候他的状态就变成time time wait time wait。这个时候他要告诉我,回复这个序号是ACK等于一回复,然后把序号这个确认号是A等于一,把序号变成我的N加一,也就说我要跟你分手。你得告诉我,我也收到这个信息了,这个时候。
17:03
B的状态就会变成close,这个时候如果它一变成这把完了,Time timeout,等待,等一会儿没问题,这个连接就终止了。所以各位。分手过程可能更复杂。前两次。前两个是客户端,告诉服务器端,我要跟你分手。后两个是服务器端,告诉客户端分就分,没什么大不了的,谁怕谁,今年现在这个年月日,这个三条腿的蛤蟆不好找,两条腿的人多的是,我也要跟你分。所以它是四次过程。那这个时候他们的状态就会非常多,那各位我们说啊。如果你是真正的一台服务器,你被访问的人非常多,你用united state去这个抓这个状态,这样的状态抓出来的几率就非常大,既有你跟我分手的,也有我跟你分手了,那这些都是正常状态,OK。
18:00
那这些号其实都是用来让对方能够知道他收到收到了你的请求,并且回复了你明白了,那同样这个也会总结了它的具体的过程,那这个过程也是我前面讲的这个步骤,只是我用文字的形式把它总结下来,各位,那这个呢,其实还是为了让你好记,容易干,容易理解,好各位。这套题呢,其实我们说它相对来说更底层。呃,要比我们前面那个这个就是纯概念性的问osi模型的这种概念可能要复杂一点。那问到这样的东西呢,其实证明他们公司可能都是什么用到了一些专业的网络知识啊,甚至有可能需要你来配一些交换机,路由器的东西啊,甚至需要配些什么监听啊,甚至网络访问的安全控制啊,他才会需要了解这么深的这样的内容。所以啊各位这套题呢,可能比之前的稍微会难度高一点,好,那这节课的内容就是这样,我们下节课再见。
我来说两句