Linux学习记录——이십팔 网络基础(1)

文章目录

  • 1、了解
  • 2、网络协议栈
  • 3、TCP/IP模型
  • 4、网络传输
    • 1、同一局域网(子网)
    • 2、局域网通信原理
    • 3、跨一个路由器的两个子网
    • 4、其它


详细的网络发展历史就不写了

1、了解

为什么会出现网络?一开始多个计算机之间想要共享文件,就得一点点存起来,然后给另一个计算机读取,久而久之,这样就是个麻烦事,所以出现了网络,将几台机器都处于一个网络环境下,就可以更好地通信了。当这个范围不断扩大,越来越大的区域都可以用网络了,之后网络开始往民间发展,各个地区之间,各个国家之间也就都能通过网络联系了。

几台机器通过网络形成通信,这也就组成了一个局域网,两个局域网通过交换机,路由器等相互连接,就形成了一个广域网,也可以说成一个更大的局域网。网络能连接如此多的个体,必然要有规则来约束其沟通,也就出现了协议。网络间的协议为什么存在?这就像两个人之间形成某种约定一样,本质上是为了更高效地沟通效率。一个协议通常由行业中的顶级组织来决定,提出规则后,并不一定要由提出者来完成整个协议的实现,而是由行业内顶级的团队来做。

如果要发信息到欧洲,传输距离变得很长,只有两台机器之间发送是很难保证成功的,所以会通过很多中间机器来传输信息,这也就保证信息的不丢失,但即使这样,如何保证就一定能不丢失,并且还能准确地发送到对应的主机上呢?这个问题之后会写。出现上述事实的原因就是传输距离变长了,所以问题是有前后上下关系的,所以在设计网络功能时,不同的功能设计成不同的模块,这就是低耦合;有了问题,就有了需求,就需要解决,网络通信还有很多不同性质的问题,要高效地解决它们,需要把相关的问题放在一起,做出解决方案,不相关的不要放在一起,这就是高内聚。通过高内聚,低耦合,可以设计出很多模块,这些模块被设计成层状结构,体现了前后关系。

传输距离的变长,衍生出新的问题,需要制定网络协议来约束信息的传输
协议被设计成层状结构,各种问题按照高内聚,低耦合的方式组织成层状结构,方便维护代码和方案的设计

分层设计,这种设计在学习C++时学到过,就是继承体系,一个基类可以有多个派生类,用基类指针指向不同派生类对象,就可以使用对应派生类对象的方法,在外部看来,只有基类,但内部却有很多派生类,这就是一切皆基类;C语言库中,用FILE结构体来封装了各种文件的系统接口,用户只需要使用FILE就可以调用系统接口,通过这个结构体来屏蔽了各种接口之间的差异,这也是种分层思想;每个进程都有虚拟地址空间,它们以同样的视角来看待自己要使用的空间,地址空间里屏蔽了硬盘,内存等硬件,而是通过页表,地址空间来访问它们,这也是分层结构,硬件在下面,地址空间在上面,进程在更上面;所以分层可以屏蔽软件,也可以屏蔽硬件,任何计算机问题都可以添加软件层来解决。

协议分层有什么好处?层与层之间通过接口进行交互,比如打电话,人和人之间属于一层,通信设备属于一层,还有电话的协议,语言等层,拨电话就像是给电话传参,通信时就是使用设备来输入输出。上层不关心下层的实现,任何一层出现问题,都不会直接影响另一层,减少后期开发者的维护成本,各层解决各层的功能,就是高内聚,不同层只通过接口交互,没有其它操作,就是低耦合。

分层有好处,但也可以不分层。分层是一种选择。

2、网络协议栈

OSI定义了网络协议层,这是一个七层结构。从低到高,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。这个协议层是很完美的一个设计,不过实际应用中,因为很多细节不能在OSI的这个模型中实现出来,它的很多模块功能不能由网络协议层来实现,它的协议层不是全由操作系统来实现,会话、表示、应用没有实现,这三层会被压缩成应用层,因为会话表示应用要自己实现出来,而在我们使用中,不考虑物理层,所以总体就是四层。我们实际使用的就是TCP/IP五层模型,包括应用层,传输层,网络层,链路层,物理层。

OSI定制了标准,但不是OSI实现出来的。

像TCP/IP五层模型,OSI七层模型就是协议栈。

对于计算机来说,它也有分层,最下面是硬件层,往上走,驱动层,系统层,系统层里的最上方有系统调用层,应用层/用户层。使用计算机的时候就是在通过操作系统给的系统调用来操作硬件,网络也是一样,它也有系统给到它的系统调用,用户通过系统调用来操作网络。

网络的分层和计算机分层相对应,物理层对物理层,比如有网卡硬件,链路层对驱动层,网络层和传输层对系统层,应用层对用户层。传输层和网络层属于操作系统,网络的应用层对应计算机的用户层,由用户来实现,用户也包括开发人员,程序员这些,传输层最具有代表性的是TCP协议,网络层最具有代表性的是IP协议。系统层里的系统调用层有网络的系统调用,还有很多其他东西的系统调用。网络本质就是系统的一部分,网络的核心部分属于操作系统,所以网络协议栈会被叫做TCP/IP协议栈,取核心来起名的。对于系统来说,一切皆文件,网卡也是文件,而协议栈就属于文件系统的一部分,系统也会用管理文件的方式来管理他们,所以很多网络接口,和文件也有关系。操作系统的种类非常多,但网络只有一种,不管系统如何,网络协议栈的实现都一样。

3、TCP/IP模型

TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。

在这里插入图片描述

数据链路层是负责传送数据帧和检查的,物理层发出来的信息,要通过数据链路层来识别出来,才可以被使用。链路层有很多局域网通信标准,比如以太网,无线LAN,但网络不是只有一种吗?链路层的标准不只有一个,链路层的实现是在网卡驱动内部实现的,所以链路层会有不同的标准,而网络只有一种指的是操作系统层的,那里只有TCP/IP,但链路层可以有不同,由驱动程序内部实现,但这些标准也遵守TCP/IP协议。

网络层就有IP地址,win + R,输入cmd,然后输入ipconfig就可以查看到自己电脑的IP地址,无线局域网中IPv4地址。而Linux中,输入命令ifconfig,在第二行inet后面的地址是云服务器的内网地址/私有IP。网络层可以指定某一个主机。路由器工作在网络层。

网络层让主机之间有能力传送过去数据,但不一定做得到,而传输层就是保证传输成功的。

应用层解决数据如何使用的问题,也就诞生了很多软件。

在这里插入图片描述

工作在哪一层,就一定拥有下面的所有层,通常不会使用在上面的层,比如路由器不会使用传输层,不过现在的硬件来讲,很多都集成了上层的东西,比如有的路由器也有应用层的方法。

4、网络传输

1、同一局域网(子网)

同一局域网的两台机器,可以直接通信。两个主机通信的本质,是两个主机的OS与网络协议栈在通信。

在这里插入图片描述

每一层都有自己的协议,协议的表现形式是协议报头,也就是每一层都有自己的协议报头,这个报头相当于一个说明书。聊天发送信息,信息在应用层,信息前加上应用层的报头,传给传输层,应用层报头+信息整体,再加上传输层报头,传给网络层,直到最后的物理层,信息前面就有四个报头。根据冯诺依曼体系,用户发送的信息会先给硬件,然后由硬件,再交给收信息的人的链路层,网络层,一层层向上传,每一层都识别自己的报头。每一层都把上一层交付给自己的数据当作自己的有效载荷,当前层给有效载荷添加报头就是在做封装。而且可以发现,发送者和接收者的每一层得到的数据都是一样的,所以在逻辑上,同层协议都认为自己在和对方的同层协议在通信。并且同层协议都能够互相认识对方的报头,就能够将报头和有效载荷分离,将有效载荷交付给上层的哪一个具体协议。==每一层的协议都得能分离报头和有效载荷以及交付给上层有效载荷。==有效载荷交付给上层的功能叫做数据报分用;用户发的信息,通过每一层加报头传给硬件,这是封装;硬件逐一给到上面的层,每一层都会解包,以及数据分用,就会成功发出信息。这也就是数据如何在两台主机之间流通。

2、局域网通信原理

数据在主机中的运作已经了解了,那么在局域网中,还没到主机前数据是如何被运作的?

发送的信息每一个主机都会接收,然后封装交给自己的网卡,网卡会去解包,如果发现不是和自己有关的数据,就会丢弃,是自己的就继续传给上一层。不过网卡可以设置成混杂模式,这个模式什么数据都接收,都向上传,这也就是抓包工作的做法。

任何时刻,局域网中只允许一个人向局域网中发送消息,如果有很多人发,就有可能导致数据碰撞问题,比如很多人都去一个网站抢考试位置,这个网站就有可能崩掉。但局域网是怎么让很多人发信息的?不是只让一个人吗?这个问题后续再写。

任何人要通信,需要有唯一的一个标识符,比如自己的名字。机器也是一样,每台计算机都有网卡,网卡在出厂时就在网卡内部写入了网卡的sn号,也就是MAC地址,这个号是全球唯一的标识符。

3、跨一个路由器的两个子网

首先认识路由器。路由器有3层功能,第一层是网络层,第二层是链路层,第三层是物理层。路由器也是一台主机(节点),路由器至少连接两个子网,至少有两个网络接口。

在这里插入图片描述

以太网和令牌环是局域网通信的两个标准,对应着不同的链路层实现方案,链路层处于驱动程序中,也就是两者的驱动就不一样。路由器有两个子网,一个连接以太网,一个连接令牌环。

用户发送信息后,添加报头,一直传到最下面一层,但以太网,令牌环都不是只有路由器这一个主机,它们可能还有其它主机,那么为什么就可以指定给到路由器?每一个主机都会被标识,通过主机的IP地址来标识,也就是IPv4地址,这是一个4字节的整数,我们电脑上的IP地址是从0.0.0.0到255.255.255.255的,每个位置能表示0~255(2^8),总共8个比特位,总共32个比特位,4个字节。这种字符串风格的点分十进制方案的地址是给人看的,但机器不认它,机器要把它转成4字节,每一个字节8个比特位,就能取出这个字符串IP地址。网络协议栈的核心TCP/IP协议是在网络层和传输层,这两个层在操作系统中,所以TCP/IP是内核中的,内核是C语言实现的,TCP/IP也是C语言实现的。这个转换是用位段来实现的。

struct ip
{int patr1: 8;int part2: 8;int part3: 8;int part4: 8;
}int srcIp = xxx;
struct ip *p = (struct ip*)&srcIp;
p->part1;//这样就能找到每一部分的数字
p->part2;
...

IP地址能够唯一标识公网环境下的主机。网络层有一个路由表,也就是IP协议所在的那一层。用户在发消息时,也会被加上要发给谁的信息,传到了网络层时,会根据接收者IP地址和路由表来判断发给谁。发送者只知道自己在哪个网络中以及接收者的IP地址,路由表也不知道发给谁,但它知道数据不是发给自己所在网络的其他主机的,比如它知道不是发给以太网中其他主机的。数据到了网络层,网络层会添加一个目的报头,是接收者的IP地址,然后给到路由器,路由器通过路由表知道了要发给谁,路由器再把这些信息给自己的链路层,链路层会添加一个目的报头,是接收者的MAC地址,到了这里这个数据就有了目的地的IP和MAC地址。

目的IP地址是为报文定制的最终目标,根据该地址来进行路径选择,目的MAC地址会变化,根据路径选择的结果,来选择下一个主机。不只有两个子网,可能要跨多个子网才能找到接收信息的一方。

当在以太网的某个主机发的信息,来到路由器,又往下传,来到以太网,以太网的所有主机都收到了这个信息,但只有路由器发现这是属于它的信息,所以其他主机抛弃掉,让路由器来处理。报头中发送者的主机的网卡的MAC地址,把这个分离后,来到网络层,路由器查看信息的目的IP地址,查看路由表,知道要选择哪条路径,比如如果就是发给令牌环网某个主机的,那么路由器就会往下传给自己的链路层,加上接收者主机的令牌环网的MAC地址,向下传给令牌环网,令牌环网的所有主机都收到后,发现这个MAC地址不是自己就弃掉,只有一个主机接收了这个地址,交给链路层,去掉MAC地址报头,交给网络层,网络层查看目的IP地址发现是自己的信息,然后就分离IP地址,逐渐上传,最终给到接收者。这个过程中,同层的都认为是和对方同层的在交流,只是链路层的信息不一样。

IP协议往上,也就是网络层往上,是没有信息变化的,发什么收什么,差别发生在链路层。IP地址屏蔽了底层子网机制的差异,这是路由器+IP地址共同作用的结果。正是因为如此,IP地址是全球网络的底层基础。所以任何一个软硬件问题,都可以通过添加一层软件层来解决,比如网络里,这个软件层就是IP地址所在的网络层。

4、其它

发送的数据包,在传输层叫做数据段,在网络层叫做数据报,在链路层叫做数据帧。每一层的信息交给每一层来处理,就是分用。

Linux中用ifconfig命令

在这里插入图片描述

第一个inet后面的地址是内网的IP地址,不是公网的。ether则是基于以太网的MAC地址,它有48位,每一位都用16进制表示,用冒号分隔。

结束。

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

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

相关文章

L1-006 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3567,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。 输入格式: 输入在一行中给出一…

DirectX12(d3d12)初始化

一、前置要求 Windows 10及以上(安装有DirectX12)VisualStudio 2022 二、DirectX12入门 1.引用头文件 #include<Windows.h> #include<d3d12.h> #include<dxgi1_4.h>2.注册窗口类并初始化窗口 这里我们调用Windows API 通过应用程序的句柄来注册一个唯一…

算法通关村-----回溯模板如何解决排列组合问题

组合总和 问题描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限…

uniapp视频播放功能

UniApp提供了多种视频播放组件&#xff0c;包括视频播放器&#xff08;video&#xff09;、多媒体组件&#xff08;media&#xff09;、WebView&#xff08;内置Video标签&#xff09;等。其中&#xff0c;video和media组件是最常用的。 video组件 video组件是基于HTML5 vide…

default 和 delete 与默认构造函数 的使用

前言 使用default和delete关键字来干预编译器自动生成的函数。让我详细解释一下这些知识点&#xff1a; 正文 编译器生成的默认构造函数&#xff1a; 如果类A没有定义任何构造函数&#xff0c;那么编译器会自动生成一个无参的默认构造函数 A()。这个默认构造函数实际上是一个…

【AI视野·今日CV 计算机视觉论文速览 第248期】Mon, 18 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 18 Sep 2023 Totally 83 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;Robust e-NeRF,处理高速且大噪声事件相机流的NERF模型。(from NUS新加坡国立) 稀疏噪声事件与稠密事件数据的区别&#xff1a;…

阿里云无影云电脑和传统PC有什么区别?

阿里云无影云电脑和传统电脑PC有什么区别&#xff1f;区别大了&#xff0c;无影云电脑是云端的桌面服务&#xff0c;传统PC是本地的硬件计算机&#xff0c;无影云电脑的数据是保存在云端&#xff0c;本地传统PC的数据是保存在本地客户端&#xff0c;阿里云百科分享阿里云无影云…

解决Vue项目中的“Cannot find module ‘vue-template-compiler‘”错误

1. 问题描述 在Vue项目中&#xff0c;当我们使用Vue的单文件组件&#xff08;.vue文件&#xff09;时&#xff0c;有时会遇到以下错误信息&#xff1a; ERROR: Cannot find module vue-template-compiler这个错误通常发生在我们使用Vue的版本不匹配或者缺少必要的依赖模块时。…

什么是回归测试?

什么是回归测试&#xff1f; 回归测试被定义为一种软件测试类型&#xff0c;以确认最近的程序或代码更改未对现有功能产生不利影响。 回归测试只不过是全部或部分选择已执行的测试用例&#xff0c;然后重新执行以确保现有功能正常运行。 进行此测试是为了确保新代码更改不会…

计数排序与基数排序

计数排序与基数排序 计数排序 计数排序&#xff1a;使用一个数组记录序列中每一个数字出现的次数&#xff0c;将该数组的下标作为实际数据&#xff0c;元素的值作为数据出现的次数。例如对于序列[3,0,1,1,3,3,0,2]&#xff0c;统计的结果为&#xff1a; 0出现的次数&#xf…

Go面试题

一、Go 1、nil是否一定相等 package mainimport ("fmt" )func main(){var x *int nilvar y interface{} xfmt.Println(xy) //truefmt.Println(xnil) //truefmt.Println(ynil) //false } 2、Go会不会回收线程 package mainimport ("fmt"&quo…

XMLHttpRequest介绍

目录 一、介绍1.创建 XMLHttpRequest2.初始化3.发送请求4.获取响应5.响应类型 二、发送GET请求示例三、发送POST请求示例四、发送POST请求下载文件示例五、发送POST请求上传文件示例 一、介绍 1.创建 XMLHttpRequest let xhr new XMLHttpRequest();2.初始化 xhr.open(metho…

Redis模块二:缓存分类 + Redis模块三:常见缓存(应用)

缓存大致可以分为两大类&#xff1a;1&#xff09;本地缓存 2&#xff09;分布式缓存 目录 本地缓存 分布式缓存 常见缓存的使用 本地缓存&#xff1a;Spring Cache 分布式缓存&#xff1a;Redis 本地缓存 本地缓存也叫单机缓存&#xff0c;也就是说可以应⽤在单机环…

MySQL(2) Explain

1、概念 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈 2、使用 在 select 语句之前增加 explain 关键字 &#xff0c;MySQL 会在查询上设置一个标记&#xff0c;执行查询会返回执行计划的信息&#xff0c;而不是执行这条SQL 在…

ffmpeg编译 Error: operand type mismatch for `shr‘

错误如下&#xff1a; D:\msys2\tmp\ccUxvBjQ.s: Assembler messages: D:\msys2\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:470: Error: operand type mismatch…

[JAVAee]Spring项目的创建与基本使用

目录 Spring项目的创建 Spring中Bean对象的存储与获取 存储Bean对象 获取并使用Bean对象 getBean方法的重载 本文章介绍了Spring项目创建与使用的过程与一定的注意事项. Spring项目的创建 首先在IDEA中,新建一个Maven 第二步,在pom.xml中写入spring的依赖. pom.xml是mav…

情侣飞行棋 情侣小游戏 2023 抖音

飞行棋网站地址:https://effect.guoyaxue.top/fxq/index.html#/ 以及各种新版来袭&#xff1a; 以及各种情侣小游戏合集 https://fxnew.guoyaxue.top/#/

hive 创建 s3 外表

背景 有个比较大的技术侧需求: 将数据从 HDFS 迁移到 s3。当然在真正迁移之前&#xff0c;还需要验证迁移到 s3 的数据&#xff0c;和上层查询器&#xff08;hive、presto 之间的兼容性&#xff09; 这里我们对一张业务表的数据做个简单的迁移测试 验证 数据迁移 为了让 h…

【微信小程序】swiper的使用

1.swiper的基本使用 <jxz-header></jxz-header> <view class"banner"><swiperprevious-margin"30rpx"autoplayinterval"2000"indicator-dotsindicator-color"rgba(0,0,0,0.3)"indicator-active-color"#bda…

文心一言:如何根据关键词找到想用的Python函数

在Python中&#xff0c;你可以通过以下几种方式来根据关键词找到想用的函数&#xff1a; 使用内置函数dir()和help()&#xff1a; dir()函数可以列出一个模块或对象中可用的属性和方法。help()函数则可以提供有关Python的任何函数、类、模块或关键字的详细信息。 例如&#…