Linux:网络的初步认知

文章目录

  • 网络的认知
  • 如何理解协议
  • 网络分层
  • OSI模型
  • TCP/IP五层(或四层)模型
  • 网络传输的基本流程
    • 协议的参与
    • 局域网通信原理

本篇将会引入到网络的话题

网络的认知

第一个问题是,网卡是文件吗?答案是显然的,在Linux下一切皆文件,基于这个原理对于网卡依然是文件,所以第一个建立起的初步认识是,不管是在网络中有各种各样的协议,其实都是向文件当中去写,这其实可以理解很多内容

下图展示了早年的时候数据的基本原理,在最初想要进行协作的过程中,一定是要进行对于数据的拷贝的,那因此就诞生了对于光驱软盘的概念,把数据写到软盘上,再换一台电脑继续进行读取操作,但这样的方法还是太慢了
在这里插入图片描述
为了解决这样的问题,于是有了一个新的思路,能不能把这些计算机连接在一起进行相互协作,这样就可以提高一些效率,实现了数据的共享和交互呢?答案是肯定的,于是有了下面的另外一种基本的结构:

在这里插入图片描述
上图的结构是一个基本的逻辑结构,所有的电脑就被用线连接在了一起,此时这就已经有了一个计算机的基本雏形,那随着互联网那个的发展,可能会出现有两个很远距离的实验室想要进行数据的通信,能不能产生一种方式,使得一个区域的子网和另外一个区域的子网也能相互连接在一起呢?于是就推动了这样子网之间进行联系的效果:

在这里插入图片描述
在这里插入图片描述
上图所示的两种结构就是局域网和广域网的概念,当然这两种方式是一种抽象出来的表达方式,但不管怎么说,这两种都可以体现网络的概念,以实现了数据的交互功能

如何理解协议

这里只使用最朴素的方式,协议就是双方约定好的一种通信方式,比如约定两短一长表示某种信息,两长一短表示另外一种信息,这都是协议的体现,而如果想要理解计算机协议,就必须要先理解计算机通信当中会产生什么问题,进而去引到协议的概念中去

下面展示几个基本的问题:

  1. 如何处理发送来的数据
  2. 长距离传输的数据丢失问题
  3. 如何定位主机的问题
  4. 如何保证数据可以准确到达另外一个设备

上图所示的是四种基本的网络问题,那为了解决这样的问题,就需要在每一层都设置一些相应的协议来通过数据交互解决对应的问题,比如在协议中有各种各样的字段,表示这个数据就是发送给某人的,比如说把主机的ip地址写进去,表示就是给某个特定的ip地址写的,所以每台机器都有对应的ip地址,可以对应到远端主机上,那其他的问题也有对应的协议方法,例如有https,http,ftp等等协议,这些协议都可以来解决对应产生的问题和方法

所以在日常的网络通信当中,单纯传递一个字符串是不可以的,它通常需要伴随一些包裹的信息,比如这是谁发的,这是谁写的,什么时候发的,这些管理数据是一定要有的,而这些多出来的部分就叫做协议,依据这些协议可以更好地进行通信,每次发送信息多出来的那一部分就是协议的内容

那在内核的实现是如何实现的呢?其实很简单,把对应的内容放到一个结构体当中,再把结构体传递出去就可以

网络分层

下面的话题是关于网络分层的话题,对于这个话题来说比较陌生,因此我们引入分层的概念,首先由之前的内容可以知道,在操作系统中是存在分层的概念的,比如说从硬件到驱动,再到操作系统,再到系统调用,这些都是分层的概念,因此才有了下面的这张图的概念

在这里插入图片描述
那在网络的知识体系中,分层的概念也是必然存在的,这也是发展的必然结果:

  1. 网络规模大

在网络进行通信的时候,整个模块的规模是一个非常庞大的规模,那为了解决这样的问题,于是提出了网络分层的概念,想办法把一个一个的模块之间进行解耦,这样就必须要首先进行分层

  1. 协议问题

协议本身是要用来解决问题的,那如果要是设计为分层的结构,协议进行不断的向下或向上传递,这样就可以更好的解决问题,这也是解决问题的一种方式,那这样的方式用来解决问题是比较优秀的,这样就可以解决很多问题,比如说两台设备之间想要实现通信,那么就必然意味着这两个设备的底层内部会有一系列的转换,最终实现了设备数据的交互,那如果借助了分层的结构,那么解决这样的问题就会方便很多

我们引出下面的这个使用场景:

在这里插入图片描述
这个场景主要是说,两个人正在进行通信,那从表面上来看,很明显代表着这两个人是用电话进行沟通的,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检测到这个包,说这个包是传递给我这个当前网卡的,那么就对这个包进行使用

数据碰撞

那加入此时有好多设备同时进行数据传输,那么在进行传输的过程中就会造成数据碰撞的问题,光电信号会进行互相干扰最终导致波形图混乱等问题,所以依据这个原理,如果想要对于一个局域网进行毁坏,其中一个方法就是可以向局域网中发送大量的垃圾信息,这样就可以使得和正常信息进行碰撞,使得这个局域网出现破坏

那这样岂不是乱套了,对此,以太网自然会有自己的解决措施,因此以太网就有一个对应的承受范围,在这个范围内可以避免这样碰撞的产生,可以进行延迟发送等操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Trait与生命周期

原文链接:(*∇`*) 咦,又好了~ Rust – xiaocr_bloghttp://www.xiaocr.fun/index.php/2024/03/18/trait%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ 目录 Trait 定义trait 默认实现 trait作为参数 Trait Bound语法 通过指定多个 trait bound …

opengl日记12-opengl坐标系统

文章目录 环境代码CMakeLists.txtvertexShaderSource.vsmain.cpp 总结 环境 系统&#xff1a;ubuntu20.04opengl版本&#xff1a;4.6glfw版本&#xff1a;3.3glad版本&#xff1a;4.6cmake版本&#xff1a;3.16.3gcc版本&#xff1a;10.3.0 在<opengl学习日记11-opengl的t…

Java:接口

目录 1.接口的概念2.接口的语法规则3.接口使用4.接口的特性5.实现多个接口6.接口中的继承7.抽象类和接口的区别 1.接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以…

pycorrector检测OCR错字实践

参考&#xff1a;https://github.com/shibing624/pycorrector/tree/master/examples/macbert stopwords.txt 添加专业停用词&#xff0c;避免错误 设置自定义词典&#xff0c;避免将正确的词错误检测成错误的词 from pycorrector import Corrector m Corrector() m.set_cus…

Windows系统部署GoLand结合内网穿透实现SSH远程Linux服务器开发调试

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-HIOuHATnug3qMHzx {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

把软件加入开机自启动

注意这个方法最佳效果是适用于打开软件后,关闭窗口不会停止服务 例如 nginx 1.把nginx的快捷方式放到如图所示的文件夹下 C:\Users\KIA_27\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 注意KIA_27应改为你自己的用户名

一维前缀和一维差分(下篇讲解二维前缀和二维差分)(超详细,python版,其他语言也很轻松能看懂)

本篇博客讲解一维前缀和&#xff0c;一维差分&#xff0c;还会给出一维差分的模板题&#xff0c;下篇博客讲解 二维前缀和&二维差分。 一维前缀和&#xff1a; 接触过算法的小伙伴应该都了解前缀和&#xff0c;前缀和在算法中应用很广&#xff0c;不了解也没有关系&#…

24计算机考研调剂 | (研究所)北京微电子技术研究所

北京微电子技术研究所2024年考研调剂信息 调剂信息 一、招生专业 二、调剂对象 统考科目为思想政治理论、英语&#xff08;一&#xff09;、数学&#xff08;一&#xff09;&#xff1b;本科为电子科学与技术、微电子学、集成电路设计、电子信息工程、通信工程、计算机科学与…

Java Day13 多线程

多线程 1、 方式一 Thread2、实现Runnable接口3、实现 Callable接口4、与线程有关的操作方法5、线程安全问题5.1 取钱案例5.2 线程同步5.2.1 同步代码块5.2.2 同步方法5.2.3 Lock锁 6、线程池6.2 创建线程池6.2.1 使用ExecutorService创建新任务策略6.2.2 使用Executors工具类创…

3.21小题总结

第一题&#xff1a;生日蛋糕 题解&#xff1a;这题是蛋糕结构是一层一层的&#xff0c;估计很多人很快就能想到是dfs&#xff0c;但是这题的难想的点在于 你每层的状态该怎么去确定&#xff0c;你怎么来确定每层的半径和高度是多少&#xff0c;一开始我也不知很理解&#xff0…

82.删除排序链表中的重复元素II

给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5]示例 2&#xff1a; 输入&#xff1a;head [1,1,1,2…

贝尔曼方程【Bellman Equation】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 文章目录 强化学习笔记一、状态值函数贝尔曼方程二、贝尔曼方程的向量形式三、动作值…

刷题28-30(力扣0322/0078/0221)

0322. 零钱兑换 题目&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。你可以…

【微服务】Nacos配置管理

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;微服务 ⛺️稳中求进&#xff0c;晒太阳 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&am…

DPDK-RCU的简明使用

文章目录 摘要RCU的基本概念DPDK RCU Library的使用其他 摘要 本文主要介绍DPDK中RCU Library的使用。 在使用这个库之前&#xff0c;我们先了解RCU的基本概念。 掌握RCU的基本概念后&#xff0c;便可轻松的使用这个库。 RCU的基本概念 参考&#xff1a;Linux内核同步机制之…

深度学习模型部署-番外-TVM机器学习编译

什么是机器学习编译器/AI编译&#xff1f; 图片来自知乎大佬的文章 机器学习编译是指&#xff1a;将模型从训练形式转变为部署模式 训练模式&#xff1a;使用训练框架定义的模型部署模式&#xff1a;部署所需要的模式&#xff0c;包括模型每个步骤的实现代码&#xff0c;管理资…

什么是代理IP?TikTok运营需要知道的IP知识

对于运营TikTok的从业者来说&#xff0c;IP的重要性自然不言而喻。 在其他条件都正常的情况下&#xff0c;拥有一个稳定&#xff0c;纯净的IP&#xff0c;你的视频起始播放量很可能比别人高出不少&#xff0c;而劣质的IP轻则会限流&#xff0c;重则会封号。那么&#xff0c;如何…

插入排序+希尔排序

目录 插入排序&#xff1a; 希尔排序&#xff1a; 插入排序&#xff1a; 注意这里不要将插入排序和冒泡排序弄混&#xff1a; 插入排序是将数据不断放入前一个有序数列&#xff1a; // 插入排序 void InsertSort(int* a, int n) {for (int j 1; j < n; j){for (int i j;…

Java类的多态作用及解析

多态是面向对象编程中一个重要的特性。简单来说&#xff0c;多态就是指同一个方法在不同的对象上有不同的实现。通过多态&#xff0c;我们可以在运行时根据对象的实际类型来动态地调用相应的方法&#xff0c;从而提高代码的灵活性和可扩展性。 以下是 Java 类中多态的一些作用…

如何用HBuider x网页制作蜡笔小新

目录 下载软件 ​编辑 一.制作蜡笔小新个人介绍界面 二.制作蜡笔小新我的偶像界面 三.制作蜡笔小新我的家乡界面 四.制作蜡笔小新会员注册界面 下载软件 一、HBuilder IDE的下载 HBuilder下载官网地址&#xff1a;http://www.pc6.com/mac/140609.htmlHBuilderX官方电脑版…