北京时间:2023/8/4/22:40,天苍苍野茫茫,风吹造地见牛羊,此时心潮澎湃,非常开心,啊哈哈哈!因为就在刚刚我们终于把系统编程方面的知识给学完了,啊哈哈哈!真是功夫不负有心人呀!呜呜呜,仰天而泣,算了,不能发神经,哈哈!今天把最后一节有关多线程知识的课给上完了,也就代表我们暂时可以和系统编程说拜拜啦!如果这么想,那么就是我在做梦,呜呜呜!因为机智的我知道,学习系统编程相关的知识其实本质都是在为网络相关知识做铺垫,呜呜呜,不服!好了,还是有好消息的,起码我们算是真正要开始网路的学习了。学习系统编程终章博客将在明天更新,由于是终章所以文本较长,满满都是干货哦!并且昨天在我的预期下,好像并没有失眠,睡的很香,但是早上还是没有睡醒,8点的闹钟一点没听见,不知道为什么,哈哈哈!该篇博客就让我们正式开始网络知识的学习吧!
在把操作系统相关的知识学习完之后,此时我们正式来到网络的学习,同理操作系统相关的知识只是为我们更好的理解网络做铺垫,当然同理无论学习什么基础概念都是最重要的,其次才是在概念之上的有关网络协议的认识,协议是什么?有什么用?对于当前的我们来说肯定是一头雾水,只知道协议对于网络来说至关重要,所以此时就让我们从基础出发,朝协议一步步走进吧!
在上世纪前页,在清朝政府还在用火药放鞭炮的时候,欧美资本主义列强已经开始大力发展军工业,直接导致我国被大肆侵略,在被侵略之前中华上下5000年的底蕴,可以说当时的清朝真的富的流油,间接导致危机意识不强,最终导致…。到后来的第二次世界大战,全球到处都是战争,而唯独人家美国,在我们还在连饭都吃不饱的时候,人家已经开始搞起了计算机。
由于当时科技还非常落后,对于许多科学研究都是在非常多科学家的共同协作下完成的,在当时那个没有网络的年代,想让每个科学家都利用计算机完成协作,那么前提肯定是需要让所有科学家的电脑是协同的,但是就算科学家之间的电脑是协同的,那么也会导致计算机中的数据无法共享,所以在不断克服问题的过程中,就诞生了软盘(类似U盘),本质就是可以将计算机中的数据导出,然后传入另一个计算机,但是在大规模的协同中,这样的工作模式存在很大的弊端,所以科学家们就开始使用电缆/无线电波传输电脑中的数据,科学家们在这样的协同工作下就完成了操作系统的研发,操作系统应运而生。但是使用电缆/无线电波也有一个弊端就是无法实现远距离的电脑间数据传输,所以后来在美国军方的控制下,网络也应运而生。可以这么说,操作系统和网络的诞生都是必然的,它们都是计算机实现协同工作的必要条件。当然具体网络是如何实现信息传输,肯定是离不开硬件的支持(交换机、路由器),再然后就来到20世纪90年代,美国军方为了赚钱,放开对计算机网络的控制,从而实现网络技术的商业化,从此网络迅速发展。
上图就是一个实现计算机之间协同的过程,当然也是一个实现网络化的过程,所以接下来我们就来看看有关概念吧!交换机: 当然具体交换机的实现原理我们不关心,我们只要了解一下它的功能就行,交换机可以将数据包从一个端口转发到另一个端口,让连接到交换机的计算机之间进行数据数据传输和通信,从而实现多台计算机可以共享资源和信息,实现协同工作。路由器: 当计算机与交换机连接之后就形成了一个小范围内的数据共享环境,该环境被我们称为局域网,然后当交换机与路由器相连,此时交换机就可以把数据从一端口转发给路由器,然后路由器再通过自己的转发数据包能力和定位能力(IP地址)将数据正确的发送到目标网络中,从而实现数据从一个局域网到达另一个局域网,该过程也被我们称为广域网。 当然对于局域网和广域网它们只是一个相对的概念,相对不同地域,计算机之间可能是局域网也可能是广域网,具体取决于计算机之间的连接范围。
所以有了上述知识之后,我们此时就能理解,为什么每台计算机都有自己的IP地址以及计算机之间实现数据共享的资本原理。首先我们将需要共享的数据发送到交换机中,交换机通过对MAC地址进行判断,如果该MAC地址就在该交换机所处的局域网中,那么交换机就直接将数据通过MAC地址发送到对应电脑的网络适配器(网卡)中,对应接收到数据的电脑再经过操作系统的一些列操作完成对数据的处理。但如果MAC地址不处于该交换机所处的局域网中,那么交换机就会将数据发送给与其连接的路由器,路由器接收到数据之后,就会对接收电脑的IP地址进行判断(路由表),判断其所属的目标网络,最终将数据发送到目标网络中(服务器),当数据到达目标网络中之后,此时目标网络会通过其内部的路由器和交换机进行进一步的数据转发,最终通过路由器对接受数据电脑的IP地址进行判断,将数据发送到与该路由器相连的交换机中,最后交换机再对MAC地址进行判断,发送到目标电脑的网络适配器中,同理最终操作系统完成对数据的处理。当然具体过程还有待深入,很多知识需要等我们将网络的层状结构搞懂之后才能进一步理解。
对上述有关网络发展背景和网络相关知识有了一定的理解之后,此时我们就来看看网络中最重要的知识点:网络协议。当然由于网络协议知识点非常多,并且由于我们此时只是学习网络基础知识,所以了解其基础概念就行,后序有待深入学习。
网络协议从名称上来看就是一个协议,而协议在日常生活中我们一般就是理解为一种约定,但是这种约定又不是简单的口头约定,而是那种经过审核得到认可之后非常严谨的约定,所以我们可以将其看为是一个合同,当你签了字就一定需要履行的合同,那么为什么要签合同呢?本质还是为了对协同合作做出保障并且减少后期的沟通成本,提高效率让经济最大化。同理网络协议,只要你想要使用计算机接收或者传输数据你就一定需要遵守对应的网络协议,当然你可能对遵守网络协议这点体会不到,那是因为电脑被生产的过程中,无论是电脑的硬件还是操作系统都已经被专业人士默认完成了对协议的同步,当然不单单是电脑,还有你家的路由器等各种需要连接网络的设备,所以我们体会不到协议是什么,更不知道应该如何遵守协议,哈哈哈!所以身为小老百姓的我们只要负责消费就行,对网络协议进行同步就留个那些设备生产厂商完成吧!不过从这点也可以看出网络协议是需要对硬件进行管控,而且不单单是一种硬件,需要所有硬件进行协同,只有这样才能成功的让每一台计算机都连接到网络中,所以最后明白网络协议就是指不同电脑之间进行数据共享和交换的规则/约定。
认识协议
既然知道了协议就是一种规则/约定,并且是在使用电脑进行网络数据传输时的协议,那么具体在使用网络进行数据传输时,协议都规定了那些内容呢?此时我们就明白,对于协议来说,它不仅规定了数据传输时的传输格式,它还规定了数据包的封装及解析方式和错误检测等。只要涉及与网络的交互,其中所有的操作都进行了标准化同步。其中对于数据间的传输格式我们最为了解,以二进制为标准格式,但要明白,二进制不单单只是用于传递数据,更重要的是对应二进制序列在网络协议中表示的含义,无论是在各种设备,还是电脑硬件,对于特定二进制序列表示的含义都进行了严格的控制和规定,只要相应的硬件收到了这一二进制序列,那么它就需要完成相应的动作,使对于数据可以成功完成传输。所以当你想要让各种设备或者是各种电脑硬件都能够遵守这一协议的时候,前提是你要让这些设备或者硬件能够产生和识别对应的二进制序列,所以此时就出现了使用磁性、电信号、高低电位、电压、波峰波谷、像素等一系列用来区分0和1的物理元素,从而达到让各种设备和各种硬件之间进行有效的通信和数据交换,从而实现对网络协议的遵守,构建起一个协调运作的计算机网络系统。
明白了上述有关协议的基础知识之后,此时我们就明白在日常生活中无论是传输数据还是接收数据统统都离不开网络协议,因为各种设备和各种硬件在生产过程就已经按照网络协议的标准进行的默认化处理,从而实现大众化数据共享。并且明白底层最基本的数据传输格式是二进制,所以所有设备和硬件只有支持对二进制序列的识别和处理,我们才接收到对应的数据和发送对应的数据,但是此时在接收数据和传送数据的过程中会产生一系列的问题,如数据安全问题和数据丢失问题,所以为了了解这些问题具体产生的原理,此时我们就需要对网络协议进行深入了解。
为什么网络协议是层状?
通过上述知识此时我们知道对于数据传输并没有我们想象的那么简单,想要更好的理解数据传输我们就需要牢牢的抓住网络协议,因为数据传输就是基于网络协议完成的,只有搞懂了协议,以后我们在使用代码解决数据传输问题时,才能有更加的逻辑能力。当然因为此时我们是基于网络基础来看待协议,所以此时不讲解协议具体代码实操,而是基于概念一磕到底。
首先明白,当我们无论是面对国家与国家之间的数据传输,还是省与省之间的数据传输,我们面临的第一个问题就是距离问题,此时因为光信号在光纤中传输会衰减和损耗,并且这个损耗与距离成正比,随着距离的增加,光信号会逐渐衰减,导致信号强度减弱影响信号质量,从而可能造成信号丢失问题,当然此时我们只是分析问题,所以这部分知识不进行拓展。其次是定位主机问题,也就是存在非常多的电脑主机,我们应该如何定位到我们需要传输数据的那台电脑。然后还有非常多的问题,如:数据划分问题、数据转发问题、用户认证问题等等… 所以此时为了解决这些问题,我们就需要进行设计,在设计的过程中我们会发现这么多的问题中有的问题非常的类似,有的问题毫无关系,有的问题需要解决上一问题才能解决,所以此时我们就根据这些问题设计出了一个层状结构,也就是对这些问题进行划分,将相关问题划为一层,不相关问题划为另一层,并且按照顺序进行,实现问题解决的先后性。所以从层状结构出发,我们发现我们就实现了高内聚、低耦合的效果,其中高内聚体现在每一层中解决的问题都是相似的,低耦合体现在层与层之间(模块与模块)没有直接关系。明白了这些之后,此时只要搞懂高内聚,低耦合带来的优点,此时我们就明白为什么需要将网络协议设计成层状啦!其中低耦合可以实现每个层状结构中的代码被独立开发和维护,任何一层出现问题都不会影响其它层,并且层与层之间可以进行通信,让不同厂商开发的协议可以互相配合使用。而高耦合因为它们解决问题的相似性,所以它可以提高该层中不同模块代码的复用性。
明白了上述知识之后,此时我们就知道为什么一个网络协议栈需要设计成层状了,此时我们就来看看OSI(开发系统互联)一种开放式系统互联参考模型,也就是任何网络协议栈逻辑上的定义和规范。如下图所示,发现对于OSI网络协议栈来说每一层需要解决的问题都是不同的,并且每一层之间都具有先后关系。
如上图所示,发现对于OSI模型的网络协议栈来说,它被分为了七个不同的层状结构,并且每一层都有与其相对应的功能,具体分析我们先不谈,此时我们只要能够认识并且大概了解其分布与功能就行。并且注意,OSI网络协议栈是一个标准的网络协议栈模型,而当前主流被使用的网络协议栈是TCP/IP网络协议栈,虽然TCP/IP协议栈最初是基于OSI协议栈模型进行设计的,但在实际应用中,发现将TCP/IP协议栈划分为7个层次并不是很实际和必要,所以对于目前主流的网络协议栈TCP/IP一般只有5层,分别是物理层、数据链路层、网络层、传输层、应用层。那么此时基于TCP/IP网络协议栈,我们就发现其相对于OSI模型,它少了两层,那么此时有的同学就会问了,如果TCP/IP协议栈只有5层,那么其中会话层和表示层起到的作用应该如何实现呢?面对这个问题此时并不需要担心,因为本质在操作系统看来表示层和会话层起到的作用都是在用户层实现的,操作系统并没有提供实现表示层和会话层对应功能的接口,所以当你想要使用网络协议栈来完成数据传输,你同样需要实现会话层和表示层的功能,只不过此时是在用户层实现。所以此时对于TCP/TP协议栈来说,它们就将会话层和表示层都包括在了应用层当中,所以对于TCP/IP协议栈来说它只有5层。所以接下来就让我们基于TCP/IP协议栈来了解一下数据到底是如何传输的吧!
首先明白,对于TCP/IP协议栈来说,其中每一层都有每一层对应的协议,其中最重要的就是网络层的IP协议和传输层的TCP协议,这也是为什么该协议栈被称为TCP/IP协议栈的原因,所以明白这块知识涉及到的东西非常多,并不是表明上看到的什么层起到什么作用这么简单,这些知识只是用来打基础的,关键在于我们应该如何实现和分析这些功能。只有把每一层的实现原理和层与层之间的关系搞明白,以后在解决有关数据传输的问题才能变得更加容易。
明白了这点之后,此时我们就来看看网络协议栈在系统结构中占据什么地位吧!为什么要从体系结构来看网络协议栈呢?从上述我们也知道想要实现网络通信,前提是满足网络协议,然后又因为网络通信会产生非常多的问题需要解决,所以我们需要实现高内聚低耦合的层状结构,也就是需要将网络协议实现成网络协议栈的形式,然后又发现在网络协议栈中,每一层都起着不同的作用,通过这些作用最终解决了我们使用计算机进行网络通信的所有问题,所以当我们想要在计算机中实现某些功能,此时就一定离不开操作系统,同理更离不开体系结构,所以此时我们就来看看网络协议栈在体系结构中扮演着什么角色吧!如下图所示:
此时我们发现,网络协议栈本身依附于体系结构,当然这也是必然的,不然如何实现各种功能的代码编写呢?所以此时我们就明白,对于物理层来说它包括的就是像网卡这样的硬件,通过对应的硬件将数据的二进制序列转化为电信号,最终实现数据的接收与发送,而对于数据链路层来说它起到的功能一般是有网卡驱动和内核代码实现,而网络层和传输层起到的功能显而易见就是通过系统内核代码来完成,当然最终我们想要从什么软件中发送数据、接收什么软件中的数据,都是靠应用层来控制的,这也就是如今各种APP横行的原因,我们可以通过操作系统提供的各种系统调用接口来实现各种功能,当然注意:此时的系统调用接口是专门用来进行实现网络通信的,如同我们在之前学习进程管理、内存管理、文件管理时,我们在学习相关系统调用接口时,都是一批一批学习的,所以操作系统为了很好的实现网络管理,此时也有一批针对于实现网络通信的系统调用接口供给我们使用。(系统网络不分家!)
并且我们要明白,在之前学习有关文件系统相关知识时,我们理解过一切皆文件的概念,也就是在操作系统调用网卡驱动去对网卡进行使用的时候,我们同理是对网卡驱动进行文件结构体封装,通过函数指针的形式去调用网卡驱动的功能,实现操作系统对网卡的使用,所以此时结合网络协议栈来看,对于网络的管理是基于对文件系统的管理。
对物理层进行了解
由于我们只关心软件相关知识,所以对于物理层我们并不怎么关心,在此处我们对其相关概念进行一定理解就行,后序我们重点学习TCP/IP协议栈的其它4层协议就行,对于物理层来说,上述我们对局域网、广域网之间如何使用交换机、路由器进行数据传递有了一定的理解,此时我们再深入一些,如上述我们所说,物理层的功能取决于网卡(网络适配器),而网卡的功能是将对应的二进制序列与电信号进行转换,我们此时就从电信号的知识来谈谈信号传输。
明白对于我们的笔记本电脑来说,想要上网最常见的两种方法分别是连接WLAN或者连接网线,无论你使用的是那种方式,本质就是为了实现二进制序列到电信号的转换,因为只有转换成了电信号,才能进行传输,当然目前这个传输过程因为距离原因,所以一般使用的是光信号,也就是收到电信号后需要将其转化为光信号,这样可以提高数据传输的质量。当然此时你们可能会好奇,如何将二进制序列转化为电信号呢?以WLAN为例,因为我们的电脑中存才一个无线电发送器,所以当你需要发送数据时,该数据经过处理之后就会变成二进制序列,此时无线电发送器就会将对应的二进制序列发送给与其相连的路由器,一般路由器中自带一个小型交换机,最终路由器再将接收到的无线电信号转化为电信号给发送出去。当然对应硬件如何识别和处理二进制序列,在上述知识中我们已经详细讲解过了(波峰波谷)。当然具体有关物理层方面的知识还有很多硬件,感兴趣的同学可以去了解一下,这里我们不过多理解,重点发在对TCP/IP另外4层协议的理解以及网络传输流程的理解。