文章目录
- 网络的认知
- 如何理解协议
- 网络分层
- OSI模型
- TCP/IP五层(或四层)模型
- 网络传输的基本流程
- 协议的参与
- 局域网通信原理
本篇将会引入到网络的话题
网络的认知
第一个问题是,网卡是文件吗?答案是显然的,在Linux下一切皆文件,基于这个原理对于网卡依然是文件,所以第一个建立起的初步认识是,不管是在网络中有各种各样的协议,其实都是向文件当中去写,这其实可以理解很多内容
下图展示了早年的时候数据的基本原理,在最初想要进行协作的过程中,一定是要进行对于数据的拷贝的,那因此就诞生了对于光驱软盘的概念,把数据写到软盘上,再换一台电脑继续进行读取操作,但这样的方法还是太慢了
为了解决这样的问题,于是有了一个新的思路,能不能把这些计算机连接在一起进行相互协作,这样就可以提高一些效率,实现了数据的共享和交互呢?答案是肯定的,于是有了下面的另外一种基本的结构:
上图的结构是一个基本的逻辑结构,所有的电脑就被用线连接在了一起,此时这就已经有了一个计算机的基本雏形,那随着互联网那个的发展,可能会出现有两个很远距离的实验室想要进行数据的通信,能不能产生一种方式,使得一个区域的子网和另外一个区域的子网也能相互连接在一起呢?于是就推动了这样子网之间进行联系的效果:
上图所示的两种结构就是局域网和广域网的概念,当然这两种方式是一种抽象出来的表达方式,但不管怎么说,这两种都可以体现网络的概念,以实现了数据的交互功能
如何理解协议
这里只使用最朴素的方式,协议就是双方约定好的一种通信方式,比如约定两短一长表示某种信息,两长一短表示另外一种信息,这都是协议的体现,而如果想要理解计算机协议,就必须要先理解计算机通信当中会产生什么问题,进而去引到协议的概念中去
下面展示几个基本的问题:
- 如何处理发送来的数据
- 长距离传输的数据丢失问题
- 如何定位主机的问题
- 如何保证数据可以准确到达另外一个设备
上图所示的是四种基本的网络问题,那为了解决这样的问题,就需要在每一层都设置一些相应的协议来通过数据交互解决对应的问题,比如在协议中有各种各样的字段,表示这个数据就是发送给某人的,比如说把主机的ip地址写进去,表示就是给某个特定的ip地址写的,所以每台机器都有对应的ip地址,可以对应到远端主机上,那其他的问题也有对应的协议方法,例如有https,http,ftp等等协议,这些协议都可以来解决对应产生的问题和方法
所以在日常的网络通信当中,单纯传递一个字符串是不可以的,它通常需要伴随一些包裹的信息,比如这是谁发的,这是谁写的,什么时候发的,这些管理数据是一定要有的,而这些多出来的部分就叫做协议,依据这些协议可以更好地进行通信,每次发送信息多出来的那一部分就是协议的内容
那在内核的实现是如何实现的呢?其实很简单,把对应的内容放到一个结构体当中,再把结构体传递出去就可以
网络分层
下面的话题是关于网络分层的话题,对于这个话题来说比较陌生,因此我们引入分层的概念,首先由之前的内容可以知道,在操作系统中是存在分层的概念的,比如说从硬件到驱动,再到操作系统,再到系统调用,这些都是分层的概念,因此才有了下面的这张图的概念
那在网络的知识体系中,分层的概念也是必然存在的,这也是发展的必然结果:
- 网络规模大
在网络进行通信的时候,整个模块的规模是一个非常庞大的规模,那为了解决这样的问题,于是提出了网络分层的概念,想办法把一个一个的模块之间进行解耦,这样就必须要首先进行分层
- 协议问题
协议本身是要用来解决问题的,那如果要是设计为分层的结构,协议进行不断的向下或向上传递,这样就可以更好的解决问题,这也是解决问题的一种方式,那这样的方式用来解决问题是比较优秀的,这样就可以解决很多问题,比如说两台设备之间想要实现通信,那么就必然意味着这两个设备的底层内部会有一系列的转换,最终实现了设备数据的交互,那如果借助了分层的结构,那么解决这样的问题就会方便很多
我们引出下面的这个使用场景:
这个场景主要是说,两个人正在进行通信,那从表面上来看,很明显代表着这两个人是用电话进行沟通的,A和C进行电话进行通信,从逻辑的角度来讲是认为,人和人正在进行沟通,但是从底层来看,其实在这两个人进行沟通的过程中会涉及到很深的内容,而这层很深的内容就是有分层的概念,他们之间进行一层一层的交互
层状结构的好处
谈及到层状结构的好处,就必须要谈及到解耦的好处了,解耦带来的最大的好处就是互不影响,那分层的一个比较大的特点就是非常方便的进行维护,一层出现问题只会影响一层,而不会影响其他层,如果A和C的电话出现了问题,那么就只需要更换电话即可,而电话底层的内部信息没有出现问题,同理,如果把每一层的协议都看成一层,那么总共就拥有着上层中层下层这样的层次结构,因此可以很好的降低维护的成本
那说了这么多,下一个问题是,网络是如何进行分层的?
OSI模型
OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解
TCP/IP五层(或四层)模型
在谈TCP模型之前,我们先思考一个问题,网络协议栈和操作系统有关系吗?前面的分层中,举例举的都是操作系统的分层的概念,那么落实到TCP中,该如何理解这个过程呢?
那下面给出的图,就展示了网络协议栈和操作系统之间的关系
上图所示的就是网络协议栈的基本图示,那下面要补充的一个小结论是,所有的操作系统内部实现都是一样的
该如何理解这句话?再操作系统的内部,不同的操作系统可能会有不同的实现方式,例如有内存管理,进程管理,文件管理,驱动管理,这些管理的方式是五花八门的,不同的操作系统有不同的管理方式,但是不管怎么说,只要符合操作系统的理论就可以,但是到了网络这一块却并不是这样,从网络的角度来看,网络协议栈必须是一样的,每一个操作系统只要想要进行数据通信,那么它内部所搭载的网络协议栈结构必须要是一样的,否则就无法进行入网的操作,具体的原因后续会继续进行补充,这里只需要知道,不管是安卓还是Windows还是其他的操作系统,它们的网络协议栈必须是一样的
有了上图的结论,我们输出的下一条结论是,网络通信的本质,就是贯穿协议栈的过程
该如何理解贯穿协议栈这件事呢?再看下面的图
现在有两台设备,一台手机一台电脑,依据上面的原理,网络协议栈拥有相同的结构,那么这也就意味着每一层的结构体对应的协议等信息都是要认识的,定义的字段等,不管哪一个操作系统都是要认识这些字段的,这是提前规定好的,那在实际的网络通信的原理中,也确实如此,从用户层想要发送给另外一个设备的用户层,必须要全部把网络协议栈都穿透一次,贯穿硬件,必须从硬件上才能发送过去,所以说有这样的结论:网络通信的本质就是贯穿协议
网络传输的基本流程
那下面对于网络传输,建立一个基本的思路流程:
首先,当看到上图的各种应用层,传输层,网络层,链路层等等,首先应该考虑到的是,在这些层的背后其实就代表的是两台机器,那把两台机器的骨架全部摘除,其内部的原理就是这样,而在最后一层,实际上两台设备的通信是借助了以太网的方式来进行的通信
当网络通信进行长距离传输的时候,首先要解决的问题是保证自己的主机和直接连接的主机之间可以通信,凡事和直接连接的这样的网络,就叫做局域网,这个局域网也是比较好理解的一种局域网,比如在家的无线路由器,这个无线路由器的网络就是一个最经典的局域网,而局域网之间的设备都是可以进行通信的,这也就解释了为什么在进行设备投屏这样的场景前,一个必要的条件就是必须要连接在同一个局域网中
局域网的数据是可以进行直接通信的,而这种直接通信必然是有对应的技术保证,那这种技术保证就叫做局域网协议,最典型的例子有以太网,令牌环网,也有无限缆,再比如有无限WiFi,这些设备都是相互联通的,因此是可以直接进行数据交互的
在实现了每一个区域之间都能进行信息交互之后,那接下来的问题就是两个不相关的区域之间该如何进行信息的交互呢?随着历史的发展,时代最终选择了一个最重要的局域网协议,这个名字就叫做是以太网
协议的参与
在本文之前的内容中讲到,对于协议的理解可以简单理解为多余的部分,那在此重新对于协议有一个理解
报文 = 报头 + 有效载荷,那如何理解报头,说到底,报头就是双方都约定好的一个结构体对象,那在应用层当中把用户真正的内容再带上报头组合起来,就组成了报文,之后这个报文就能继续传递,然后再继续带上报文,再继续传递…
当传递到另外一个端口进行解析的时候,就对于这个报文进行解析,找到其中有效的有效载荷,就能对于内容进行解析,进而取出真正需要的内容,我们用下图来表示这么一系列的过程:
那么至此,左侧的过程就叫做是一个自顶向下交付的一个过程,也叫做是一个封装的过程,每一层的报头都会加到最前面,而对于另外一个设备来说,首先抓取到信息的是对应的网卡设备,网卡设备拿到信息之后,就要把数据交给操作系统,而操作系统就会加载到内存中进行对应的数据处理,再根据网络的分层结构,进行一层一层的解包,把包的内容进行解析,最终回到用户层就能拿到包的原始数据了
从这个逻辑过程中不难发现,每一层协议似乎都拥有添加和解除的功能,也能看出对于同层协议来说,怎么发出去的就怎么接受回来,所以说以ip地址为例,左边代码的ip协议结构体的内容右边协议一定是要认识的,不然就不能实现解包的原理了,因此换句话说,通信的过程本质可以看成是不断的进行封装和解包的过程
局域网通信原理
上图展示的是一个最为基本的通信原理,有一个包中包含的内容是,M1到M10,数据信息紧随其后,那么只要是在同一个局域网内的网卡设备都有接受信息的能力,但是不同的是,当非M10的网卡接受到信息之后,会鉴别到这个信息不是给我的,那么就会把这个包进行丢弃,直到当M10检测到这个包,说这个包是传递给我这个当前网卡的,那么就对这个包进行使用
数据碰撞
那加入此时有好多设备同时进行数据传输,那么在进行传输的过程中就会造成数据碰撞的问题,光电信号会进行互相干扰最终导致波形图混乱等问题,所以依据这个原理,如果想要对于一个局域网进行毁坏,其中一个方法就是可以向局域网中发送大量的垃圾信息,这样就可以使得和正常信息进行碰撞,使得这个局域网出现破坏
那这样岂不是乱套了,对此,以太网自然会有自己的解决措施,因此以太网就有一个对应的承受范围,在这个范围内可以避免这样碰撞的产生,可以进行延迟发送等操作