网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。
如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实现各自的物理层和数据链路层即可,但是,如果需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络互连设备路由器。假设主机 A 是网络 N1 中的主机,主机 B是网络 N3 中的主机。
为了简单起见,有时我们可以不用画出这些网络,而将它们看作是一条链路即可。假设主机 A 给主机 B 发送分组,路由器 R1 收到后对其进行转发,从该网络拓扑可以看出,R1 可将该分组从自己的接口 2 转发,也可将该分组从自己的接口 3 转发。
R1如何知道应从自己的哪个接口转发分组?
答案是转发表,路由器在自己的转发表中查找该分组的目的地址,以便对其按照查表结果进行转发。
那么转发表又是如何得来的呢?
答案是路由表,那么路由表又是如何得来的呢?路由表是由路由器的路由选择处理机执行路由选择协议,并与其他相关路由器交换路由信息后得来的,如果网络拓扑比较简单,也可通过在路由器命令行输入命令的方式,对路由表进行静态配置。
注意,路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的,转发表的结构应当使查找过程最优化。为了简单起见,这里在讨论路由选择的原理时,并不严格区分路由表和转发表,而是以路由表来表述问题
对比
这是四层 TCP/IP 体系结构,网络接口层支持各种网络接口,网际协议 IP 是 TCP/IP 体系结构网际层中的核心协议,网际协议 IP 可以互连各种不同的网络接口,TCP 和 UDP 是运输层中的两个重要协议,TCP 为应用层中的某些协议提供可靠传输服务,而 UDP 为应用层中的某些协议提供不可靠传输服务,TCP 和 UDP 都是用网际协议 IP 提供的不可靠传输服务。
由于网际协议 IP 是 TCP/IP 体系结构网络层中的核心协议,因此 TCP/IP 体系结构的网络层,常被称为网际层或 IP 层。
在网际层中与 IP 协议配套使用的还有四个协议,分别是
在网际层中,RARP 和 ARP 画在 IP 下面,这时因为 IP 协议经常要使用这两个协议。RARP 现在已被淘汰不使用了。
ICMP 和 IGMP画在 IP 的上面,因为它们要使用 IP 协议。
IPv4地址是给因特网上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符。
IPv4地址的编址方法经历了三个历史阶段:
由于IPv4地址由32比特构成,不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。
两级结构的IPv4地址:网络标识(网络地址)+主机标识(主机地址)
分类编址方法把 IPv4地址分为A~E五类:
注意:
网络地址和广播地址
注意: 有些教材中指出128.0是保留网络号,B类第一个可指派的网络号为128.1。但根据2002年9月发表的RFC 3330文档,128.0网络号已经可以分配了。
注意: 有些教材中指出192.0.0是保留网络号,C类第一个可指派的网络号为192.0.1。但根据2002年9月发表的RFC 3330文档,192.0.0网络号已经可以分配了。只不过目前还没有分配出去。
注意:在第二步计算各网络中的主机和路由器的接口总数量时需特别留意加上路由器的接口数
需要注意的是,所分配的 IP 地址应该互不相同,并且其主机号部分不能出现“全 0”,因为这是网络地址,也不能出现“全 1”,因为这是广播地址,网络地址或广播地址都不能分配给主机或路由器的各接口,因为它们无法唯一标识一台主机或路由器的某个接口。
随着更多的中小网络加入因特网,IPv4分类编址方法不够灵活、容易造成大量IPv4地址资源浪费的缺点就暴露出来了。
如图所示,某单位有一个大型的局域网需要连接到因特网,如果申请一个 C 类网络地址,其可分配的 IP 地址数量只有 254 个,不够使用,因此该单位申请了一个 B 类网络地址,其可分配的 IP 地址数量达到了 65534 个,给每台计算机和路由器的接口分配一个 IP 地址后,还有大量的 IP 地址剩余,这些剩余的 IP 地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。
随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络,我们称其为子网 1,子网 2 和子网 3。假设子网 1 仍然使用原先申请到的 B 类网络地址,那么就需要为子网 2 和子网 3 各自申请一个网络地址,但这样会产生一些弊端:申请新的网络地址需要等待很长的时间并且要花费更多的费用;即便申请到了两个网络地址,这也会使其他路由器的路由表新增针对这两个新的网络的路由记录;另外,这样还会浪费原有网络中剩余的大量 IP 地址。
IPV4 地址编址方法的第二个历史阶段,也就是划分子网的 IPV4 地址。
如果可以从 IP 地址的主机号部分借用一些位为子网号来区分不同的子网,就可以利用原有网络中剩余的大量 IP 地址,而不用申请新的网络地址。
例如,对于本例,我们可以借用 16 位主机号中的 8 位作为子网号,假设我们给子网 1 分配的子网号为 0,给子网 2 分配的子网号为 1,给子网 3 分配的子网号为 2,之后,就可以给各自子网中的主机和路由器接口分配 IP 地址了。
如果未在图中标记子网号部分,那么我们或计算机又如何知道在分类地址中,主机号有多少比特被借用作为子网号了呢?这样我们就引出了一个划分子网的工具,他就是子网掩码。
子网掩码可以表明分类IPv4地址的主机号部分被借用了几个比特作为子网号。
与IPv4地址类似,子网掩码也是由32比特构成的。
将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该IPv4地址所在子网的网络地址(主机号全为0)。这样,网络号和子网号被保留,而主机号被清零 ,结果为 IP 地址所在子网的网络地址。
只要给定了一个分类的IPv4地址及其相应的子网掩码,就可以得出子网划分的全部细节。
分析
划分细节
218.75.230.0 是该网络上的第一个地址,由于这是一个 C 类网地址,因此网络号占 3 个字节,主机号占 1 个字节,将网络号保持不变,而主机号取最大值 255,这就是该网络上的最后一个地址。该 C 类网共有256 个地址,其中第一个地址作为该网络的网络地址也就是主机号“全 0”的地址。最后一个地址作为该网络的广播地址,也就是主机号“全 1”的地址。
之前分析过题目所给的子网掩码表明从主机号部分借用 1 比特作为子网号,也就是将该 C 类网均分为两个子网。我们将主机号写成 8比特的形式,从主机号借用 1 个比特作为子网号,子网号只能是 0 或 1。使用子网掩码255.255.255.128 可将 C 类网 218.75.230.0 均分为两个子网。
练习
默认子网掩码是指在未划分子网的情况下使用的子网掩码。
重新回到两级结构的IPv4地址:网络标识(网络地址)+主机标识(主机地址)
与子网掩码类似,用左起多个连续的比特1对应IPv4地址中的网络前缀,之后的多个连续的比特0对应IPv4地址中的主机号。
为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPv4地址后面加上斜线“/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特1的数量),这种记法称为斜线记法。
无分类域间路由选择CIDR是将网络前缀都相同的、连续的多个无分类IPv4地址,组成一个CIDR地址块,只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的以下全部细节:
使用无分类编址方法,可以根据客户的需要分配适当大小的CIDR地址块,因此可以更加有效地分配IPv4的地址空间。
使用无分类编址方法的另一个好处是路由聚合(也称为构造超网)。
如图所示:路由器 R1 与 5 个网络以及路由器 R2 直接相连。路由器 R1 和 R2 互为相邻路由器,它们周期性地通告自己所知道的路由信息给对方。R1 应该怎样地将路由信息通告给 R2 呢?
如果 R1 将自己直连的这五个网络的路由记录都通告给 R2,则 R2 的路由表会增加 5 条路由记录。为了减少路由记录对路由表的占用,能否将这 5 条记录聚合成 1 条呢?
答案是肯定的,其方法是“找共同前缀”,也就是找出这 5 个目的网络地址的共同前缀。这 5 个目的网络地址的左起前两个字节都是相同的,从第三个字节开始不同,因此,只需将第三个字节转换成二进制形式,这样就可以很容易找出这 5 个目的网络地址的共同前缀,共 22 个比特,我们将其记为“/22”。将共同前缀保持不变,而剩余的 10 个比特全部取 0,然后写成点分十进制形式,放在“/22”前面。这就是聚会后的地址块,也可以称为超网。
注意:这里求的是主机数,需要减去网络地址和广播地址
IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址。
用三个十进制数 255 来对应网络号部分,也就是用 24 个连续的比特 1 来对应网络号,而最后 8 个比特为 11100000,其中 3 个连续的比特 1 表示从主机号部分借用 3 个比特作为子网号,将这 8 个比特写为十进制数为 224。
现在我们就可以从子网 1-8 中任选 5 个分配给图中的网络 1~5,通过本例可以看出,采用定长的子网掩码进行子网划分,只能划出 2^n 个子网,其中 n 是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配的 IP 地址数量相同,容易造成 IP 地址的浪费,例如图中的网络 5 只需要 4 个 IP 地址,但是我们只能给它分配 32 个 IP 地址,这样就造成了 IP 地址的严重浪费。
注意理解网络地址的含义
如图所示,这是 TCP/IP 的四层体系结构,这是某个应用层协议封装的应用层报文,也称为应用层协议数据单元。
如图所示,这是三个局域网通过两个路由器互传起来的小型互联网,假设主机 H1 给 H2 发送一个分组,该分组需要依次经过路由器 R1 和 R2 的转发才能最终到达 H2,我们从网络体系结构的角度,来看看数据包在传送过程中,IP 地址与 MAC 地址的变化情况,我们所关注的重点是网际层在封装IP 数据报时,源 IP 地址和目的 IP 地址应该填写什么,数据链路层在封装帧时,源 MAC 地址和目的 MAC 地址应该填写什么。因此,我们忽略网络体系结构中除网际层和数据链路层外的其他各层,各网际层进行水平方向的逻辑通信,各数据链路层进行水平方向的逻辑通信。
不难发现:
如果仅使用MAC地址进行通信,则会出现以下主要问题:
而因特网的网际层使用IP地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的MAC地址。
这是一个小型交换式以太网,为了简单起见,我们仅画出了该网络中的三台主机,这是它们各自所配置的 IP 地址,和其网卡上固化的 MAC 地址。假设主机 A 要给主机 B 发送一个分组,主机 A 知道主机 B 的 IP 地址,然而主机 A 不知道主机 B 的 MAC 地址,因此,主机 A 的数据链路层在封装以太网帧时,无法填写目的 MAC 地址。
实际上,每台主机都会维护一个 ARP 高速缓存表,ARP 高速缓存表中,记录了 IP 地址和 MAC 地址的对应关系。
主机 A 的 ARP 高速缓存表中的第一条记录是主机 A 之前获取到的主机 C 的IP 地址与 MAC 地址的对应关系,当主机 A 要给主机 B 发送分组时,会首先在自己的 ARP 高速缓存表中,查找主机 B 的 IP 地址所对应的 MAC 地址,但未找到。
于是主机 A 发送 ARP 请求报文来获取主机 B 的 MAC 地址,ARP 请求报文是广播报文,需要封装在以太网帧中发送,帧的目的 MAC 地址为广播地址,也就是 48 比特为全 1,十六进制为全 F 形式的地址。
为了简单起见,我们用简单的语言来描述 ARP 请求报文的内容,实际上 ARP 请求报文有其具体的格式。交换机收到封装有该 ARP 请求报文的以太网广播帧后,将其从自己的其他所有接口转发出去,这样,主机 B 和 C 都可以收到该广播帧。
主机 A 将其所包含的主机 B 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,主机 A 现在可以给主机 B 发送分组了。
需要说明的是,ARP 高速缓存表中的每一条记录都有其类型,分为动态和静态两种。
注意,ARP协议被用来解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题,不能跨网络使用。
如图所示,主机 H1和 H2之间有路由器 R1和 R2共2个路由器,当主机 H1要给主机 H2发送分组时,不能跨网络使用 ARP,而是要逐段链路或逐个网络使用 ARP。
IP数据报的发送和转发过程包含以下两个过程:
为了将重点放在TCP/IP体系结构的网际层发送和转发IP数据报的过程上,在之后的举例中,将忽略以下过程:
如图所示:路由器 R 的接口0连接了一个由交换机 S1和3台主机互连而成的交换式以太网,记为以太网1;路由器 R 连接了一个由交换机 S2和3台主机互连而成的另一个交换式以太网,记为以太网2。
假设以太网1分配到的 CIDR 地址块为192.168.0.0/25;以太网2的 CIDR 地址块为192.168.0.128/25,我们从这两个 CIDR 地址块中,选择可分配给主机或路由器接口的 IP 地址,分别分配给这两个网络中各主机和路由器的各接口。
同一个网络中的主机之间可以直接通信,这属于直接交付,不同网络中的主机之间的通信,需要通过路由器来中转,这属于间接交付。那么源主机如何判断出目的主机是否与自己在同一个网络中呢?
假设主机 C 要给主机 F 发送 IP 数据报,主机 C 知道主机 F 的 IP 地址,于是将主机 F 的 IP 地址的前25个比特取出,与主机 C 自己的 IP 地址的前25个比特的网络前缀进行比较,可以发现,它们的 IP 地址的左起前25个比特并不完全相同,这就表明,主机 C 与 F 不在同一个网络。综上所述,主机 C 给主机 F 发送 IP 数据报,这属于间接交付,也就是说,主机 C 给主机 F 发送 IP 数据报,需要经过路由器的转发。
那么,主机 C 又是如何知道需要将 IP 数据报交给哪个路由器来转发呢?
实际上,用户为了让本网络中的各主机能与其他网络中的各主机进行通信,就必须给本网络中的各主机指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器也就被称为默认网关。
对于本例,我们可以将路由器接口0的 IP 地址指定给该接口所直连网络中的各主机作为默认网关。同理,可将路由器接口1的 IP 地址指定给该接口所直连网络中的各主机作为默认网关,这样,当本网络中的主机要和其他网络中的主机进行通信时,会将 IP 数据报发送给默认网关,由默认网关主机将 IP 数据报转发出去。
假设本例中的主机 A 要给主机 D 发送 IP 数据报,这属于间接交付,主机 A 会将该 IP 数据报发送给自己的默认网关,也就是图中所示的路由器,那么当路由器收到 IP 数据报后,又是如何进行转发的呢?
需要说明的是路由表中可能还会有其他路由条目,这可能是用户或网络管理员手工配置的静态路由条目,也可能是路由器通过路由选择协议,自动获取到的动态路由条目。
路由器根据 IP 数据报的目的 IP 地址,在自己的路由表中查找匹配的路由条目,将 IP 数据报的目的地址192.168.0.129与第1条路由条目中的地址掩码255.255.255.128,进行逻辑与运算,得到网络地址192.168.0.128,该网络地址与第1条路由条目中的目的网络地址192.168.0.0不相同,因此第1条路由条目不匹配。
将 IP 数据报的目的地址192.168.0.129与第2条路由条目中的地址掩码255.255.255.128进行逻辑与运算,得到网络地址192.168.0.128,该网络地址与第2条路由条目中的目的网络地址192.168.0.128,因此第2条路由条目匹配,路由器根据匹配的路由条目中的下一跳的指示。
从自己的接口1直接交付 IP 数据报给主机 D,路由器只需通过 ARP 协议,获取到与自己的接口处于同一网络中的目的主机 D 的 MAC 地址,就可将 IP 数据报封装成帧后,发送给目的主机 D。
我们再来看路由器对广播 IP 数据报的处理
假设主机 A 发送了一个广播 IP 数据报,该 IP 数据报首部中目的地址字段的值,可以设置为192.168.0.127,这是主机 A 所在网络的广播地址,也可以设置为受限的广播地址255.255.255.255。主机 A 所在网络中的各主机和路由器的接口0都会收到该广播 IP 数据报,默认情况下,路由器不会对广播IP 数据报进行转发,也就是说路由器是隔离广播域的。试想一下,如果因特网中数量巨大的路由器,收到广播 IP 数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。