引言:
北京时间:2023/8/9/13:04,昨天在摆烂中把网络基础相关知识的博客更新,依然还是上不了C站热榜,我估计是因为我账号热度不够没有上榜资格,也可能是因为前段时间没有积极更新,导致周榜被甩出100名开外,反正应该是因为更新文章不够积极导致现在怎样都上不了热榜,不然像以前只要文章一发,热榜前20唾手可得,哈哈哈!所以为了恢复我们在C站的热榜地位,这个星期我们一定要积极更新。耳根的小说《我欲封天》听了一些,玄幻总是那么令人无法自拔,文中作者频繁使用文言文和省略号来设置悬念以及伏笔,作者对文言文的使用非常优秀,当玄幻和文言文配合使用,你就会发现这个玄幻小说非常牛,因为你不怎么看得懂,哈哈哈!通过对该小说的简易理解,我明白了耳根常年霸榜"网文五大至尊"之一的原因,总体感觉耳根的玄幻小说文笔比辰东要强,从前年开始更新的《深空彼岸》可以看出,当然因为风评不好,所以没看,毕竟书友的眼睛是雪亮的,本来当时刚出的时候想追的,可是更新太慢就没追,一眨眼都更完了,本来辰东出名必属精品,可惜!好了不谈那么多了,今天让我们继续来学习一下有关网络基础相关的知识吧!
TCP/IP网络协议栈的五层结构
上篇博客由于时间原因,所以有关TCP/IP网络协议栈的五层结构我们并没有了解完,只是大致了解了一下有关协议栈中物理层相关的知识,当然由于我们对于物理层并不怎么关系,所以简单了解就行,该篇博客中不再强调与回顾,所以接下来我们就再来看看有关网络协议栈或只能够其它的四层结构吧!
回顾网络体系结构
在学习TCP/IP网络协议栈其它四层结构之前,我们先来回顾一下有关网络与体系结构的知识。在上篇博客中,我们谈了数据是如何从局域网传输到其它子网中,也谈到了我们在进行数据网络传输时需要满足网络协议,然后也谈了为什么网络协议需要被设计成层状结构,并且了解了OSI网络协议栈模型和TCP/IP网络协议栈模型,最后重点谈到TCP/IP网络协议栈模型与体系结构之间的关系,搞懂了网络协议栈中每一层功能在体系结构中由谁实现,然后发现原来网络协议栈和体系结构密不可分,只不过由于不同操作系统之间设计方案不同,对应体系结构与网络协议栈之间存在一定的区别,但我们明白无论操作系统如何设计,只要需要进行网络数据传输,就要符合网络协议栈原则,如Linux系统中对网络的管理依然需要满足网络协议栈:对物理层的管理和我们以前学习对文件系统的管理一样,本质是因为“一切皆文件这个抽象”,我们只有把网卡驱动程序封装成一个设备文件,此时才可以通过函数指针的形式去调用与网卡驱动程序对应网卡的读写功能,所以此时明白由于对网络协议栈中物理层的管理需要通过文件系统进行,那么网络协议栈整体也就离不开文件系统,想要实现对网络管理即对网络协议栈管理,以后肯定就会用到管理文件系统那一套,如文件描述符表的管理等…,并且对于网络协议中其它功能的实现在操作系统内核代码中同理进行了管理,且提供了相应的系统调用接口供给上层使用。
TCP/IP其它四层结构理解
上述我们明白了网络协议栈在体系结构中是怎样的一个存在,并且在上篇博客中我们了解了目前主流的网络协议栈是相对于OSI七层模型改变之后的TCP/IP五层网络协议,如下图所示:
数据链路层: 首先明白数据链路层存在于网卡驱动程序中,所以同理数据链路层就是用来提供物理网络设备(网卡)对应的接口,然后根据网卡接口和其自身的协议来管理数据的传输,负责将操作系统中的数据封装成特定的数据帧,然后传输给网卡接收,反之同理,具体数据传输和接收过程有待深入学习。并且明白在数据链路层中不仅只可以有一种协议,也可以是其它协议,如:以太网、令牌环网、无线LAN,其中以以太网使用最为广泛,也就是说在数据链路层上协议可能是不同的,可能是以太网协议,也可能是无线LAM协议,那么此时就会存在一个问题,不是说网络协议需要保持一致吗?原因是因为我们以前说的网络协议保持一致代表的是TCP/IP协议需要保持一致,此时并不要求数据链路层的协议也保持一致,TCP可以通过一些接口或者配置选项来调整和配置数据链路层的协议,意思也就是在TCP/IP协议中可以兼容任何一种数据链路层协议,所以只要保持TCP/IP协议的一致性就是在保持整个网络协议栈的一致性,同理此时还有一个问题,就是为什么数据链路层的协议需要涉及多种呢?也直接像TCP/IP一样强制成只有一种协议不行吗?想要明白这个问题,此时需要明白交换机本质是工作在数据链路层当中的,因为当交换机从网卡中获取到数据帧之后,它需要根据数据帧中的目标MAC地址找到接收数据的那个网卡,所以导致交换机是工作在数据链路层,因为上述我们说了数据链路层就是网卡驱动程序,只有通过网卡驱动程序我们才能获取到网卡的MAC地址,意思也就是只有在数据链路层上的协议才支持获取MAC地址,所以想让交换机获取到数据帧中的目标MAC地址,此时就需要依赖于数据链路层上的协议,所以交换机工作在数据链路层,此时明白这点之后,我们还能明白,因为交换机工作在数据链路层,而交换机除了直接连接路由器,将数据发送到别的子网中之外,它还可以直接在本局域网内进行数据传输,所以此时明白数据链路层中的协议就是局域网内的通信标准,可用于小范围内的数据传输协议。明白了这点之后,我们就能解决为什么不能将数据链路层中的协议给规定死了,这是因为不同的物理介质和网络技术需要不同的数据链路层协议来进行数据的传输,怎么理解呢?其实很好理解,也就是我们上篇博客所说有关物理层通信的知识,本质也就是网线和无线电之间的原因,一个通过电信号实现数据传输,一个通过无线电波实现数据传输,而我们的数据链路层又是交换机的工作场所,同样需要利用数据链路层中的协议,那么此时如果将数据链路层的协议定死,就会导致通过网线传输的数据和通过无线电波传输的数据只能有一样可以被协议识别,导致世界只能用网线或者WIFI其中之一,所以需要让数据链路层的协议允许不同,从而实现数据链路层的协议与外设匹配使用,如:你使用的是网线,那么你的数据链路层协议就是以太网,如果你使用的是无线电,那么你的数据链路层协议就是WIFI。明白了这点之后,此时有的同学又有疑问,他说我的电脑好像即可以支持网线,也可以支持WIFI耶!好神奇,你的结论是错的,那我只想笑一笑,之所以现在的电脑可以支持这两种方式,原因是因为在电脑中并不只有一种网卡,一般有两种网卡:普通网卡和无线网卡。此时通过两个网卡的知识,此时我们还能明白,数据链路层的协议和网卡是分不开的,也就是数据链路层的协议一般就是由网卡和相关的网络设备决定的(交换机),因为交换机也分为接收无线电波和电信号的嘛,对吧!最后注意:明白上述知识,这个注意点只是逻辑上的推理而已,也就是如果在同一个局域网环境下,你使用的数据链路层协议与另一台该局域网下主机的数据链路层协议不同,那么你就无法对其发送数据,那此时有的同学就有疑问了,那我记得好像可以耶,我还成功过!举一个场景:好比你带着自己的笔记本电脑去学校机房上课,你之所以可以将自己电脑中的数据传递到机房的电脑(前提看到同一份资源,具体由应用层实现)那是因为此时并不是局域网了,你们并没有使用同一个交换机,所以此时就算你数据链路层协议不同也没有关系,因为本质你们的TCP/IP协议是一致,而TCP/IP协议会对数据链路层协议进行兼容,从而让我们实现数据传输。明白了这点之后,此时还能明白你只要有一根自己的网线,学校机房的局域网应该是不会阻拦你的笔记本电脑(没试过),当然这也就是为什么让有的黑客如果连接了你的局域网,你就会完蛋的原因!所以对于局域网的保护非常重要,防火墙的概念由然而生(边界防火墙),当然对于某些更厉害的黑客使用无线电也可能直接入侵你的局域网,当然这就涉及网络安全相关的知识了,我们也只是随便了解一下,谁让每个小伙伴从小都有一个黑客梦!所以最后明白,无论是交换机的生产厂商,还是网卡的生产厂商,它们都可以有各种不同的协议,但是在有各种协议的同时,它们一定需要遵守TCP/IP协议,否则就会倒闭。
网络层: 上述搞定了有关数据链路层相关的知识,对于网络层我们知道由于其工作于操作系统内核代码,在网络协议栈中其遵守的是IP协议,主要功能是将数据进行分组(数据包)和封装,然后根据地址管理和路由选择定位到目标主机。当然具体为什么网络层具有地址管理和路由选择的功能,那是因为路由器工作于网络层。注意:这里有一个误区,当然在上述讲有关交换机工作在数据链路层时我们有谈到,但是没重点区分,这里我们需要明白,就是数据一定是按照网络协议栈一层一层向下传递或者向上传递的,也就是交换机或者路由器想要获取到数据一定是通过网卡获得的,而不是当数据还在网络层的时候,路由器就拿到数据了,或者在数据链路层的时候,交换机就拿到数据了,这都是不对的,在开始进行数据传输时经过网络层或者数据链路层本质起不到定位IP地址、定位MAC地址的能力,因为交换机和路由器都还没有从网卡中拿到数据,所以同理为什么说路由器工作在网络层,而网络层具有管理地址和路由选择的能力,那是因为当初在将目标地址写入数据的时候是在网络层进行的,遵守的是网络层的协议,所以万事有因就有果,也就是当后面路由器拿到数据之后,它想要获取IP地址就必须根据网络层的协议(IP协议)来获取(数据格式不同),所以说路由器工作在网络层,并不是它直接从网络层拿数据的意思,本质其实是它需要遵守网络层协议。明白了这点之后,我们来谈谈路由器的地址管理和路由选择功能,当然网络层具体如何进行数据分组和封装由操作系统内核代码决定,这里我们先不详谈。我们要明白,电脑内部并没有自带IP地址,IP地址是在我们联网时,操作系统通过对应的代码向路由器申请的(当然你可以自己配置IP地址),当然同理为什么你可以向路由器申请IP地址,那前提是你获取到了路由器的接口,也就是联网了(以太网/WIFI),此时路由器不仅会分配一个IP地址给你的主机(会记录),而且路由器内部会提供一个它自己的IP地址给你使用,注意:这个位置两个IP地址是不同的,一个是路由器通过网络中的DHCP协议向网络中申请的IP地址(主机IP地址),一个是路由器自带的,生产厂商已经设置好的IP地址,因为只有当你获取到了这个IP地址,在你以后将数据传给交换机之后,交换机同理才能根据数据链路层中的协议获取到需要发送路由器的IP地址,当然本质你是如何获取到交换机的IP地址呢?同理因为你的电脑连接了路由器,并且路由器提供了你一个与它交互的IP地址接口,当然因为路由器中天生就不止一个IP地址,而是多个IP地址,任何网络设备想要与该路由器交互,前提是你拿到了人家其中一个IP地址,所以路由器天生就会分配一个自己的IP地址给交换机使用,所以路由器天生就知道交换机的IP地址是那个,所以最后路由器再把交换机的IP地址提供给电脑使用,此时电脑不就找到了交换机吗?然后交换机不就可以拿到路由器提供给电脑使用的IP地址吗?最后不就实现了数据从网卡到交换机再到路由器,当然最后交换机是否需要访问路由器,此时就需要对数据中的目标MAC地址进行判断(当然此时具体该局域网下有那么MAC地址,就需要设定了,不能直接获取到),最后如果发现交换机MAC地址表中没有目标MAC地址,此时交换机同理根据数据链路层协议识别数据中的路由器IP地址,找到对应路由器。当然本质目标IP地址是通过应用层写入到数据之中的,也就是你自己的电脑想要访问那个IP地址,事先你是需要知道的,所以这也就是为什么存在链接的概念,因为本质链接就是一个IP地址,可以手动输入,也可以保存在文件中,当然如果你想和我谈谈微信,那么刚好,本质微信中的用户肯定是不存在IP地址的,只能把微信这个软件看成是一个IP地址,也就是在安装微信的时候,你默认就配置好了微信这个软件的IP地址,当然此时服务器的概念就出来了,服务器本质就是一个大一点的IP地址,你发送的数据首先就是通过路由器访问到微信服务器的IP地址,然后让人家微信服务器通过对用户的管理(水很深),找到你要发送的目标用户,然后将你的数据发给人家,这也就是上层的封装啦!这种封装就比那种直接用链接访问IP地址高级多了。明白了上述知识之后,此时搞定路由器等于晒晒水啦!明白路由器肯定不止一个IP地址,也就是不止只有提供给外界访问的IP地址,它更存在内部IP地址管理,也就是需要对连接该路由器的网络设备分配IP地址供其使用,所以因为路由器中IP地址有限,所以连接该路由器的网络设备就有限,但可以通过子网划分来解决(具体有待深入),当然这也就是为什么当一个路由器被多个网络设备连接之后就会变卡(交换机有限、带宽有限、数据处理能力有限)。当然如果路由器需要找到目标IP地址,此时就需要依赖于路由器中的路由表,路由表就具有管理其它路由器IP地址的能力,并且路由表一般都会采用自动路由协议对路由表进行更新,反正最后就是将数据传递给一个一个路由器,最后传递到目标IP地址中,当然这里有一个网关的概念,也就是如果路由表中没有我可以使用的路由器IP地址,此时数据就会被传到网关上去,具体有待深入。
传输层: 同理传输层代码也是在操作系统内核实现,其遵守的协议是TCP协议,主要功能就是将数据分割成适合网络传输的大小,确保数据传输的可靠性和完整性。这个点重点强调数据传输的可靠性,当然具体如何让数据传输变得更加可靠,有待深入学习,这里不过多了解。
应用层: 这层在TCP/IP协议中包含了OSI模型中会话层、表示层和应用层的功能,具体就是用来对获取到的数据进行使用,如何使用也有待深入学习。
网络传输基本流程
搞定了上述知识,此时我们学习网络传输的流程成本就没有那么高啦!本质还是那个道理,想要进行网络数据传输就需要遵守网络协议栈的规则,如此时最简单的一个场景,两个主机在同一局域网下进行数据传输,此时主机一想要将数据传输给同局域网下的主机二,那么此时具体是一个怎样的过程呢?
首先两个主机肯定都遵守网络协议栈,并且因为网络协议栈中每一层都有不同的协议,所以此时明白不同的协议就会有不同的数据传输格式,所以在进行数据传输时,最后想要让该数据对应的信息被识别,在封装数据时就需要根据协议对特定的识别信息进行封装,并且对应被封装的识别信息我们就称为协议报头,真正被传输的数据我们就称为有效载荷/有效数据。根据这一原理,因为每一层的协议都不相同,所以每一层都需要向有效载荷中封装自己的报头,也就导致当数据从网卡传输到交换机时,该数据就包含了应用层、传输层、网络层、数据链路层以及物理层所有协议的特定识别信息,从而让数据被交换机根据MAC地址找到另一台电脑的网卡时,该网卡可以根据该数据中有关物理层协议的识别信息和自己本身就存在的物理层协议信息交互,从而识别,最后同理一层一层的将数据向上传输,并且因为每层所能识别的协议不同,所以在向上传输的过程中需要完成解包过程,将对应该层的协议从封装数据中去除,然后根据被去除该层协议后的下一层协议找到对应的上层,最终让另一台电脑的应用层接收到该数据,对该数据进行处理和使用。具体如下图所示:
理解封装和分用
所以此时我们根据上述描述和上图所示,我们就可以很好的理解什么是数据的封装和什么是数据的解包及分用了,封装也就是如上述所述在应用层自顶向下传输数据时需要对每一层协议的报头封装到传输数据中,因为只有这样另一台电脑在接收数据时,才能根据对应的报头和该层所对应的协议识别到对应的信息,从而完成数据的传输;同理,在对报头进行识别的过程中,因为每一层协议的不同,此时识别完报头之后,就需要完成解包过程,也就是将该层协议对应的报头去除,最后再根据协议自底向上完成数据传输,并且此时根据协议向上传输数据的过程我们就称为分用。
局域网通信原理
在上述学习有关数据链路层的知识时,我们对局域网通信原理已经有了一定的理解,只不过此时我们需要再来深入学习一下,在上述数据链路层中我们说道,在同一局域网中,我们发送数据给交换机时,交换机会直接根据MAC地址表找到目标地址,然后将数据发送给另一台电脑。但是明白,这是一般情况,此时在局域网中还存在其它两种特殊状态,一种是如果我将我的数据设置为广播状态,那么此时该局域网内的所有电脑都能接收到该数据,只不过因为对应的网卡只会接收发送给自己的数据包,而丢弃其它目标MAC地址的数据包,所以不会接收到我们的数据,然后在局域网中还存在另一种情况,它可以实现抓包功能,也就是如果将网卡设置为“混杂模式”状态,那么该网卡就不会对其它目标MAC地址的数据包进行丢弃,而是直接根据协议栈进行解包和分用功能,将数据显示到应用层当中,获取到该局域网中所有的数据。并且明白,在局域网通信中还可能存在数据包碰撞,也就是当同一时间内,多个设备同时发送数据包给交换机,此时就有可能导致数据碰撞发生,这也就是为什么当同一个网络被多人使用时,会变卡的主要原因。