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

文章目录


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

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语言实现的。这个转换是用位段来实现的。

cpp 复制代码
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进制表示,用冒号分隔。

结束。

相关推荐
Lovyk20 分钟前
Linux 正则表达式
linux·运维
好望角雾眠37 分钟前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
艾伦~耶格尔40 分钟前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
星仔编程1 小时前
python学习DAY46打卡
学习
Fireworkitte1 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
大霞上仙1 小时前
实现自学习系统,输入excel文件,能学习后进行相应回答
python·学习·excel
sword devil9002 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char2 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
yatingliu20193 小时前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
武当豆豆3 小时前
C++编程学习(第25天)
开发语言·c++·学习