一篇文章带你搞懂网络层(网际层)-- 地址篇

网络层(Network Layer)是OSI模型中的第三层(TCP/IP模型中的网际层),提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,并具有一定的拥塞控制和流量控制的能力。相当于发送邮件时需要地址一般重要。由于TCP/IP协议体系中的网络层功能由IP协议规定和实现,故又称IP层。

在之前的文章中我们已经谈论了物理层与数据链路层,在物理层中我们讨论了数据怎么转化为信号在信道上传输,用过复用技术解决了点对点数据通信的冲突问题。在数据链路层讨论了在点对点信道的PPP协议、讨论了广播信道的CSMA/CD协议,能够完成数据从接口A到接口B的传输。如果我们将数据链路层比作火车网中相邻两站之间的运输,网络层就能理解为城市与城市之间的相互运输

为了完成这样的功能,网络层需要做那些准备工作呢?在此层中会涉及到IP地址,它到底是个啥?IP地址与上一章提到的MAC地址有啥联系?这一章我们将深入了解这些问题。

0、感性了解网络层

0.1 网络层有没有必要

在最开始的时候我们必须明确网络层到底有没有必要?他的主要功能是用来做什么的?

首先网络层的存在肯定是必要的,正如最开始提到的:如果我们将数据链路层比作火车运势网络中相邻两站之间的运输,网络层就能理解为城市与城市之间的相互运输。如果只知道相邻链路的传输(局部)是不能完成全球的网络互联的,只有加上了网络层(全局)才有可能完成全球的网络互联。

图1 网络层演示

听上去还是蛮抽象的,我们来举个例子,如上图,数据链路层只完成了数据从点到点之间的数据传输,并没有完成在整个网络中从主机A到主机B到底因该选择那些路径,从主机A到主机B的数据传输。而这项工作就交给了网络层完成,而且这样我们称之为路由的转发,相关的就是路由选择协议。

0.2.网络层提供什么服务

在前两篇文章一篇文章带你搞懂物理层一篇文章带你搞懂数据链路层中我们都没有讨论当前层协议应该实现可靠的传输还是不可靠的传输,所谓的可靠传输就是保证数据在传输过程中不出错、不乱序、不丢失。在早期这个问题饱受争议,到底是应改使用有连接的、可靠的虚电路服务,还是使用无连不可靠的数据报服务。

图2 网络层提供的两种服务

具体的虚电路服务与数据报服务我们不过多的讲解。具体的对比如下:

对比的方面 虚电路服务 数据报服务
思路 可靠通信应当由网络来保证 可靠通信应当由用户主机来保证
连接的建立 必须有 不需要
终点地址 仅在连接建立阶段使用,每个分组使用短的虚电路号 每个分组都有终点的完整地址
分组的转发 属于同一条,虚电路的分组均按照同一路由进行转发 每个分组 独立选择路由进行转发
当结点出故障时 所有通过出故障的结点的虚电路均不能工作 出故障的结点可能会丢失分组,–些路由可能会发生变化
分组的顺序 总是按发送顺序到达终点 到达终点的时间不一定按发送顺序
端到端的差错处理和流量控制 可以由网络负责,也可以由用户主机负责 由用户主机负责

最终互联网采用的设计思路是这样的:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。也正是因为采用了这种无连接的服务使得网络层简化之后能够在较大范围内能够被使用。小声逼逼:简化的还这么复杂

0.3 概述

网际协议IP是TCP/IP体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。严格来说,这里所讲的IP 其实是IP的第4个版本,应记为IPv4。但在讲述IP协议的各种原理时,往往不在IP后面加上版本号。在介绍完IP4之后,我们再介绍较新的版本IPv6 (版本1~3和版本5都未曾使用过)。与IP协议配套使用的还有三个协议:

  • 地址解析协议ARP (Address Resolution Protocol)
  • 网际控制报文协议ICMP (Internet Control Message Protocol)
  • 网际组管理协议IGMP (Intemnet Group Management Protocol)

图3 网络协议IP及其配套协议

上图画出了这三个协议和网际协议IP的关系。在这一层中,ARP画在最下面,因为IP经常要使用这个协议。ICMP 和IGMP画在这一层的上部,因为它们要使用IP 协议。这三个协议将在后面陆续介绍。由于网际协议IP 是用来使互连起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层常常被称为网际层(internet layer),或IP层。

在数据链路层以太网协议中,我们就是用到了MAC地址,用于不同接口之间的,在寻找不同的主机时就需要是使用到主机的之间的IP地址。我们这里讲述的IP地址划分为分类的IP地址、三级IP地址、无分类的IP地址。最开始我们只介绍分类的IP地址,在了解了IP层工作之后我们再来了解剩下的两类IP地址。

1、网际协议IP

1.1 IP地址 – 分类的IP地址

整个的互联网就是一个单一的、抽象的网络。IP地址就是给互联网上的每一台主机.(或路由器)的每一个接口分配一个在全世界范围内是唯一的32位的标识符。IP 地址的结构使我们可以在互联网上很方便地进行寻址。IP地址现在由互联网名字和数字分配机构ICANN (Internet Corporation for Assigned Names and Numbers)进行分配。

IP地址的划分在历史上经历了分类的IP地址划分子网构造超网三个阶段。在本节我们只介绍分类的IP地址,在了解了IP协议之后我们进一步的探讨剩余两类IP地址。

所谓“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号(host-id),它标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个互联网范围内是唯一的。这种两级的IP地址可表示为:
I P : : = { < > , < > } IP地址 ::= \{<网络号>, <主机号>\}

各类IP地址的网络号与主机号的分类如下:

图4 网络协议IP及其配套协议

从上图我们可以看出以下结论:

  • A类、B类和C类地址的网络号字段(在图中这个字段是灰色的)分别为1个、2个和3个字节长,而在网络号字段的最前面有1~3位的类别位,其数值分别规定为0,10和110。
  • A类、B类和C类地址的主机号字段分别为3个、2个和1个字节长。
  • D类地址(前4位是1110)用于多播(一对多通信)。我们将在之后讨论IP多播。
  • E类地址(前4位是111)保留为以后用。
为什么要划分呢IP地址

把IP地址划分为A类、B类、C类三个类别,当初是这样考虑的。各种网络的差异很大,有的网络拥有很多主机,而有的网络.上的主机则很少。把IP地址划分为A类、B类和C类是为了更好地满足不同用户的要求。当某个单位申请到一个IP 地址时,实际上是获得了具有同样网络号的一块地址。其中具体的各台主机号则由该单位自行分配,只要做到在该单位管辖的范围内无重复的主机号即可。

IP地址的表示方法

显然IP地址是一个二进制代码,例如某B类网络表示为 10000000 00001011 000000 00011111 10000000 \, 00001011 \, 000000\, 00011111
这样书写的IP地址不容易书写,也不方便记忆,通常情况下将其表示为10进制形式,这样的表示形式我们称之为点分十进制记法,于是上述的B类地址就能表示为:
128.11.3.31 128.11.3.31
这样的表示就简洁明了,而且便于记忆。接下来我们看使用点分十进制记法的A-E类IP地址的表示范围:

IP地址分类 主机号位数 表示范围 说明
A 8 1.0.0.1 ~ 127.255.255.254 网络号、主机号不能全0,不能全1
B 16 128.0.0.1 ~ 191.255.255.254 网络号、主机号不能全0,不能全1
C 24 192.0.0.1 ~ 223.255.255.254 网络号、主机号不能全0,不能全1
D 不区分网络号与主机号 224.0.0.1~239.255.255.254 多播地址专用
E 不区分网络号与主机号 240.0.0.1~255.255.255.254 保留为今后使用

通过上表我们就能得到,如果通过点分十进制记法区分网络类别,就存在如下规律:IP地址表示为 X 1 . X 2 . X 3 . X 4 X_1. X_2.X_3. X_4 四段,如果

  • 1 X 1 < 128 1 \leq X_1 < 128 该地址为A类地址
  • 128 X 1 < 192 128 \leq X_1 < 192 该地址为B类地址
  • 192 X 1 < 224 192 \leq X_1 < 224 该地址为C类地址
  • 224 X 1 < 240 224\leq X_1 < 240 该地址为D类地址
  • 240 X 1 < 255 240 \leq X_1 < 255 该地址为E类地址
IP地址的指派范围
网络类别 最大可指派网络数 第一个可指派的网络号 最后一个可以指派网络号 每个网络中最大的主机数
A 126( 2 7 1 2^7 - 1 ) 1 126 16777214( 2 24 2 2^{24} - 2 )
B 126( 2 14 1 2^{14} - 1 ) 128.1 192.255 65534( 2 16 1 2^{16}- 1 )
C 126( 2 21 1 2^{21} - 1 ) 192.0.1 223.255.255 254( 2 8 1 2^8- 1 )
一般不使用的特殊 IP 地址
网络号 主机号 源地址能否使用 目的地址能否使用 代表的意思
0 0 可以 不可 在本网络上的本主机
0 host-id 可以 不可 在本网络上的某台主机 host-id
全 1 全 1 不可 可以 只在本网络上进行广播(各路由器均不转发)
net-id 全 1 不可 可以 对 net-id 上的所有主机进行广播
127 非全0或全1的任何数 可以 可以 用作本地软件环回测试之用
IP 地址的一些重要特点
  1. IP 地址是一种分等级的地址结构,其好处是:
    • IP 地址管理机构在分配 IP 地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了 IP 地址的管理
    • 路由器仅根据目的主机的网络号转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间
  2. 实际上 IP 地址是标志一个主机(或路由器)和一条链路的接口
    当一个主机同时连接到两个网络上时,该主机就必须同时具有两个相应的 IP 地址,其网络号 net-id 必须是不同的。这种主机称为多归属主机 (multihomed host)
    • 由于一个路由器至少应当连接到两个网络(这样它才能将 IP 数据报从一个网络转发到另一个网络),因此一个路由器至少应当有两个不同的 IP 地址
  3. 用转发器或网桥连接起来的若干个局域网仍为一个网络,因此这些局域网都具有相同的网络号 net-id
  4. 所有分配到网络号 net-id 的网络,无论是范围很小的局域网,还是可能覆盖很大地理范围的广域网,都是平等的

图5 互联网中的 IP 地址

1.2 硬件地址与IP地址

图6 IP地址与MAC地址的区别

IP地址与MAC地址的区别

  • 在抽象的互联网上只能够看到IP数据报,
  • 路由器只根据目的站点的IP地址进行的网络号进行路由选择
  • 在局域网的链路层只能看到MAC地址

图7 从不同的层次上看IP地址与硬件地址

于是产生了IP地址与MAC地址和而不用的现象,两类地址应该如何转换呢?接下来介绍的地址解析协议ARP就是完成这个工作的。

1.3 地址解析协议ARP

图8 硬件地址与IP地址示意图

不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表

< I P a d d r e s s ; M A C a d d r e s s ; T T L > < IP address; \, MAC \, address; \, TTL >
其中TTL (Time To Live):地址映射有效时间

当主机 A 要向本局域网上的某个主机 B 发送 IP 数据报时,要先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址

  • 如果有,查出其对应的硬件地址,将该硬件地址写入 MAC 帧,通过局域网将该帧发往该地址
  • 如没有,ARP 进程在本局域网上广播发送一个 ARP 请求分组,收到 ARP 响应分组后,将IP 地址到硬件地址的映射写入 ARP 高速缓存,将该硬件地址写入 MAC 帧,通过局域网将该帧发往该地址.

ARP 请求分组包含

  • 发送方 IP 地址
  • 发送方硬件地址
  • 目标方 IP 地址
  • 目标方硬件地址(未知时填 0)

ARP 响应分组包含

  • 发送方 IP地址
  • 发送方硬件地址
  • 目标方 IP 地址
  • 目标方硬件地址

说明

  • 本地广播 ARP 请求,路由器不转发ARP请求
  • ARP 分组封装在物理网络的帧中传输

下图就简单演示了ARP请求与响应的过程:

图9 ARP请求示意图

ARP 是解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。

图10 四种ARP请求示例图

  • 主机→本网络上的主机:用 ARP 找到目的主机的硬件地址
  • 主机→另一网络上的主机:用 ARP 找到本网络上的一个路由器的硬件地址,剩下的工作由这个路由器来完成
  • 路由器→另一网络上的主机:用 ARP 找到本网络上另一个路由器的硬件地址,剩下的工作由这个路由器来完成
  • 路由器→本网络上的主机:用 ARP 找到目的主机的硬件地址

至此我们就解决了MAC地址与IP地址的转换问题,这里我们将ARP协议与以太网交换机的自学习过程进行简单的对比.

ARP协议 交换器的自学习过程
所在的协议层 网络层 数据链路层
保存格式 < I P a d d r e s s ; M A C a d d r e s s ; T T L > < IP address; \, MAC \, address; \, TTL > < M A C a d d r e s s , p o r t , T T L > <MAC \, address, port, TTL>
保存的地点 ARP高速缓冲 交换表
构建过程 通过ARP请求报文、ARP响应报文实现 定时的分组交换信息
交换得到的信息 IP地址与MAC地址的对应信息 MAC地址与端口的对应信息

1.4 IP数据报的格式

图11 IPd数据报格式

首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。可选字段,其长度是可变的。

接下来将介绍全部的协议字段,对于部分难以理解的字段会在全部介绍完之后详细说明。

  • 版本——占 4 位,指 IP 协议的版本。
    • 目前的 IP 协议版本号为 4 (即 IPv4)。
  • 首部长度——占 4 位,可表示的最大数值
    • 是 15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节
  • 区分服务——占 8 位,用来获得更好的服务。
    • 在旧标准中叫做服务类型,但实际上一直未被使用过。1998 年这个字段改名为区分服务。只有在使用区分服务时,这个字段才起作用。在一般的情况下都不使用这个字段
  • 总长度——占 16 位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节总长度必须不超过最大传送单元 MTU
  • 标识(identification) ——占 16 位,IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
  • 标志(flag) ——占 3 位,目前只有前两位有意义
    • 标志字段的最低位是 MF (More Fragment)
      • MF 1 表示后面“还有分片”
      • MF 0 表示最后一个分片
    • 标志字段中间的一位是 DF (Don’t Fragment)
      • 只有当 DF = 0 时才允许分片
  • 片偏移——占13 位,指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
  • 生存时间——占8 位,记为 TTL (Time To Live),指示数据报在网络中可通过的路由器数的最大值。
  • 协议——占8 位,指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给那个处理过程
  • 首部检验和——占16 位,只检验数据报的首部,不检验数据部分。这里不采用 CRC 检验码而采用简单的反码求和的计算方法。
  • 源地址和目的地址都各占 4 字节
  • IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。 选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。
为何要分片?

在上述的字段中标识、标志、片偏移这三个都是个IP数据报的分片相关的,那为何要分片呢?

在数据链路层我们提到:数据帧的数据字段 46 ~ 1500 字节,也就是如果IP数据报在封装到数据帧中时最大长度只能够有1500字节,IP数据报的总长度——占 16 位,最大长度为 65535 字节,如果超过了1500字节的部分就需要进行分片,于是为了分片与重装就添加了标识、标志、片偏移这三个字段作为辅助:

  • 标识:为了重装提供支持
  • 标志:其中DF表示能否分片,MF表示是否有后续分片
  • 片偏移:分片切割在原数据报中的位置
    接下来看一个简单的例子:

数据报的总长度为3820字节,其数据部分为3800字节长(使用固定首部),需要分片为长度不超过1420字节的数据报片。
因固定首部长度为20字节,因此每个数据报片的数据部分长度不能超过1400 字节。于是分为3个数据报片,其数据部分的长度分别为1400, 1400 和1000字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。给出分片后得出的结果(请注意片偏移的数值)。
在这里插入图片描述
分片示意图如上,相关的数据报数组如下表,再次强调:

  • MF =1, 有后续分片。 MF=0,没有后续分片
  • 片偏移以8字节为单位,数据分片2 中片偏移就是1400 / 8 = 175计算得来
总长度 标识 MF DF 片偏移
原始数据报 3820 12345 0 0 0
数据分片1 1420 12345 1 0 0
数据分片2 1420 12345 1 0 175
数据分片3 1020 12345 0 0 350
首部校验和的计算过程

图12 首部校验和的计算过程

为了能够明白计算过程这里就简单演示了计算过程,其中反码求和就是一般的计算:0+0 =0, 0+1=1, 1+1 = 10,需要进位。产生的高位进位部分任然需要向后加到数据部分:

图13 首部校验和的计算举例

1.5 IP层转发的流程

在介绍IP分组转发之前我们回顾一下交换机的转发表:
< M A C a d d r e s s , p o r t , T T L > <MAC \, address, port, TTL>
如果在查找到MAC地址之后就能够找到对应转发的端接口,然后转发到相应的端口就完成了转发,但是如果简单的将MAC地址替换为IP地址,这样可行吗?这样做是可以的,但是效果并不好,数据链路层交换的只是一个区域内的地址,数量还不是很多,但是网络层存放的就是整个网络上所有的IP地址,这样的数量过于庞大,存储、查找的消耗都过大,但若按主机所在的网络地址来制作路由表,这样就可使路由表大大简化。

图14 路由表示意图

根据目的网络地址就能确定下一跳路由器,这样做的结果是:IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。只有到达最后一个路由器时,才试图向目的主机进行直接交付。

特定主机路由
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由。也就是说在特定的主机路由的路由表中会保存特定的主机(直接交付),在IP地址符合的情况下就会转发到相应的主机上。

默认路由 (default route)
路由器还可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。默认路由就类似于C语言中的switch,case语句中的default,也能作为简化路由表表项的方法之一。对于查不到的IP地址而言就转发到默认路由器。

路由器分组转发算法
  1. 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。
  2. 若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行 (3)。
  3. 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行 (4)。
  4. 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行 (5)。
  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行 (6)。
  6. 报告转发分组出错。

我们分析转发算法,转发的范围是逐渐变大的:主机 \to 特定路由 \to 下一跳路由 \to 默认路由 \to 报错。

至此我们就完成了路由转发相关的过程,我们对比一下交换机的转发过程

路由器的转发 交换机的转发
路由表/交换表 < I P a d d r e s s ; M A C a d d r e s s ; T T L > < IP address; \, MAC \, address; \, TTL > < M A C a d d r e s s , p o r t , T T L > <MAC \, address, port, TTL>
配对的表项 匹配网络号 匹配MAC地址
转发过程 依次匹配并转发:主机 \to 特定路由 \to 下一跳路由 \to 默认路由 \to 报错 匹配MAC地址,相同就转发给对应的端口,如果没有就进行广播

我们结合之前学习过的知识点串联一下数据转发的过程,假设路由表、交换表、ARP缓冲的数据均已经准备好:

  1. 在网络层,通过路由转发算法查询到需要转发的IP地址,
  2. 通过ARP高速缓冲查找到需要转发的MAC地址是哪一个
  3. 在数据链路层查询转发表,确定数据通过哪一个端口进行转发
  4. 在物理层利用信道,转递相关的信号,达到数据转发的目的。

至此我们就讨论完了IP数据报,及其转发的过程,但是在实际的转发中还是有许许多多其他的问题,比如IP地址如何分配?每一个主机都有IP地址,它能被互联网上的其他主机访问到吗?本节讲述的分类IP地址存在那些弊端?等等…我们继续讨论。

2. IP地址再探讨

2.1 三级IP地址 – 划分子网

从开始的二级IP的划分确实有些不合理,

  • IP地址空间的利用率又是很低
  • 每一个物理网络分配一个网络号会使得路由表变的太大导致网络性能变坏
  • 两级IP地址不够灵活

为解决上述问题,从1985年起在IP地址中又增加了一个“子网号字段”,使两级IP地址变成为三级IP地址,它能够较好地解决上述问题,并且使用起来也很灵活。这种做法叫做划分子网(subnetting) [RFC 950],或子网寻址或子网路由选择。划分子网已成为互联网的正式标准协议。

  1. 一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网(subnet)。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍然表现为一个网络。

  2. 划分子网的方法是从网络的主机号借用若干位作为子网号(subnet-id),当然主机号也就相应减少了同样的位数。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。也可以用以下记法来表示:
    I P : = < > , < > , < > IP地址:= { <网络号>, <子网号>, <主机号>}

  3. 凡是从其他网络发送给本单位某台主机的IP数据报,仍然是根据IP 数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网,把IP数据报交付目的主机。

总结:划分子网是内部的事情(子网号可以理解为局域网网络内部的网络号),在外面看来还是一个网络(网络号没有改变),在分组转发时先通过网络号转发,数据到达相应主机之后再通过子网号转发,

子网掩码

为了实现上述的功能,我们采用了子网验码的技术:

图15 实际中的子网验码示意图

从上图中我们看出来了,子网验码似乎和IP地址类似,他到底是个啥呢?

从一个 IP 数据报的首部无法判断源主机或目的主机所连接的网络是否进行了子网划分。使用子网掩码 (subnet mask) 可以找出 IP 地址中的子网部分。 规则:子网掩码长度 = 32 位

  • 某位 = 1:IP地址中的对应位为网络号和子网号
  • 某位 = 0:IP地址中的对应位为主机号

图16 实际中的子网验码示意图

因为子网掩码与IP地址都是32位,同样使用的是点分十进制计发。对于子网掩码,我们需要知道:
( I P ) A N D ( ) = = + (IP 地址) AND (子网掩码) =网络地址=网络号+子网号

于是在A、B、C类网络中就存在默认子网掩码 如图

图17 默认子网掩码

子网掩码是一个重要属性。子网掩码是一个网络或一个子网的重要属性。路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。

子网划分方法

固定长度子网变长子网两种子网划分方法。

在采用固定长度子网时,所划分的所有子网的子网掩码都是相同的。划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。

使用子网时分组的转发
  1. 从收到的分组的首部提取目的 IP 地址 D。
  2. 先用自己的的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行 (3)。
  3. 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行 (4)。
  4. 对路由表中的每一行,将子网掩码和 D 逐位相“与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行 (5)。
  5. 若路由表中有一个默认路由,则将分组传送给路由表中所指明 的默认路由器;否则,执行 (6)。
  6. 报告转发分组出错。

通过比较我们划分子网的IP地址与分类IP地址在转发是的最大的不同就是比较的时候不能直接比较网络,需要通过子网掩码计算网络地址(网络号+子网号),然后进行比较,其他的都保持一致。

2.2 无分类编址 CIDR – 构造超网

划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在 1992 年互联网仍然面临三个必须尽早解决的问题:

  1. 1992 年B 类地址已分配了近一半,眼看就要在 1994 年 3 月全部分配完毕!
  2. 互联网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
  3. 整个 IPv4 地址空间最终将全部耗尽。

1987 年,RFC 1009 就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用变长子网掩码 VLSM (Variable Length Subnet Mask)可进一步提高 IP 地址资源的利用率。在 VLSM 的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)

CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。CIDR使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。IP 地址从三级编址(使用子网掩码)又回到了两级编址。 CIDR的IP地址可表示为:
I P : : = < > IP地址::=<网络前缀, 主机号>
CIDR 使用“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如:
220.78.168.0 / 24 220.78.168.0/24
现在我们对比一下三类IP地址:

分类IP地址 划分子网的IP地址 CIDR地址
地址形式 < > <网络号, 主机号> < > <网络地址, 子网地址,主机地址> < > <网络前缀,主机号>
记法 点分十进制记法 点分十进制记法(子网掩码也是) 斜线记法
分类? 传统的分类IP地址 带有子网掩码的IP地址 无明显分类
CIDR 地址块

CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。
128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。

  • 128.14.32.0/20 地址块的最小地址:128.14.32.0(‭10000000‬-0000‭1110‬-‭0010*0000‬-00000000)[*之前为网络号]
  • 128.14.32.0/20 地址块的最大地址:128.14.47.255(‭10000000‬-0000‭1110‬-‭‭0010*1111‬-11111111)[*之前为网络号]
  • 全 0 和全 1 的主机号地址一般不使用。
路由聚合 (route aggregation)

**一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合(也称为构成超网),它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。**路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。CIDR 虽然不使用子网了,但仍然使用“掩码”这一名词(但不叫子网掩码)。对于 /20 地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中1的个数。

CIDR 记法的其他形式
  1. 10.0.0.0/10 可简写为 10/10,也就是把点分十进制中低位连续的 0 省略。
  2. 10.0.0.0/10 隐含地指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0。此掩码可表示为:

图18 CIDR掩码示意图

  1. 网络前缀的后面加一个星号 * 的表示方法,如 00001010 00*,在星号 * 之前是网络前缀,而星号 * 表示 IP 地址中的主机号,可以是任意值。
构成超网

前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。

  • 这些 C 类地址合起来就构成了超网。
  • CIDR 地址块中的地址数一定是 2 的整数次幂。
  • 网络前缀越短,其地址块所包含的地址数就越多。
  • 而在三级结构的IP地址中,划分子网是使网络前缀变长。
  • CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。

例如206.0.68.0/22这样的CIDR地址就能够表示4个C类地址的聚集

2.2.1 使用CIDR的路由转发

最长前缀匹配

使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)或最长匹配最佳匹配。网络前缀越长,其地址块就越小,因而路由就越具体 (more specific) 。

比如路由表中有如下两个地址

  • 11111111 00110011 0000 11110000
  • 11111111 11110011 0000 11110000

需要匹配的地址为11111111 11111111 0000 11110000,则应该匹配第二条记录。

使用二叉线索查找路由表

当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。 为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。
每一个IP地址都由一个唯一前缀来标识和进行匹配。这些唯一前缀在物理上以二叉树的形式来存储。IP地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。为提高二叉线索的查找速度,广泛使用了各种压缩技术。

图19 二叉线索树举例

从二叉线索的根节点自顶向下的深度最多有 32 层,每一层对应于IP地址中的一位。一个IP地址存入二叉线索的规则很简单。先检查IP地址左边的第一位,如为 0,则第一层的节点就在根节点的左下方;如为 1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。


3、IPV6

3.1 IPv6 的基本首部

IP 是互联网的核心协议。互联网经过几十年的飞速发展,到 2011 年 2 月,IPv4 的 32 位地址已经耗尽。ISP 已经不能再申请到新的 IP 地址块了。我国在 2014 – 2015 年也逐步停止了向新用户和应用分配 IPv4 地址。解决 IP 地址耗尽的根本措施就是采用具有更大地址空间的新版本的 IP,即 IPv6。IPv6 仍支持无连接的传送,但将协议数据单元 PDU 称为分组。为方便起见,本书仍采用数据报这一名词。所引进的主要变化如下:

  • 更大的地址空间。IPv6 将地址从 IPv4 的 32 位 增大到了 128 位。
  • 扩展的地址层次结构。
  • 灵活的首部格式。 IPv6 定义了许多可选的扩展首部。
  • 改进的选项。 IPv6 允许数据报包含有选项的控制信息,其选项放在有效载荷中。
  • 允许协议继续扩充。
  • 支持即插即用(即自动配置)。因此 IPv6 不需要使用 DHCP。
  • 支持资源的预分配。 IPv6 支持实时视像等要求,保证一定的带宽和时延的应用。
  • IPv6 首部改为 8 字节对齐。首部长度必须是 8 字节的整数倍。原来的 IPv4 首部是 4 字节对齐。
IPv6 数据报由两大部分组成:
  • 基本首部 (base header)
  • 有效载荷 (payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部 (extension header),再后面是数据部分。

图20 IPv6基本数据报告格式

图21 IPv6基本数据报告格式

  • 版本(version)—— 4 位。它指明了协议的版本,对 IPv6 该字段总是 6。
  • 通信量类(traffic class)—— 8 位。这是为了区分不同的 IPv6 数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。
  • 流标号(flow label)—— 20 位。“流”是互联网络上从特定源点到特定终点的一系列数据报。属于同一个流的数据报都具有同样的流标号。该标号要求“流”所经过路径上的所有路由器都保证所指明的相同服务质量。
  • 有效载荷长度(payload length)—— 16 位。它指明 IPv6 数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内),其最大值是 64 KB。
  • 下一个首部(next header)—— 8 位。它相当于 IPv4 的协议字段或可选字段。
  • 没有扩展首部时,指明上一层协议:6-TCP;17-UDP。有扩展首部时,指明第一个扩展首部的类型。
  • 跳数限制(hop limit)—— 8 位。源站在数据报发出时即设定跳数限制。路由器在转发数据报时将跳数限制字段中的值减 1。当跳数限制的值为零时,就要将此数据报丢弃。
  • 源地址—— 128 位。是数据报的发送站的 IP 地址。
  • 目的地址—— 128 位。是数据报的接收站的 IP 地址。

IPv6 把原来 IPv4 首部中选项的功能都放在扩展首部中。在 RFC 2460 中定义了六种扩展首部:

  • (1) 逐跳选项
  • (2) 路由选择
  • (3) 分片
  • (4) 鉴别
  • (5) 封装安全有效载荷
  • (6) 目的站选项

每一个扩展首部都由若干个字段组成,它们的长度也各不相同。但所有扩展首部的第一个字段都是8位的“下一个首部”字段。此字段的值指出了在该扩展首部后面的字段是什么。逐条选项,经数据报途中的每一个路由器处理。其它扩展首部,留给路径两端的源站和目的站的主机来处理,中途所经的路由器并不处理。
这样就大大提高了路由器的处理效率。

  • 每个扩展首部第一个8位是“下一个首部”字段。
  • 每个扩展首部第二个8位 是“首部长度”字段。

3.2 IPv6 的地址

IPv6 数据报的目的地址可以是以下三种基本类型地址之一:

  • (1) 单播 (unicast):传统的点对点通信。
  • (2) 多播 (multicast):一点对多点的通信。
  • (3) 任播 (anycast):这是 IPv6 增加的一种类型。任播的目的站是一组计算机,但数据报在交付时只交付其中的一个,通常是距离最近的一个。

IPv6 将实现 IPv6 的主机和路由器均称为结点。一个结点就可能有多个与链路相连的接口。IPv6 地址是分配给结点上面的接口的。一个结点可以有多个单播地址。其中的任何一个地址都可以当作到达该结点的目的地址。即一个结点接口的单播地址可用来唯一地标志该结点。

冒号十六进制记法

在 IPv6 中,每个地址占 16字节(128 位),地址空间大于 3.4 1 0 38 3.4*10^{38} 。IPv4使用点分十进制记法;IPv6 使用冒号十六进制记法(colon hexadecimal notation, 简写为 colon hex)。
用冒号分成8个 2字节(16 位)的值,每个值用十六进制值表示。例如:
68 E 6 : 8 C 64 : F F F F : F F F F : 0 : 1180 : 960 A : F F F F 68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
在十六进制记法中,允许把数字前面的 0 省略。例如把 0000 中的前三个 0 省略,写成 1 个 0。

零压缩

冒号十六进制记法可以允许零压缩 (zero compression),即一串连续的零可以为一对冒号所取代。 F F 05 : 0 : 0 : 0 : 0 : 0 : 0 : B 3 FF05:0:0:0:0:0:0:B3 可压缩为: F F 05 : : B 3 FF05::B3
注意:在任一地址中只能使用一次零压缩。

点分十进制记法的后缀

冒号十六进制记法可结合使用点分十进制记法的后缀,这种结合在 IPv4 向 IPv6 过渡的阶段特别有用。

例如: 0 : 0 : 0 : 0 : 0 : 0 : 128.10.2.1 0:0:0:0:0:0:128.10.2.1 再使用零压缩即可得出: : : 128.10.2.1 ::128.10.2.1
CIDR 的斜线表示法仍然可用。

例如:60 位的前缀 12 A B 00000000 C D 3 12AB00000000CD3 可记为: 12 A B : 0000 : 0000 : C D 30 : 0000 : 0000 : 0000 : 0000 / 60 12AB:0000:0000:CD30:0000:0000:0000:0000/60
12 A B : : C D 30 : 0 : 0 : 0 : 0 / 60 12AB::CD30:0:0:0:0/60 (零压缩)
12 A B : 0 : 0 : C D 30 : : / 60 12AB:0:0:CD30::/60 (零压缩)

3.3 从 IPv4 向 IPv6 过渡

向 IPv6 过渡只能采用逐步演进的办法,同时,还必须使新安装的 IPv6 系统能够向后兼容:IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由。两种向 IPv6 过渡的策略:

  • 使用双协议栈
  • 使用隧道技术
双协议栈

双协议栈 (dual stack) 是指在完全过渡到 IPv6 之前,使一部分主机(或路由器)安装两个协议栈,一个 IPv4 和一个 IPv6。 双协议栈的主机(或路由器)记为 IPv6/IPv4,表明它同时具有两种 IP 地址:一个 IPv6 地址和一个 IPv4 地址。双协议栈主机在和 IPv6 主机通信时是采用 IPv6 地址,而和 IPv4 主机通信时就采用 IPv4 地址。根据 DNS 返回的地址类型可以确定使用 IPv4 地址还是 IPv6 地址。

图22 使用双协议栈进行从 IPv4 到 IPv6 的过渡

隧道技术

在 IPv6 数据报要进入 IPv4 网络时,把 IPv6 数据报封装成为 IPv4 数据报,整个的 IPv6 数据报变成了 IPv4 数据报的数据部分。
当 IPv4 数据报离开 IPv4 网络中的隧道时,再把数据部分(即原来的 IPv6 数据报)交给主机的 IPv6 协议栈。

图23 使用隧道技术进行从 IPv4 到 IPv6 的过渡

3.4 ICMPv6

IPv6 也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。因此 IPv6 也需要使用 ICMP 来反馈一些差错信息。新的版本称为 ICMPv6。

地址解析协议 ARP 和网际组管理协议 IGMP 协议的功能都已被合并到 ICMPv6 中。

图24 新旧版本中的网络层的比较

CMPv6 是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信。ICMPv6 还增加了几个定义报文的功能和含义的其他协议。

图25 ICMPv6 报文的分类

本文中我们已经详细讨论了地址以及IP协议的内容,但是仅仅知道地址完成主机到主机之间的数据传输还是不够的,路由到底如何选择转发接口?路由表怎么建立?多播是撒?他是怎么工作的?下面我们就讨论这些问题。

猜你喜欢

转载自blog.csdn.net/qq_40791129/article/details/106029339