Linux网络概述

写咋前面

今天,我们需要初步的认识一下Linux中网络的基本原理,只有大家对这个有一个初步的认识,后面我们学习起来才会更加的简单容易.计算机语言知识那么多,但是Linux不是.面试时,面试官总是会有问题难住你,我们后面需要看看书,这一点非常重要.我们现在谈的是脉络,.是框架.这些内容足以让我们可以看的下书,甚至可以往下思考,知识点多,我们都在争渡.

网络

我这里是完全的小白,一点没有碰过网络部分,这个也一直是我再进一步最大的障碍,我必须把原理弄懂.网络部分我划分了四个模块,这四个成本要低,代码可能开始写的时候要生涩一点,用多了就是固定套路.今天看第一个–网络基础,也就是整体框架.

计算机背景

我们前面写的所有的代码都是单机的,就是一台机器运行.历史上最早的程序就是的单机的,我们把这个单机的称为独立模式

但是总有些业务需要我们协同开发,例如一份数据需要不同的处理,一个人查找错别字,第二个修改错别字,第三个调整名单的排序.如果要完成这个工作,我们需要三个人分别在不同的时间完成属于自己的内容,那么在那个年代我们该如何做?这里就需要软盘拷贝(注意,那时还没有硬盘),这就需要人参与进去,只要人参与,那么效率总是不会太高.后来有实验室进行研究,这个需求是必要要解决的,他们要是都是人参与进去,效率实在是太低了.恰巧这些实验室都是懂技术的,所以它们用网线把主机连起来,这样不同主机之间就可以通信了,这里就网络的雏形.

重新看待计算机结构

我们需要认识一下计算结构,分析一下网络通信的可能性,为何连起来就可以通信了?这个可不是靠嘴说的.我们前面谈过数据是如何在计算机中流动的,下面的动图就是粗略的画一下.

image-20221231092658973

我们疑惑这些输入输出设备等都是硬件啊,硬件是如何进行数据交互的?你说把数据搬到内存中,它们是如何交互的,硬件和硬件之间一定要用线连起来,否则无从谈起.有的线可以看到,有的是焊接的,但是无论她以何种形式存在,总是有的.一台机器线比较短.所以数据可靠性很强.那么如果我们是两台机器呢

此时,我们就需要把不同的计算机的网卡通过网线 链接起来,这个线可以称之为网线,无限LAN…此时,我们就可以理解计算机体系结构也可以看作一个小型网络,它的内部也是用线连接起来的,只不过比较短罢了,多主机连接与其说是计算机通信,不如说是计算机的网卡链接起来的,通过线来通信,不久是线长了些吗?我们现阶段认为多主机的通信是计算机体系结构的延展.

所以一些 大型的公司都有相应的集群,所谓的集群就是有很多主机,通过线链接起来.可以通过多主机互相连通,构建宏观的冯诺依曼体系结构.它们是不分家的.一般,我们把内存和外设连接的这个线一般称为IO总线,当让也存在不同的线,这里不谈了.

image-20221129152345295

此时我们不得不面对一个问题,主机内比较短,跨主机线很长.线短有短的有优点,长也有长的难点. 如果短了,会有数据干扰问题 ,这个和物理有关,电子流动会形成磁场,会出现信号干扰,我这也不太了解,但是数据一般不会丢失,毕竟线很短, 我们往往要进行纠错,防止比特位反转.长了的话也有很多问题.我们学习网络知识的本质就是我们的线变长了

  • 可靠性 数据丢了,乱了,没到达,重复达到…
  • 效率 这是我们最容易到的,毕竟线有点长
  • 寻找对方问题 如果双方在千里之外, 你是如何准确找到对方.

局域网 & 广域网

什么是局域网?就是一个小团体,主机数量不多.供自己内部使用.在局域网之间为了更好的通信,就有一个交换机硬件,这个后面都会谈.这里就会延伸了很多设备,本质原因就是线变长了.我们举一个例子来理解,假设我在古代张三是北京的本地人,他在北京驻守城墙,此时吃饭的时候就是在家吃饭,但是如果他被派往南京驻守城墙,张三还是想在家吃,此时就会出现很多的驿站,辅助张三进行回家.这就是许多设备为何出现.广域网就是一些局域网之间为了可以通信,它们由组成了合体.它们就是相对的概念,这里我给一个相对明确的区别.

  • 局域网没有路由器这个设备
  • 广域网有路由器,还要接入公网(后面谈)

认识协议

什么是协议?我们现在用一个小例子.开始的时候,打电话很费钱 (包含座机),打电话收费,接电话的好像不要钱,这个我不太清楚.有一个学生张三是80后,准备收拾自己的包袱去上大学,离家远.张三每一个月有几个需求,比如报平安,要钱或者其他事情.此时张三家里有点贫困,想了一个办法,说爸你只要看到是北京的电话,就是我打的.如果电话响了一声就是报平安,响了两声就是没钱了,响了三声就是张三有其他事情,老爸接通电话.这个约定就出现了.此时这爷俩就做了一个约定,这个约定就是一个协议.

还记得不父进程和子进程那里我们写了一个简单进程池.我们约定了写入的数据是4字节,是整数,那么子进程是如何知道的呢?这是我们提前说好的.我们做了两个约定,一个是四字节,另外是一个整数,只不过那时我们没有把他拿出来分析罢了.协议就是通信双方做的一项大家心知肚明的约定,我们按照约定来做自己后续的工作就可以了.计算机是通过01来表示的,但是南北极可以表示01,信号有无可以表示01,如果我们只要约定好双方的格式,就定好了通信的标准.

定义了协议难道就能通信吗?这里是不够的,上面都是是软性层面的,要知道硬件的厂商非常多,操作系统很多,但是由于硬件和软件的不同,导致解释听不懂.例如我们看到平常用汉语交流,但是突然有一个人叫做李四,非要用法语说.此时我们就听不懂了.有的厂商用信号的有无当作01,有的用波峰波谷代表01,反正都是01,但是代表的都不太一样.所以硬件和软件也要遵守约定.表达方式也要一样.此时各大厂商都在发言,说用我的.那么我们应该听谁的,当前那个年代,谁的拳头大,我们就听谁的,那个能力强,我们遵循它,它的技术先进,我们就用,不先进,立马滚蛋.就是这么残酷,你要是不用这个标准,抱歉,你的设备上不了网,用户就不买帐.

协议分层

什么叫做协议分层?这里问一下前面你是如何理解软件分层的,什么是软件分层?我们写的代码,开始时是只有一个main函数.把所有的代码都放进去,后面我们用了函数实现不同的功能,main函数进行调用就可以了,这里我们分了两层. 在C++中,我们谈了继承和多态,我们可以父类的引用或者指针来调用和使用子类的不同的功能.前面我们也谈了Linux下一切皆文件,我们把硬件抽象结构体,一点一点给大家抽离.这里我们必须承认软件是可以分层的.我们有了这个概念.那么我们为何要分层?这是由于越分层,逻辑越清楚.下面就是分层的好处.

  • 把问题归类,那个出现问题,就定位到那一侧
  • 软件上解耦 只有调用和被调用
  • 便于软件维护, 好改代码,出问题好排查,改动的时候不影响其他的代码

网络本身的代码就是层状结构,前面我们谈OS也是一个层状结构.我们最常用的,通过加一层软件层可以解决任何底层差异问题.虚拟地址空间就是这样做的,例如物理内存有可能会越界访问,我们加上了一虚拟地址空间解决了这个问题.

我们举一个具体的例子,例如打电话,张三和李四打电话,此时电话一接通它们就可以通信了.如果这两部电话在生产的时候做出可一些优化,还是不会影响张三和李四的通信,它们又不关心.如果张三和李四使用英文交流,这个手机也不会在乎.

OSI 7层模型

这里我有一个问题,张三和李四打电话的时候,张三和李四是不是在直接沟通呢?不是,手机把信息采集好,通过设备做转化,转述给其他人.也就是它们沟通的时候底层做了很多的事情,但是张三和李四不关心,他们会认他们在之间沟通.同样的,两部手机也是如此.**也就是在层状结构下,我们认为,在同一层的自己和他人之间是直接通信的,我们不关心底层是如何实现的.**这就是导致了同层之间必须有自己独有的协议.

既然网络是层状的,那么有哪些层呢?有一个组织叫OSI,它定义了一个协议,把网络划分了七层.现在你可能还不太理解,这里先记住.

image-20221129163909409

TCP/IP五层(四层)模型

上面这个标准是非常好的,但是由于有几层不好实现,实际是四层,如果我们要是把物理层纳入的话就是五层.

  • 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
  • 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
  • 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
  • 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
  • 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.

image-20221129164556314

这些我们认识一下,有点印象就可以了.我们后面的代码都是关于应用层的.

网络和操作系统的关系

我们需要分析一下网络分层模型和OS的联系.上面我已经在图上表示出来了.注意,我们谈的是每一层的核心功能.

image-20221129173025850

注意,OS必须向上提供接口,tcp/ip协议和OS之间的关系是,OS中有一个模块,就叫做tcp/ip协议. 也就是网络协议是隶属于操作系统的.也就是不同的操作系统必须内置自己的协议.也就是OS的结构决定,数据包在主机内流动的时候,一定是要进行自顶向下或者自底向上的流动的.

20230104_160405

同时上面我们说了同层协议都认为自己在和对方直接通信,他不关心底层和上层,只需要知道同层的数据是一样的就可以了.

再谈协议

我们需要重新认识一下协议,前面我们知道了协议一种约定.那么我们想问约定有没有成本呢?我们是不是应该把约定给记下来,否则我们忘记了怎么办?也就是约定是需要成本的.对于计算机而言,它看待协议实从两个方面分析的,一个是代码逻辑,一个是数据上.假设你在网上买了一个鼠标,快递员会仅仅给你一个鼠标吗?不是的,你收到的是一个包裹,这里面有鼠标,可是我们只想要一个鼠标,他多给了我一些东西.这个包裹不是重要的,上面的快递单才是.这快递单上面填的是数据,数据的作用是填写发货人和收货人的信息.这个单子是给快递公司看的,这个快递单是快递公司和快递小哥的协议.

封装 & 解包

协议是需要成本的,也就是为了维护协议,我们一定要在被传输数据上面新增数据,这些数据就是协议数据.每一层根据自己独有协议有不同的动作.我们把每一层根据协议添加的数据称之为报头.每一次层都有自己的协议,也就是每一层都有自己的报头.此时我们把添加数据称之为封装,把删除报头称之为解包.

分用

我们知道每一层的协议可能不只有一个,那么我们如何能够确保我们的数据往下或者往上走的时候是可以到达确定的协议呢?例如向上交付给TCP还是UDP协议呢?这里我想说的是数据包在添加报头的时候,也会考虑未来解包的时候交付给上层的哪一个协议.我们把确保报头可以指定协议的过程称之有效载荷的分用的过程.

image-20230207114457551

我们这里产生两个结论.

  • 一般而言,任何报头属性里面一定存在一些字段支持我们进行封装和解包
  • 一般而言,任何报头属性里面一定存在一些字段支持我们进行分用

以太网

我想问问大家一个问题,处于同一个局域网的不同主机可以直接通信吗?实际上可以的,我们再以前的时候玩单机游戏我们可以创建房间,这个时候我们没有联网却可以和朋友一起玩.以太网是局域网的一种标准.

在一间教室中,我正在给一群学生上课,此时是我说:“张三你的作业交了吗?”.此时张三站起来回答了这个问题 ,那么请问其他的同学为何不站起来.我说话的时候,同学们都听到了,甚至张三说话的时候其他同学都都听到了,那么请问其他的同学为何不参与我和张三的通信,因为不管其他同学的事.也就是我和张三通信,我们认为在单独通信. 每一个同学在教室要有名字 ,这个名字唯一标识这个主机,计算机中用MAC地址,是机器网卡自带的, 都不一样.

第二天我继续上课, 这次我还是叫张三.但是李四和王五在沟通,赵六和田七打起来了,教室里面乱哄哄的.此时张三可能听不到我说的话,我也可能听不到张三的回话.也就是任何一个主机在任何时刻都会发消息,所有的信息会互相干扰,这是一个碰撞域的概念. 我们需要识别这种碰撞,比如我看别人在说,这叫做碰撞检测,如果别人说了,我就暂时不说,这是碰撞避免.这就是局域网的原理,只能让一个人说话.

你在说的时候我也在说,别人也在写,以太网换一个角度,是临界资源.我们的碰撞避免不就像是一个加锁吗,实际上是的,例如后面令牌环网理念和我们的加锁是差不多的.

网络传输流程图

我们简单的画一下网络传输的流程图,这里我们想分为两个情况进行讨论.

同一网段

我们知道处于同一个局域网的两台主机是可以直接通信的,这就是我们上面数据分包和解包的过程.

20230104_160405_1

不同网段

如果我们想要在不同的网络中进行跨网络进行通信,那么此时必定会有一个路由器,该路由器横跨至少两个不同的网络.也就是我们想要把数据帧转到对方,必定要先把数据放在路由器中,我们可以把路由器看作在不同的网段里面的主机.

image-20230302214352331

下面我们开始画一下流程图,让我们了解一下在不同的网段中数据是如何流动的.

20230302_214723_1

认识 IP 地址

我们必须暂停一下.谈一个例子,在唐僧西天取经的时候,化缘的时候唐僧说的话大概意思是:“施主你好,贫僧从东土大唐而来,前往西天派佛求经的”.对于路途中的唐僧而言,一定会存在这样的常见,他上一站是车迟国,下一站是女儿国(应该是不正确的).我们疑惑为何下一站是女儿国呢?为何不是其他的地方,这是由于有人告诉他要去西天取经,必须向西前进,那么下一站就是女儿国.常识告诉我们一般在进行路径选择的时候,我们身上存在两套地址.从哪里来,到哪里去?和上一站是哪里,下一站到哪里去?那么请问下一站去哪里由谁决定呢?这里是我们的目的地.这里就分成了两个地址.

  • MAC地址 : 从那里来,到那里去 细分源MAC地址和目的MAC地址
  • IP地址 : 上一站从哪里来,下一站到哪里去 细分源IP地址和目的IP地址

先来说一下不太准确的定义,MAC地址在局域网标定主机的唯一性,IP地址标定在广域网中或者公网中主机的唯一性.

此时我们主机的IP地址是IPA,我们知道我们要去的地方是IPB,我看到IPB不在我们当前的局域网中,那么我们一定要先把我们数据进行转发交给路由器,此时路由器横跨两个网段,它有能力把数据给IPB,他一看IPB在我们这个网段中,因此把数据给IPB了.我们继续进行动图.

20230302_214723

此时我们可以这么说站在IP层向上看到的报文都是一样的,所以我们也把网络称之为IP网络.IP网络屏蔽了底层的差异.,这不就是加上一层理念来屏蔽差异吗.

image-20230302212434831

通信原理

所有的数据我们必须要在网线上跑,假设你的辅导员今天在A栋教学楼,辅导员找你让你把一些文件送到F栋教学楼,此时你拿到文件首先要做的就是下楼,可是你不认识去F楼的路,不过不用担心,每一栋楼下面都有门卫,你每经过移动宿舍楼你告诉他想去F楼,门卫会给你指路,他有可能说你按照这条线一直走,看到下一个楼之后继续问那栋楼下单位门卫,这样你便可以慢慢的找打F楼,这就是我们计算机在不同的网段中通信的原理.

20230302_220053

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高通开发系列 - Sensors Bring Up

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回高通开发系列 - 总目录 目录 问题背景高通android sensor信息Sensors Execution Environment (SEE)qxdm抓sensor log的方法android 调试…

Java 中SimpleDateFormat 错误用法及改正

正确用法 1. 每次都 new正确用法 2. 加锁正确用法 3. 使用 ThreadLocal 容器正确用法4. 改用 DateTimeFormatter(推荐)开发 Java 项目时经常操作时间、日期与字符串的互相转换,最常见简单的方式是使用 SimpleDateFormat,想必大家对…

GPT-4 API 接口调用及价格分析

GPT-4 API 接口调用及价格分析 15日凌晨,OpenAI发布了万众期待的GPT-4!新模型支持多模态,具备强大的识图能力,并且推理能力和回答准确性显著提高。在各种专业和学术基准测试上的表现都媲美甚至超过人类。难怪OpenAI CEO Sam Altm…

优思学院|2023年如何成为一名六西格玛黑带?

如果你总感到无论如何努力工作都没有任何进步,我可以告诉你,你并不孤单。 事实上,许多调查报告都显示,惊人的90%的人对自己的工作都不满意,这就是说在你认识的每10个人中,只有1个人对自己的工作感到满意。…

JAVA开发(Spring Gateway 的原理和使用)

在springCloud的架构中,业务服务都是以微服务来划分的,每个服务可能都有自己的地址和端口。如果前端或者说是客户端直接去调用不同的微服务的话,就要配置不同的地址。其实这是一个解耦和去中心化出现的弊端。所以springCloud体系中&#xff0…

初探Gradle

目录一.概述二.优点三.安装与配置1. 官网下载2. 配置环境变量3. 检验4. 配置国内镜像(可选)5. IDEA配置三.工程结构四.生命周期1.Initialization阶段2.Configuration阶段3.Execution阶段五.Task六.常用任务指令七.引入依赖1.本地依赖2.项目依赖3.直接依赖八.依赖类型九.插件十.…

【C语言】数据在内存中的存储

目录 数据类型的介绍 类型的基本归类 整型家族 浮点型家族 构造类型 指针类型 整型在内存中的存储 原码、反码、补码 图例 ​编辑 大/小端存储模式的介绍 大/小端存储模式的概念 大/小端存储模式的意义 图例 浮点型在内存中的存储 单精度浮点数的存储图例 …

网络安全的特性

0x00 前言 网络安全的特性包括,机密性,完整性,可用性,真实性和不可否认性。详细的内容可以参考如下的内容。 Xmind资源请下载~ 0x01 机密性 机密性(Confidentiality) 意味着阻止未经授权的实体&#x…

操作系统(1.3)--习题

一、课堂习题 1、一个作业第一 次执行时用了5min ,而第二次执行时用了6min,这说明了操作系统的( )特点。 A、并发性 B、共享性 C、虚拟性 D、不确定性 D 2、在计算机系统中,操作系统是( )。 A、处于裸机之上的第一层软件 B、处于硬件之下的低层软件 C、处于应用软件之上的系统软…

内联函数和模版函数的常见错误、以及其为什么可以将其声明和定义在头文件实现并被多个源文件引用

内联函数和模版函数的常见错误、以及其为什么可以将其声明和定义在头文件实现并被多个源文件引用1 编译器对内联函数的处理1.1 编译阶段1.2 汇编阶段1.3 链接阶段(编译器不对一个内联函数进行内联展开时不出现重定义问题的原因)2 内联函数的声明和定义2.…

基于鲸鱼算法的极限学习机(ELM)分类算法-附代码

基于鲸鱼算法的极限学习机(ELM)分类算法 文章目录基于鲸鱼算法的极限学习机(ELM)分类算法1.极限学习机原理概述2.ELM学习算法3.分类问题4.基于鲸鱼算法优化的ELM5.测试结果6.参考文献7.Matlab代码摘要:本文利用鲸鱼算法对极限学习机进行优化,并用于分类问…

艹,终于在8226上把灯点亮了

接上次点文章ESP8266还可以这样玩这次,我终于学会了在ESP8266上面点亮LED灯了现在一个单片机的价格是几块,加上一个晶振,再来一个快递费,十几块钱还是需要的。所以能用这个ESP8266来当单片机玩,还是比较不错的可以在ub…

python学习——【第一弹】

前言 Python是一种跨平台的计算机程序设计语言,是ABC语言的替代品,属于面向对象的动态类型语言,最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。 从这篇…

vue模板语法

src目录文件说明: 1,数据绑定{{}} 数据绑定最常见的形式就是使用{{}}(双花括号)语法的文本插值 在template中使用{{}}文本插值语法中,设置一个变量,再在script中引入data函数,在return中进行数…

盘点Python那些简单实用的第三方库

文章目录前言关于本文使用 pip 命令下载第三方库1、phone 库(获取手机号码信息)2、geoip2 库(IP 检测功能)3、freegames 库(免费小游戏)4、jionlp 库(解析地址信息)5、pyqrcode 库&a…

基础入门 HTTP数据包Postman构造请求方法请求头修改状态码判断

文章目录数据-方法&头部&状态码请求requestResponse状态码案例-文件探针&登录爆破工具-Postman自构造使用数据-方法&头部&状态码 请求request 1、常规请求-Get 2、用户登录-Post •get:向特定资源发出请求(请求指定页面信息&#x…

字符串函数的模拟实现

文章目录前言函数介绍strlen 函数strcpy 函数strcat 函数strcmp函数strncpystrncatstrncmpstrstrstrtokstrerrormemcpy 函数memmove 函数memcmp 函数前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符…

手撕数据结构与算法——树(三指针描述一棵树)

🏆作者主页:king&南星 🎄专栏链接:数据结构 🏅文章目录🌱树一、🌲概念与定义二、🌳定义与预备三、🌴创建结点函数四、🍀查找五、🍁插入六、&a…

【C++初阶】4. Date类的实现

如果下面博客有不理解的地方,可以查看源码:代码提交:日期类的实现 1. 构造函数的实现 由于系统实现的默认构造函数即便采用默认值的形式也只能存在1个固定的默认日期(例如:1997-1-1)。所以,构…

【剑指offer】10~11.斐波那契数列(C# 实现)

文章目录前言关于编译环境10- I. 斐波那契数列10- II. 青蛙跳台阶问题11. 旋转数组的最小数字结语前言 🍀 大家好,我是哈桑。这是自己的 C# 做题记录,方便自己学习的同时分享出来。 关于编译环境 注意,笔者使用的编译环境是 .NET …
最新文章