> 文章列表 > 27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

基本概念叫协议

 什么叫协议?

 协议是一个大家共同遵守的一个规则, 那么在这个网络通信当中,其实就是双方通信和解释数据的一个规则,这个概念 你也不用记,你只要心里明白就可以了,

分层模型, 物数网传会表应  每一层代表什么意思,干的什么事,你先看一看,你面试的时候 有可能会问你,别到时候 说不出来

四层模型和七层模型有个对应,每一层代表什么意思,以及他和七层的哪一层有对应关系,

 2  1  1 2  2 1 1 3 加起来一共7层  这四层 是不是我们实际的 网络传输过程中 

用的就是这四层啊?

 数据通讯的过程。最后一句话总结出来了,什么过程?在发送端是数据什么的过程?层层打包,那么在数据的接触方是层层解包的过程,那么那个图是吧?咱们从头为是不是给你画了一遍啊?嗯,这个我想的话大家应该明白了,是不是应该明白了?那么至于说这个网络应用程序的设计模式是不是有两种, BS 模式和 CS 模式,这个优缺点你看一看就行了

 好,你看一看,咱们都知道这个客户端是不是应该装在本机浏览器的话,是不是你只要本机有浏览器就可以了?是不是它的优先点其实还是本着这个方面来说的,是吧?

好,那么以太网帧格式,有同学不知道什么叫以太网,那你就把这以太网比看成网络就可以,网络你知道吧?兄弟们?那么以太网它只是一个专有名词,你就把这以太网哎比成就看成网络就行了,就是网络的出来帧格式清楚吗?同学们,不要把东西想的太复杂。

 好,那么这个帧格式呢?咱们是重点跟你说的,咱们还记得以哪个跟你重点说的吗?是不是 a r p 协议?兄弟们, a r p 协议来说明这个帧格式,这个你能够照着这个图,能够把这里边的每一个段的意思能够说清楚就行了,没有人让你背着去说,而且我们写代码时候用这个吗?有没有这个东西谁做的?是不是底层给你封装好的?嗯,是吧?这个不用你管。

那么说的具体是内核做的是不是?那么这个帧格式是不是从网卡上发出去的数据就是帧格式,能理解吗兄弟们?从网卡上发出去的数据是什么?什么样的数据?是数字信号还是模拟信号的?模拟信号是不是模拟信号?是不是就高电平是不是,对吧?要记住这个,那么调制解调器是干什么的?猫德牟 猫是不是进行数模转化和模数转化的?这些东西在这个 TCP IP 分层模型里面都有,清楚了吗?兄弟们你还是要出来看一看的好。

这个那么咱们给大家讲一下这个以 ARP 为例,来给大家介绍了一下以太网真格式,当然这个以太网帧格式的话,不只是有arp,是不是还有什么rarp,是不是还有这个 IP 数据报等等,是不是有好多种类型了?好多种类型,是不是就根据这个两个字节的这个类型来进行区分的?是不是?

 这个从头到尾我给你画了一遍这个里面的每一句话什么意思?也不是说哪个都需要你,你把这里面重点的我跟你说的那些你去看一看就可以了。

 比如说什么叫以太网目的地址,这应该知道是不是就是对方的 Mac 地址,什么叫对方你把数据要发给谁,那个谁是不是对方啊?是不是?那么以太网的原地是不是就是自己?是不是就发送端啊?是吧?你们是不是帧类型有点类型,什么协议类型,这东西你也不用死硬背,也没人会问这些,那么后面这些什么什么以太网,以什么以太网地址这 6 个字是不是还指的是mac地址? 4 个字节是不是指的是 ip 地址?但是你得注意这个 ip 地址它实际上是一个整形值,是大端字节序的整型值。是不是这样的?ip数据段,这个你看这个图,对照这个图你看一看就可以了。

 我先说这个东西,你不用背, 你背的话会,会浪费你的精力,你把你的精力用在更值得花费的地方,好吧?好,这是什么?什么协议?这玩意你自己看一看好了。UDP,你看一下从这个协议的这个字段的多少上来看的话,这个 UDP 是不是简单一些? UDP 也简单一些。这个红色的标记,咱们昨天是不是这个练习题也有啊?

现在记住了吗?像这些东西就应该把它当做一个常识,是吧? ip 地址是不是可以标识这个网络中的唯一台主机?端口号Port,端口号Port,是不是端口号?端口号是不是标识这个主机当中唯一的一个进程?是不是在这也称做服务啊?能称做服务吗?同学们,以后你们听说这个服务的话,就是进程的意思,就是程序跑起来了,是不是就是进程啊?,或者叫守护进程,是不是说的一个意思啊?好,这句话要搞清楚那 TCP 的数据流格式,这个后面咱们还有咱们今天还会说这个,这里面需要你关注的是 32位序号、 32位确认序号,以及这个里面的什么ack,syn,fin这东西,兄弟们,那么序号的话是不是跟你讲过了?是不是这个在发包的时候,我说这个包和报文字符串是一个意思,发包就是发字符串的往外,清楚了吗?发数据流的吗?知道你怎么说的,是一个意思,发包发字符串,发报文是一个意思,不要搞混了。

 那么你这个网卡往外发包是不是发的字节流了?你的这个字你要你如果往外发字符串的话,是不是字符串最终也会给你转换成什么呀?高低电平吗?是不是?好,那么这个里面咱是不是需要什么意思?你再往外发包的时候,是不是对每一个包都有一个编号的?那这个编号干什么用的?嗯,接收的,那么对方接收方那边是不是可以根据这个序号把这个大的,这个把小包是不拼了?一个大包了,他是不是能够拼起来?他根据什么来拼的,就是给你这需要的拼的,那么言外之意是这意思。

那么有时候那种发包的时候是不是有可能先发的包后到?有没有可能后发的包先到?是不是这样?就像你在网上买东西,是不是你比如说你在淘宝买东西 4 天到货,在京东买车第二天到货,是不是第二天到货?你可能在京东上买是,时间靠后,但是他可能先到货了,有没有这种可能?朋友们跟这个意思是类似的,但是你如果加上序号之后呢,以后呢,不管是他先有后的到来,没关系,最后是不是可以给你这需要拼起来,是干这个用的清楚吗?那么确认序号是干什么用的?我是不是跟你说了,那么你把这个数据发给对方了,对方是不是要给你回一个确认包了?他告诉你他已经收到了,如果他没有给你回这个包怎么办?要进行重传。

今天会说好,这个先不说了,今天会说这个,那么这个是稳定、安全、可靠面向连接的,

这个上面都说过了,这个里面网络里面这些名词术语解析,咱们讲义上都有,你看一看,比如什么叫交换机、什么叫什么极限器、什么叫三字交换机等等。这个你看一看。好,这个你看一看。那么讲socket编程的时候呢

 

 

咱们跟你说过了,这个 socket  a p i 函数,实际上是不是它也能够实现进程间通讯,那么只不过这个是不是跨网络的,那么原来咱们讲那些什么pipe  fifo是不是在一个主机上啊?这个就不一样了,就跨主机了是不是?这要搞明白,那么本质上它是不是也用到了内核了?同学们,是不是我们这一个文件描述是不是对应两个缓存区?pipe  对应几个? pipe  是不是两个文件描述对应一个缓存区?和这个是不是正好相反的?好大端小端的基本概念,这个不难,应该这个也不难

,什么叫大端啊?是不是低位地址存款高位数据,高位地址存放低位数据啊?那个程序自己有没有看一看?同学们,让你们看的是这个面试可能会问的东西,可能会让人写,你如果说你咱们讲过,你到时候没写出来我想的话,你会非常的后悔是不是?你可能会抓耳挠腮的说,当时可不是说再敲两遍就好了,是不是?千万不要有这种后悔,如果说你实在没见过没做出来,那倒无所谓了,是意思吗?因为这个一般的面试考试的时候很少有人说全答会,是不是你答有些答复是正常的,是不是?比如说 100 分,你可能,唉,答了 50 分让你去面试了,别到时候你连 30 也答不了你就你自己最差,那肯定进不去了是不是?那后面是不是就没有展示你自己能力的机会了,对吧?你们不要太差了就行,大端小端的基本概念,搞清楚

 这个程序,要求你看懂。

 那么我们在测试本机一个或者一个机器的话,是大的模式还是小的模式是吧?我们用到了什么?同学们里面 是不是共用体或者联合体, 这 4 个函数?我是不是跟你说了这个技巧了?是吧?怎么记的时候怎么记? n 代表什么意思?网络, h host 主机 to 是不是到谁的意思?嗯,是吧。比如这个 h to n l 什么意思?是主机字节序转化为网络字节序长整型, l 是长整型, s 是short。不说了,这个不说了。

 

 那么 i net pton 这个也有窍门,兄弟们,前面是不是都这样的? inet 吗?那么这个 p 指的什么意思?是不是点分 10 进制的这种字符串形式的 ip地址,n表示网络地址大端字节序的 4 字节整型的地址是不是这样的?这些东西如果你记不住,那呢?那么你看看能不能参照着这个什么呀?讲义或者是 man 配置 man文档,你看看能不能写出来。我再强再一次强调一下,这个man 配置,这个你最好是还要独立去用一用。

为什么这么说?一方面可以练一下你的英语能力,翻译能力,另一方面的话是不是也可以锻炼一下自己查文档能力?咱们讲过你会没讲过,难道说就不用了吗?是不是一定要注意这个?这是 i net pton,还有一个是 i net ntop,是不是这俩正好相反?这个咱们代码中是不是给你用过了?都用过了,

 这个是那个结构体,这个结构体有些同学可能这个觉得第一次接触,因为他稍微的有点绕,不那么直观,用起来比较麻烦一些,这个只能说习惯问题用的还是少,是不是?你这么着,你把它敲上几遍,不可能还记不住,是不是?是不是功夫没到位?是不对啊?功夫没到位本身这东西都是不是太难,也没有什么理论性东西的。这几个函数我就不再一一介绍了,那么咱们直接把这个代码给打开,咱们给大家把这代码再回顾一下,那么这个在写这代码的时候,有没有人说写不出来的,或者是这个最后测不出来的?有这样的吗?

 有没有写不出来的,这个咱们写这个代码的时候,是把这个流程用文字描述给你写了一下,是吧?那个图是没有第一步调什么函数,第二步调函,这个什么函数都有,是吧?咱们再快速的说一下。好,这个是我们的服务端程序,那么首先这两个头文件你要记得包含一下 

 这两个头文件你要包含一下,如果不包含,咱们是不是昨天试过了,是不是有些函数找不到声明,看一下这个过程。第一步首先是创建socket,那么首先创建一下,创建 socket 以后,是不是我们可以得到一个文件描述符了,那么这个文件描述符在内核当中是不是有两块缓冲区?分别是什么?缓程序?就是发送缓存区和接收缓存区,发送缓存区和接收缓存区,那么第二个参数第一层是 a f inet,表示你用的什么 ,你用的是哪种? i p v 4 是吧?你们是不是还有一个 a f _ i net  6 那个什么呀?i p v 6。

目前来说,我们仍然用的是 a f i net。你直接填这个宏就可以了,是不是直接填这个宏就可以了?你也不要去。为什么说老师为什么演用这个宏,这个宏为什么这么写,我能解答你吗?同学们,是不是?人家这么用,你就这么用就可以了。第二个sock stream 表示你使用的什么方式,是不是 TCP 协议?对,第三个是0,表示你使用的是不是 TCP 的默认协议。同学们,嗯,是吧?兄弟们,好,这个参数如这个函数如果错误的话,是不是返回一个小于 0 的数了?对,那么你直接调用 perror 打印一下错误原因就可以了。错误描述信息是不是就可以通过这个函数打印出来?第二个函数bind绑定,同学们,那绑定的意思是什么?

 将这个文件描述符。

将谁和谁绑定啊?将文件描述符和 IP 端口进行绑定。兄弟们,绑定完以后,接下来后续的操作是不是我们一直在使用这个文件描述了?兄弟们,然后在这儿给你提一句,你说这个bind在服务端能不能不绑定?能不能?大家注意,你不绑定你的程序它也能跑起来,但是这个端口你不知道是不是每次你还得查,那么服务端的这个端口是固定的,大家注意是固定的,不要乱用,今天用1000,明天用1001

是不行的,因为你的服务是不是要对外提供?你要对外提供服务,你老是变的话,别人知道你吗?是不是这样的?那么绑定的时候,我们是不是要定义一个这个类型的一个变量叫 struct sock addr in 是吧?让它进行赋值,是不是只要有 3 个值?一个是这个 family 是吧?同学们,这句话的意思是不表示我们用的是ipv4,兄弟们,那么第二个是端口,大家注意这个port是端口的意思, port是端口意思 IP 是不是 ip 地址的意思?htons什么意思?是不是将主机字节序转化为网络字节序的什么什么型了?是不是短整型了?短整型,那这个 4 个 8 是不是端口号了?那表示我们对外提供服务的话,是不是有一个固定端口了?是不是同学们?有一固定端口好,在这个程序里面,后边这个后面那句话是不是在设置 ip 地址?那么其中这个宏,大家注意这个宏指的是什么呢?这个宏的值其实就是0,其实就是0 INADDR_ANY。

那这句话的意思是可以使用本机任意一个IP,当然是一个可用IP。你们现在可能还不知道一个大型服务器,它这个服务器上它能用的网卡不止一个,清楚什么意思吗?不止一个网卡。当我们的电脑是不是也有两个网卡呀?一个是Wifi,这个网卡吗?是不是还有一个什么呀?是不是插网线这网卡呀?是吧?一个有线网卡,一个无线网卡,是不是我们这两边也是两个网卡呀?是吧?大型服务器往往有两个,有的有 4 个,一个网卡上也可以配 2 个以上的IP。

清楚了吗?兄弟们总知道这句话的意思,你要清楚。就什么呀?我的这个就这个服务器上可能有多个IP,那么我这句话的意思就是我可以使用我这个服务器上任意一个可用IP。那么对外提供服务的时候,你是不是要告诉客户端这一个 ip 地址和一个端口?那么举个例子,比如说你这个机子有两个网卡,每一个网卡有一个IP,那么你对外提供服务的话,你可以告诉他这两个网卡当中任何一个网卡,这个地址也行,你全告诉他,这也可以啊?明白什么意思吗?但是端口的话是不是只有一个? 端口是不是相当于在软件层面啊?网卡是不是?网卡的的ip地址是不是相对?这个 IP 是不是配在这网卡上了?兄弟们清楚了吗?同学们,这些属于像这个一个机子上有至少有一个网卡,这也是属于常识, 两个网卡子大家可能没见过,是不是?我在这个我在现场部署的时候我见过这些东西,当时我面对的机器是上百万的服务器,我还装过系统,装红包,系统在上面,是不是 ip 地址的话我也配过,那的确见到了,确实有两个以上网卡,的确这样的。

好,那么接下来做一个绑定是吧?绑定的参数,第一个是不是lfd?这个参数是不是就是前面这个参数返回值 15? 第二个是不是我们一定要做一个强制类型转换,如果你不做转换,它会给你来一个moding?是这样的,好,最后一个是不是  这个的长度 serv?这个不用说了,那么也就是bind之后,是不是我们将文件描述服端口 IP 进行了绑定?好,

接下来调用 listen 的监听,那么什么叫监听?同学们,你这个监听,你这个服务只有监听是不是才能有他这个行为?才有主动变为被动,是不是?你的服务程序是不是让别人去连你啊?那百度服务器?百度是连你 还是你连百度啊?是不是我们主动去访百度?我们是不是相当于客户端啊? 清楚吗?同学们,客户端服务器的这个概念要逐渐建立起来,到底什么叫服务端?什么叫客户端?我举个例子,你去政府办公大楼办事,你说人家的工作人员是主动等着你,主动找你,你去找人家,你是不是找人家的?你是不是相当于客户端的?人家是不是相当于对外提供服务的那个窗口?是不是每他那里面是不是每一个办公人员有一个小窗口啊?maylick窗口你可以把它理解成port。 端口

不同的窗口是不是提供的服务不一样?言外之意,不同的端口提供的服务是不是也不一样? 1 个服务,两个服务能不能用同一端口了?那么只能打架是不行的,第二个端口根本就绑定不成功,会报错了。大家还记得昨天咱们这个测试的时候,是不是这个bind?是报错,还记得吗? 那个我是不是跟你说他过一分钟就可以了,还记得吗?那个就是这个原因。

好,这个 listen 是将这个我们的服务端程序它由主动变为被动,也就是说它是对外提供服务的,应该是由客户端主动去联系他,是不是这样的?好,接下来调用 accpet的函数,这个函数是不是要接受客户的链接?是吧?那么不严格的,你可以这样说,接受客户的链接,那么严格的说,是不是这个 accpet的其实是从已链接队列当中拿出一个可用链接来,这个是不是昨天给你试过了,还记得吗?同学们,我在 accpet 的之前是不是 sleep 30,然后的话我客户端去连,这个时候是不是 sleep 30 仍然没结束?你再用。 net  ..来查看的时候,这个链接已经建立了。我是不是你试过了?同学们,这个要搞清楚。好,这个accpet

我们拿到一个新的链接以后,这个新的链接是干什么的?大家注意,这个新的链接是不是用这个文件描述来标识?CFD?是不是就标识这个新链接了?前面那个叫什么呀?叫监听的文件描述符,这个叫什么呀?通信文件描述符。所以在服务端我们拥有几类文件描述符啊?两类吧,在客户端有几类?这一概念要慢慢树立起来。

好,我们得到了一个通信的文件描述符。那么接下来我们在一个循环里面是不是循环的收发数据?嗯,兄弟们好,其中read函数有这点需要你关注一下。什么意思?锐的函数如果说返回是 0 表示什么意思?是不是对方已经关闭链接了?是不对?对方已经关闭链接了,那他关闭链接之后,那么你在这样的话,他就read还会阻塞吗?是不是立刻返回啊?是不是这点和管道是不是一样的?还记得吗?同学们,如果说对方把管道的写端给关闭了,那么你在那 read 还会阻塞吗?是不是这个返回,这个是类似的?好,那么在一个需要里面,我们调用 read 和write函数进行收发数据,在这是不是仍然也可以调 receive 或send 啊?最后一个参数填 0 就可以了?这个 有没有尝试一下?可以试一下,是不是一样的,用哪个都行?好,用哪个都行?好,这个最后你不用了,要记得干什么?文件描述是不是要记得关闭?兄弟们要记得关闭。

 

 那么这个文件描述符,这个lfd、 cfd 这俩文件描述是不是也保存到了内核当中的文件描述表里面?这两个值我是不是给大家打出来了?还记得吗?几啊? 这俩是 一个是3  一个是4,这个整个过程就这样子,如果你目前来说,比如说还不太熟悉,没有关系,别人着急,咱们今天也会用,后天还会用。

基本上咱们只要写这个程序,这样的代码都会在用,一遍不行,来两遍,两遍不行,来三遍,来十遍行不行?还能忘吗?是不是一开始我瞧这张代码的时候我也是记不住,多瞧几遍就知道了。好吧,朋友们,这个不要灰心,这个图,大家注意这个图,我给大家找的这个图,你呢?看看这个图,

是不是同学,这个图是不是把我们这个整个流程给你介绍一遍,创建消费者 bind listen,accept,receive, send 是不是都有啊?好,那咱们看一下客户端,嗯, 这个程序的话,客户端是不是就比这个服务端要简单多了?因为它没有绑定,没有list,是不是没有 accept 好?第一步也是创建socket,创建socket以后,返回的这个文件描述是干什么的?是通信的啊?通信的好,那么接下来他是不是要 connect 对方了?对方指的谁啊?服务端,是不是服务端的就是服务器?那么好,他connect 对方,他要知道什么信息?

 是不是这个?是不是类似于我们寄信啊?你要给别人发信的话,是不是你得知道谁收,你得知道他的地址,他电话是不是意思?还得知道谁?是不是在我们这?是这样的,你要想对方发发包的话,发数据的话,你得知道对方的 IP 和端口是不是这样的?你得知道对方的 IP 和端口。

再想一个问题,那么你说这个发包的时候是吧?同学们,我们往外发数据的时候,我客户端给服务器发送数据是吧?同学,那么他我们这个服务器上是不是有很多服务?他怎么会把这个数据准确无误地发送那个服务上去?他怎么知道的?仅仅通过 IP 不行吧?是不是还有端口了?因为你发数据,其实发到那个服务的端口上去了,是不是他就可以接受到了?是不是?就像那什么呀?你去办,你去这个政府办公大楼办事,你是不是得知道在哪办呢?是不是在端口上写着呢?你说计生科,比如说这个什么什么审批,什么什么项目的是不是都有?是不是?比如说户籍科是不是,你办户是不是,到户籍科是不是?等等,这些都是有明确的,有明确端口的说明这个乱不了,这个乱不了。

你再想一下,如果说假如说两个服务能绑定同一个端口,那就意味着发的这个包到时候他都不知道发给谁了,是不是了?他就无法询了?好,接着看好connect, connect 以后大家注意这个connect,它的返回值 ret,只是说成功已失败,是吧?同学们,那么这个 connect 这里面在内核当中做了一件事情,什么事情? 3 次握手建立链接,你只要一调用 connect 在内核当中他就给你做了 3 次握手过程。

今天会说这个好,那么 connect 成功之后,是不是接下来它就可以发送数据和接收数据了?整个是不是就结束了?最后不用了,要记得 close 这个文件描述是没有了,客户端是不是相对来说比较简单的,是吧?同学们,这个代码,我跟大家说这个代码如果还有不懂的课间找我们,别到时候我问你的时候你说不知道,好,要主动问好。

同学们,好,这个复习内容大家,

这个今天的学习内容给大家快速说一下,第一个掌握 3 次握手建立链接的过程,这一个过程是你在调用哪函数?那发生的是不是connect,谁连谁?客户端是不是要主动 connect 服务端的?在内核当中它就有一个三次握手过程,这个内部的过程你不用你关心,是他自己做的清楚吗?第二步掌握 4 次挥手,关闭链接过程,这个在哪一步调用?当你调用 close 的时候,你是不要关闭链接,这个时候内核就有一个 4 次握手关闭链接的过程,清楚了吗?同学们,这是 4 次回手之势, 4 的回手和 4 握手是一个意思,不要死抠这个细节,一个意思,反正就是什么经过四步是不是?那后面给大家讲一下滑动窗口的概念,那么在第一天的时候我给大家说了这个滑动窗口用途是什么呀?流量是不是进行流量控制,避免我发送的过快,你收的太慢,是不是这样的?好,第四个给大家讲一下掌握错误处理函数的封装,其实这一块就是把咱们这些 socket API 做了一封装,我们在调用的时候就不用再去做异常判断了。比如说创建socket 失败之后是不是有一个 perror 打印啊,然后咱们把它封装起来,把这perror 封装到这个里面去之后我们直接调这一个函数,结束了,这个咱们会跟你说。

 那么第五、第六后面这两个是用什么呀?实现高并发服务器的两个模型,一个是多进程版,一个是多线程版,这个就比昨天有意思了,昨天那个的话是不是只能接收一个后端?两个行吗?两个不行,两个不行。因为你 accept 的函数是不是已经调过了?只有调用一次accept ,调用一次accept ,是不是才能结收一个链接?是吧? 还有这个学习目标,就这么些个,其中这两个咱们会写代码,

这个咱们把代码给你说一下,掌握错误处理函数封装 然后咱们在这两个里面去用它,知道什么意思?这代码我已经有了,直接发给你,这里面这些概念前三个,要求你这个概念不用画了。

这两个三次握手4次挥手的时候,你自己在纸上自己画一画啊,自己画一画,这给大家留的一个作业,你自己动手画一画。为什么让你画,你画一画,你自己琢磨清楚吗?这过程你要了解过程,了解这一块,我们写代码的时候用不着,什么时候用,面试是吧?面试你说你学的好,人家问你问题,你不知道人人相信吗?是不是你首先把这些,是不是这些功夫都做到,你该会得会这属于理论性的东西。

好,咱们看一下你,首先你先把这个题给思考一下,哪个题?为什么 TCP 是面向链接的安全可靠的传输?我把这个 3 次过手的过程, 4 次回收过程讲完之后,那么这个东西你应该就清楚了,心里明白了,看一下,那么咱们这 TCP 是面向链接的安全可靠的传输。

 ,好,那么在建立链接的时候有一个三次握手过程,那么三次握手过程完以后,这个链接就建好了,建好链接之后,接下来就可以进行数据传输了,那么数据传输结束以后,如果你这个不用了,这个链接不用了。也就是说你不想发送数据,接收数据了怎么办?是不是最后close, close 有一个啊?这个内核当中有一个 4 次挥手过程,关闭链接的过程清楚吗?咱们接下来就讲一下这个 3 次握手和 4 次挥手的过程。