当前位置: 首页 > news >正文

网络层次划分-网络层

网络层设计的两种方式

网络层设计的有两种模式:

  • 像早期的电信网一样,将网络层设计成面向实际连接的通信方式,面向连接本质上就是维护共享状态,在此基础之上就可以实现各种保证可靠性的机制,比如:超时重传,用序号保证没有遗漏或者多余的帧等。这种面向链接中维护的网络核心的状态,也就是说,网络中的每一个路由器都要有这条链接的状态,从而使数据可靠的到达。它实实在在的为两台主机的通信建立了一条虚电路VC
  • 而另一种模式,是把网络层做得机制简单(只帮助路由),而保证可靠性的一切操作都交给两台主机各自的内部去完成(传输层),这也就是说,传输层要面向虚拟连接通信以保证通信的可靠性。这种面向链接中维护的是网络边缘(主机)的状态,而和网络层即整个网络是没有关系的,也就是说,路由器不维护通信状态只负责路由,而通信状态只维护在通信双方的主机里。它没有实实在在的链接,但通过通信双方模拟出了链接的效果。

两相对比之下,第二种方式承认了通信的不可靠性,而让通信双方维护可靠性。使用第二种方式部署网络造价大大降低,而且使得网络运行方式灵活(第一种方式要预留出线路资源)。而且第一种方式能够流行是因为电话机没有智能,没有处理能力,因此只能在线路上给到他最安全的路。而计算机上层具有很强的处理能力,就算出错了也能有效处理,因此第二种方式就比较适合了。

总而言之,网络层只帮助路由,不保证可靠性。


网络层的两个层面

根据路由器(工作在网络层)的功能也可以知道,路由器有两种功能:路由选择,转发数据。因此可以形象的将网络层分为两个层面:控制层面(对应路由选择)和数据层面(也叫转发层面,对应转发数据)。

  • 对于转发层面,逻辑比较简单,可以只用硬件来实现,速度也很快。
  • 但是路由选择涉及的逻辑就比较复杂了,需要多台路由器不断交换信息,构建路由表,并选择最佳路线,如果只使用硬件,那就太复杂且昂贵了,因此控制层面使用软件和硬件结合(实际上就是用软件来让简单的硬件发挥出复杂的功能),当然,速度就慢。

可以只让路由器实现数据层面的功能吗?这样造价会再次降低很多,而且速度也会提高。答案是可以的,使用一个逻辑上集中的远程控制器(物理上可以分散),他知道网络中所有主机和路由器的状态,并为每一个分组计算出最佳路由,然后再路由器中生成正确的转发表。然而它不能大肆使用,因为同时得知全球网络的状态这不现实。但是再比较小的或者专用的网络中是可以使用这种方式的,效率会有所提高。


虚拟互连网络(网络层的重要出现原因)

众所周知,网络是各种各样,以太网,令牌环网,包括执行PPP协议的点对点通信网络,毫无疑问,这些网络中的数据链路层协议是不相同的,具体来说,帧格式,帧的访问控制方式等都是不同的。而且,以一种网络为标准重构所有网络是不现实的,而且对于不同的需求来说也需要不同的网络,这就要求我们使用一种方式让不同的网络互相通信。

容易想到的就是在互连网络之间放置这样一个机器,它具有多个端口,各绑定一种网络协议(实际上现在有更聪明的办法),因此它可以将一种帧解包并封装成另一种帧转发。但是问题在于如何选择要转发的端口是哪个?

或许我们会想到在帧传送的内部数据本身里面包含一个地址,即目标端口的地址,相当于在内部数据外面再封装一层地址层(地址指向目标端口),地址层外面才是数据链路层帧的包装:

也就是说,在进入数据链路层之前,再给数据封装一层。由此我们引入了一个更高的层次-网络层。并规定,网络中的所有站点,都需要有这一层,那么网络就连通了。

网络如此复杂庞大,我如何能确定我每一次都在朝着目标前进?甚至更高级的,我如何知道走那条路最近?所以网络层的任务还包括了路由功能

那么目的端口地址我发送者怎么知道?有的数据链路层(PPP协议)根本没有地址这怎么办?,为了兼容性,网络层需要规划一个新的地址,全网络通认的地址-网络地址(如IP),而不去使用数据链路层地址(如MAC),具体转发的时候把网络地址转化成数据链路层地址即可。因此全球网络需要对网络地址统一规划分配。

所有的以上这些网络层的功能或者说规范,构成了网络层协议,网络层屏蔽了底层网络的异构性,使得整个网络看起来是相互连通的(同样规范的网络地址,同样的路径选择过程)。我们把整个网络虚拟化,虚拟为相同性质的整体,这组成了所谓的虚拟互连网络

注:路由器一般工作在网络层及以下就是因为这个。所谓网关是一个功能性的概念,而路由器则是实体,路由器就是网关,如果说网关想要进行安全控制,和或者说屏蔽底层网络的差异需要涉及到更上层,那么路由器就会工作在更高层及以下。


IP地址的两种格式

分类的IP地址(32位)

格式:网络号+主机号

将IP地址分为几类,每一类IP地址的网络号位数以及前几个bit都是固定的

A,B,C类地址是单播地址,D类地址是多播地址,E是保留地址。这类方法的缺点很明显,就是不灵活,浪费(比如说一个局域网只有2台主机,那么你也只能申请C类IP)。优点就是可以很容易地根据IP地址的前几个bit判断该IP地址属于哪一个网络,格式是什么样的。

一些特殊的IP地址不能被分配出去:

为解决这种方法的缺点,在IP地址的主机号中插入一个子网号,把两级IP地址变为三级IP地址,这样可以把大的网络划分成几个小的网络,以便于灵活分配,但这仍然无法完全解决IP枯竭的问题。

无分类编址CIDR(32位)

格式:网络前缀(网络号)+主机号

CIDR不再把IP地址分类,因此我们想让网络前缀是几位都可以。甚至让前31位为网络前缀,最后一位为主机号。这就给了IP分配很大的灵活性。CIDR把网络前缀都相同的所有连续的IP地址组成一个“CIDR地址块”

在CIDR方式下网络前缀中没有能够标志该IP属于哪个网络的bit,所以对于一个IP地址,我们无法得知它的网络前缀是几位,主机号又是几位。因此在CIDR记法中表示一个IP地址还需要在IP地址的后面加上“/[网络前缀的位数]”。比如128.14.35.7/20就表示这个IP地址的前20位是网络前缀,剩下的12位是主机号。

人可以通过CIDR记法来判断前几位是网络号,但是计算机不可以,因此又引出地址掩码(子网掩码)的概念。假设网络前缀是5位,那么11111000 00000000 000000000 000000000 就是这种网络的地址掩码,网络前缀是5位的IP地址按位与地址掩码就可以得出纯网络地址。在路由表中,每种网络都有其对应的地址掩码:

当一个数据包来到路由器,会依次按位与路由表中的子网掩码,然后与目标网络比对,如果按位与的结果与目标网络相同,那么就应该把数据包转发到该目标网络对应的接口(只是举个例子,实际上要更复杂)。

CIDR还有三个特殊地址块:

  • 网络前缀是32位——用于主机路由(又叫做特定主机路由,它总是路由项目表中的第一位,不难看出,这个地址块的地址掩码是全1,也就是说任何目的IP和它按位与都等于目的IP本身,这可以为发往特定的目的地址的数据包开辟一个专用的接口,即把目标网络设置为想要使用专用接口的目的IP,地址掩码是全1,接口设置为专用接口的名字)。
  • 网络前缀是31位——用于点对点链路
  • 网络前缀是0位,主机号为全0——用于默认路由(不难看出,该形式的IP的地址掩码为全0,与任何目的IP按位与都是全0。【将目标网络设置为全0,将地址掩码设置为全0,接口设置为上层路由器,然后把这一项目放在路由器表中的最后】,这样做可以达到的目的就是:一但在这一层找不到对应要转发的网络,数据包就会被发往上一层更广阔的网络)。

CIDR支持路由聚合

将网络划分成层级结构,比如:第一层包含三个网络,这三个网络分别包含3个子网络,这9个子网络分别包含3个子网络......,这样在路由查找的时候一下子就可以排除一堆情况(类似于二叉树的查找),速度快,并且路由表中的条目数量将会大大减少,减少了路由器的成本。在这种划分下,多个子网络向外体现出的是一个网络而不是多个(比如1.1.0.0/24和1.1.1.0/24这两个网络可以对外宣告成1.1.3.0/23这一个更大的网络,报文进入更大的网络再转发给小网络即可),这种情况就叫做路由聚合

CIDR划分很灵活,可以支持路由聚合。而传统的分类IP则不支持路由聚合,从而阻碍了网络层次划分:

假设一个ISP被分配了相邻的16个C类网络:
192.168.0.0/24192.168.1.0/24 ... 192.168.15.0/24

在分类编址的视角下,这是16个独立的C类网络。当这个ISP要向它的上游(互联网骨干)宣告路由时,它必须宣告16条独立的路由条目。

它不能宣告为 192.168.0.0/20,因为在分类编址的规则里:192.168.x.x 从第一个字节 192 就被判定为C类地址,而C类地址的掩码只能是 /24,不存在 /20 这个概念。因此上游路由器会认为为 192.168.0.0/20 是一个无效或错误的路由信息。

可惜的是,假如我们宣告了16条独立的路由条目,那就没有层次一说了,一马平川,路由器条目也会爆炸地多。

路由聚合导致的问题

B公司分配到三个网络前缀:128.1.25.0/24,128.1.26.0/24,128.1.27.0/24,A公司分配到一个网络前缀128.1.24.0/24。A公司和B公司的网络前缀合起来正好是128.1.24.0/22这个网络前缀划分出来的四个连续的网络前缀。A,B公司的网络通过路由器相连。那么问题来了,由于B分配到三个网络前缀,那么它要进行路由聚合,聚合成128.1.24.0/22(但它内部实际上缺少了128.1.24.0/24前缀)。因此此时路由器内部的项目有两个:128.1.24.0/22和128.1.24.0/24。

而此时有个数据报,他的目的ip是128.1.24.1,但是糟糕的是,路由器的两个项目它都能匹配!为了解决这个歧义,路由器的匹配遵循最长前缀匹配原则

  • 路由器的项目按照前缀长短从长到短的顺序排列,因此对比顺序也是从长到短。回到上面的例子,128.1.24.1会最先和128.1.24.0/24匹配,问题被解决了。

关于ip分配(划分)的严重误解

无论你使用分类编址还是无分类CIDR编址,全球拥有的ip地址最多都是2^32个!也就是说,1.1.0.0/16和1.1.0.0/24网络下的ip地址-1.1.1.1是同一个ip地址。

这么说可能有点混,于是有了下面的解释:ip地址本身没有网络号一说,他只是一串全球唯一的数字。但是这么多ip地址如何能容易的分配下去,难道要每个人都来找管理组织申请吗?分类编址和CIDR编址就是用来解决ip分配的问题,也就是说他们只是两种方便分配ip地址的方式罢了,不会创造ip地址。

那么假如说,管理组织分配了1.1.0.0/16和1.1.0.0/24给两个不同的组织,那么这两个组织就会出现相同的ip。不用担心,这是管理组织分配错误,只要分配正确,我们的ip就是全球唯一。因此管理组织的做法是给各大网络运营分配一大块地址块,想要申请ip地址块的小的公司或者个人只能向当地运营商购买,而运营商通过层次划分间接能够保证ip不会重复分配。

记住,不同的编址方式只是决定了ip划分方式,从而决定ip地址分配的灵活度,从而决定了ip地址的利用率(明显的CIDR对ip地址的利用率要高的多)。但是ip地址全球唯一!


匿名网络(无编制网络)

当两个路由器直接相连的时候,在连线两端的接口处,可以不分配IP地址,当然也可以分配IP地址,如果分配了IP地址这一段点对点链路就构成了一个特殊的“网络”(之所以叫它网络,是因为它有IP地址)。通常把这样的特殊网络叫做匿名网络


地址解析协议ARP

由上述分析我们可知,网络中节点间的通信逻辑上使用的是IP地址,也就是说,在网络中每个节点都是以IP地址来表示自己身份的,而实际节点之间的通信却靠的是MAC地址。假设一个主机知道了目标主机的IP地址,那么它如何得知其对应的MAC地址?

ARP协议就是用来解决这个问题,它的主要功能就是把目的IP地址转换成对应的MAC地址以供实际通信使用。也因此ARP层处于网络层和数据链路层之间,但他实际上工作在数据链路层。

ARP这样工作

每台使用ARP协议的主机都设有一个ARP高速缓存,里面存放的是本局域网上的各主机和路由器的IP地址与其对应的MAC地址的映射表,这些都是主机目前知道的MAC地址。

1. 主机A要向某台主机B发送IP数据报时,先在ARP高速缓存中查看有无目的IP和MAC地址的映射:

  • 如果有,就使用这个MAC地址封装MAC帧,正常单播发送就可以。
  • 如果没有,ARP进程在本局域网上广播发送一个ARP请求(这个请求被包裹在MAC帧中发送出去,MAC帧中的类型字段设置为ARP请求,表示现在发送的不是IP数据报而是ARP请求,解包后的字段应交给ARP层),局域网中的所有主机在接收到这个请求的时候先将请求交给本主机的ARP层,由ARP层判断这个ARP请求是不是要自己的MAC地址(通过比对IP地址)。如果是,则将自己的MAC地址放在ARP响应中,然后封装成MAC帧再单播出去;如果不是,直接丢弃。

2. 主机A收到ARP响应后,提取出主机B的MAC地址,在ARP高速缓存中存下这个映射(下次两台主机再次通信就可以直接通信了),之后就能将IP数据报交给下层发送了。

需要注意的是:

  • 主机A发送请求的时候不仅发送目的IP,还会把自己的IP地址和MAC地址一并发送给主机B,这样主机B收到请求就可以直接建立关于主机A的IP和MAC的映射,以后主机B也想和主机A通信时就不必广播了,而是直接通信;同时这也可以让ARP应答变成单播而不是广播。总之,有效减少了ARP的通信量。
  • ARP高速缓存中的每个映射都有生存时间,过期后映射自动被删除。防止映射失效后还在使用(比如某台主机换了适配器)。

ARP请求/应答的结构

硬件地址长度字段和协议地址长度字段看似多余(因为已经有了类型字段,而通过类型就可以知道长度),但是这正是ARP协议良好适应性的体现,他可以兼容未来可能出现的一种网络/协议类型,而这种类型的地址长度是不固定的


IP数据报的格式

  • 版本:表示IP协议的版本
  • 首部长度:这个字段表示IP数据报的首部的长度,它的最大值是15(4位),它的基本单位是4B。也就是说,他最大表示15*4 = 60B的首部长度。
  • 区分服务:3位优先权字段(已经弃用),4位TOS字段,1位保留字段(必须置0)。TOS字段设置了报文路由转发的策略:最小延时,最大吞吐量,最高可靠性,最小成本,这四个相互冲突是通过TOS字段选择其一。
  • 总长度:指的是首部和数据长度之和,基本单位是1B,因此一个IP数据报的最大长度为(2^16-1)B,也就是65535B。由于数据链路层对数据帧的数据部分有大小限制,尤其是最大不能超过MTU(例如以太网规定的是MTU = 1500字节),而IP数据报最大为65535B,所以如果IP数据报的长度超过了MTU,就要考虑把IP数据报分片传送,标识,标志,片偏移字段都是分片使用的字段。IP协议规定:互联网中的所有主机和路由器必须能接受长度不超过576字节的数据报(512字节的数据+60字节的首部+4字节的富裕),也就是说,小于等于这个长度的IP数据报不用分片。这是在路由转发速度和传输效率之间的权衡
  • 标识:IP软件在存储器维护一个计数器,每产生一个数据报计数器就加一,并把这个值付给相应数据报的标识字段。由一个IP数据报分片后的多个IP数据报的标识字段是相同的。实际上相同的标识字段使得分片后的IP数据报可以整合起来。
  • 标志:字段最低位记为MF(More Fragment)。MF=1表示它后面还有分片,MF=0表示它已经是最后一个分片。字段中间一位记为DF(Dont Fragment)。只有DF = 0才允许分片。这个字段帮助接收方判断整合分片什么时候结束。
  • 片偏移:表示一个分片的有效数据相对于原来的未分片的数据的偏移量,它的基本单位是8B,也就是说除了最后一个分片每个分片的有效数据长度都是8B的整数倍。可以发现片偏移的位数是13位,也就是说最大表示的偏移量是2^13*8B,即2^16B,即65535字节,这与IP数据报的最大总长度是一致的
  • 生存时间(TTL):他表示的是IP数据报最多经过几个路由器转发,具体来说,发送IP数据报时给TTL设置一个次数,每经过一个路由器TTL减1,如果TTL减到0,路由器就不再转发这个数据报而是直接丢弃。这防止了数据报在网络中无限兜圈子。以前TTL是表示在路由器中消耗的最大时间,但是由于路由器越来越快,处理数据报的总时间远远小于一秒,于是就把TTL的含义改成了“跳数限制”
  • 协议:指定将IP数据报的有效载荷交给上层(传输层)的哪种协议。即支持上层有多种协议。
  • 首部校验和:数据链路层的CRC只能检验节点到节点的错误,但如果在节点内部,比如说路由器内部IP数据报产生了错误,是检验不出来的(转发时会用错误的IP数据报进行CRC校验,不会发现错误),而且还会造成严重的转发错误问题,因此IP层也要检验一次首部,以保证转发不出错。IPV6取消了这个字段,因为硬件已经足够可靠。对于数据部分的检验交给了传输层,各司其职。
  • 可选字段:可以增加IP数据报的功能,内容丰富但基本不用,因此IPV6中取消了这个字段。
  • 填充字段:前面说过首部的长度是4B的整数倍,如果首部长度不够4B的整数倍就需要用填充字段把首部填充到4B的整数倍。

未完待续。。。。

http://www.dtcms.com/a/491108.html

相关文章:

  • 做响应式网站应该注意什么问题有自己的域名怎么建设网站
  • ClickHouse 数据更新策略深度解析:突变操作与最佳实践
  • 餐饮商城网站建设网站备案幕布要求
  • Prometheus监控部署
  • php ajax网站开发典型实例 pdfwordpress账号邮箱
  • 栈与队列:数据结构的基石与应用
  • 多态的定义
  • 开设网站的费用在微信怎样搞做微视频网站
  • wordpress禁止游客访问上海市网站seo
  • AI代码生成对CRUD联调流程的重构分析
  • 如何通过优化中药饮片采购流程实现供应链协同?
  • 建站产品网页制作工作怎么样
  • python编程基础知识
  • 使用VSCode SSH插件实现免密码登录远程服务器
  • vscode浏览器启动报错
  • 网站设计制作新参考价格中国企业500强江阴有几家
  • 车载电子电器架构 —— 基于AP定义车载HPC
  • YOLO 目标检测算法:从 v1 到 v2 的技术演进与优化实践
  • Spring Boot 3零基础教程,Spring Boot 日志级别,笔记19
  • iOS混淆与IPA文件加固全流程实战 防止苹果应用被反编译的工程级方案
  • 济宁市网站建设新乡营销网站建设公司哪家好
  • 网站建设方案总结wordpress音频付费插件
  • 解决VMware Workstation Pro 17中Ubuntu 24.04无法复制粘贴
  • 上辽宁建设工程信息网站移动网站建设口碑好
  • 【力扣 SQL 50】聚合函数篇
  • 做网站如何用代码把字体变大云南定制化网站建设
  • 免费建立微信网站好看的wordpress工具
  • 【Go】--map和struct数据类型
  • go win安装grpc-gen-go插件
  • AI+Python驱动的无人机生态三维建模与碳储/生物量/LULC估算全流程实战技术