计算机网络 第四章:网络层
一.网络层概述
1.1分组转发和路由选择
网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。
如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实现各自的物理层和数据链路层即可,但是,如果需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络互连设备路由器。假设主机 A 是网络 N1 中的主机,主机 B是网络 N3 中的主机。

为了简单起见,有时我们可以不用画出这些网络,而将它们看作是一条链路即可。假设主机 A 给主机 B 发送分组,路由器 R1 收到后对其进行转发,从该网络拓扑可以看出,R1 可将该分组从自己的接口 2 转发,也可将该分组从自己的接口 3 转发。

R1如何知道应从自己的哪个接口转发分组?
答案是转发表,路由器在自己的转发表中查找该分组的目的地址,以便对其按照查表结果进行转发。
那么转发表又是如何得来的呢?

答案是路由表,那么路由表又是如何得来的呢?路由表是由路由器的路由选择处理机执行路由选择协议,并与其他相关路由器交换路由信息后得来的,如果网络拓扑比较简单,也可通过在路由器命令行输入命令的方式,对路由表进行静态配置。
注意,路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的,转发表的结构应当使查找过程最优化。为了简单起见,这里在讨论路由选择的原理时,并不严格区分路由表和转发表,而是以路由表来表述问题
1.2网络层向其上层提供的两种服务
1.2.1面向连接的虚电路服务


1.2.2无连接的数据报服务


对比

二.网际协议IP

这是四层 TCP/IP 体系结构,网络接口层支持各种网络接口,网际协议 IP 是 TCP/IP 体系结构网际层中的核心协议,网际协议 IP 可以互连各种不同的网络接口,TCP 和 UDP 是运输层中的两个重要协议,TCP 为应用层中的某些协议提供可靠传输服务,而 UDP 为应用层中的某些协议提供不可靠传输服务,TCP 和 UDP 都是用网际协议 IP 提供的不可靠传输服务。
由于网际协议 IP 是 TCP/IP 体系结构网络层中的核心协议,因此 TCP/IP 体系结构的网络层,常被称为网际层或 IP 层。
在网际层中与 IP 协议配套使用的还有四个协议,分别是
- 网际控制报文协议 ICMP
- 网际组管理协议 IGMP
- 逆地址解析协议 RARP(已淘汰)
- 地址解析协议 ARP
在网际层中,RARP 和 ARP 画在 IP 下面,这时因为 IP 协议经常要使用这两个协议。RARP 现在已被淘汰不使用了。
ICMP 和 IGMP画在 IP 的上面,因为它们要使用 IP 协议。
2.1异构网络互连
2.1.1需要解决的问题

2.1.2IP网

2.2IPv4地址及其编址方法
2.2.1IPv4地址概述
IPv4地址是给因特网上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符。
IPv4地址的编址方法经历了三个历史阶段:

2.2.2IPv4地址的表示方法
由于IPv4地址由32比特构成,不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。

2.2.3分类编址方法
两级结构的IPv4地址:网络标识(网络地址)+主机标识(主机地址)


分类编址方法把 IPv4地址分为A~E五类:

注意:
- A类、B类和C类地址都是单播地址,只有单播地址可以分配给网络中的主机(或路由器)的各接口。
- 主机号为“全0”的地址是网络地址,不能分配给主机(或路由器)的各接口。
- 主机号为“全1”的地址是广播地址,不能分配给主机(或路由器)的各接口。
网络地址和广播地址
- 网络地址是一个 IP 地址的一部分,它用于标识一个特定的网络。IP 地址通常分为网络地址和主机地址两部分,其中网络地址用于确定数据包应该发送到哪个网络,而主机地址用于标识网络中的具体主机或设备。网络地址的长度通常由 IP 地址的子网掩码决定。子网掩码中的“1”表示网络地址的位,而“0”表示主机地址的位。通过对 IP 地址和子网掩码进行逻辑与运算,可以提取网络地址。网络地址用于路由数据包,确保它们在网络中正确传递到目标网络。
- 广播地址是用于将数据包发送到同一网络中的所有主机或设备的特殊 IP 地址。它是一个特殊的 IP 地址,通常设置为目标网络的网络地址,但主机地址部分全部为二进制 1。因此,广播地址将数据包发送到了目标网络上的所有设备,而不需要明确知道每个设备的 IP 地址。广播通常用于一些特定的网络通信需求,如 DHCP(动态主机配置协议)请求,ARP(地址解析协议)请求等。
2.2.3.1A类地址

2.2.3.2B类地址

注意: 有些教材中指出128.0是保留网络号,B类第一个可指派的网络号为128.1。但根据2002年9月发表的RFC 3330文档,128.0网络号已经可以分配了。
2.2.3.3C类地址

注意: 有些教材中指出192.0.0是保留网络号,C类第一个可指派的网络号为192.0.1。但根据2002年9月发表的RFC 3330文档,192.0.0网络号已经可以分配了。只不过目前还没有分配出去。
2.2.3.4各类地址范围

- 根据地址左起第一个十进制数的值,可以判断出网络类别:
- 小于127的为A类
- 128~191的为B类
- 192~223的为C类
- 根据网络类别,就可找出地址中的网络号部分和主机号部分:
- A类地址网络号为左起第一个字节;
- B类地址网络号为左起前两个字节;
- C类地址网络号为左起前三个字节)
- 以下三种情况的地址不能指派给主机或路由器接口:
- A类网络号为 0 和 127
- 主机号为 “全0” ,这是网络地址
- 主机号为 “全1” ,这是广播地址

2.2.3.5一般不使用的特殊IPv4地址

2.2.3.6分类编址方法的缺点

注意:在第二步计算各网络中的主机和路由器的接口总数量时需特别留意加上路由器的接口数
- 首先应该找出图中都有哪些网络。左边两个网络,右边三台交换机在一起也组成了一个网络,不要忘记,两台路由器通过一段链路直连,它们的直连接口也属于同一个网络
- 之后,可以根据各网络中主机和路由器接口总数量来决定各网络分配哪个类别的网络号。
- 左上角的网络的主机数量为 655334,加上一个路由器接口,需要可分配的 IP 地址数量为65535,只能该网络分配一个 A 类网络号;
- 左下角的网络的主机数量为 254,加上一个路由器接口,需要可分配的 IP 地址数量为 255,可以给网络分配一个 A 类或 B 类网络号,本着节约IP 地址的原则,给该网络分配一个 B 类网络号;
- 右边网络的主机数量为 40,再加上一个路由器接口,需要可分配的 IP 地址数量为 41,给该网络分配一个 A 类,B 类或 C 类网络号都可以,本着节约 IP 地址的原则,给该网络分配一个 C 类网络号;
- 中间连接的网络没有主机,只有两个路由器接口,需要可分配的 IP 地址数量为 2,给该网络分配一个 A 类,B 类或 C 类网络号都可以,本着节约 IP 地址的原则,给该网络分配一个 C 类网络号;
- 依据网络号的类别,为每一个网络挑选一个网络号,A 类网络号的取值范围是 1-126,可在该范围内挑选一个网络号分配给相应网络;B 类网络号的取值范围是 128.0-191.255,可在该范围内挑选一个网络号分配给相应网络,C 类网络号的取值范围是 192.0.0~223.255.255,可在该范围内挑选两个网络号分配给相应网络,不同网络的网络号不能相同,网络号分配完毕后就可给各主机和路由器的各接口分配 IP 地址了。
需要注意的是,所分配的 IP 地址应该互不相同,并且其主机号部分不能出现“全 0”,因为这是网络地址,也不能出现“全 1”,因为这是广播地址,网络地址或广播地址都不能分配给主机或路由器的各接口,因为它们无法唯一标识一台主机或路由器的某个接口。
随着更多的中小网络加入因特网,IPv4分类编址方法不够灵活、容易造成大量IPv4地址资源浪费的缺点就暴露出来了。

如图所示,某单位有一个大型的局域网需要连接到因特网,如果申请一个 C 类网络地址,其可分配的 IP 地址数量只有 254 个,不够使用,因此该单位申请了一个 B 类网络地址,其可分配的 IP 地址数量达到了 65534 个,给每台计算机和路由器的接口分配一个 IP 地址后,还有大量的 IP 地址剩余,这些剩余的 IP 地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。
随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络,我们称其为子网 1,子网 2 和子网 3。假设子网 1 仍然使用原先申请到的 B 类网络地址,那么就需要为子网 2 和子网 3 各自申请一个网络地址,但这样会产生一些弊端:申请新的网络地址需要等待很长的时间并且要花费更多的费用;即便申请到了两个网络地址,这也会使其他路由器的路由表新增针对这两个新的网络的路由记录;另外,这样还会浪费原有网络中剩余的大量 IP 地址。
2.2.4划分子网编址方法
IPV4 地址编址方法的第二个历史阶段,也就是划分子网的 IPV4 地址。
如果可以从 IP 地址的主机号部分借用一些位为子网号来区分不同的子网,就可以利用原有网络中剩余的大量 IP 地址,而不用申请新的网络地址。

例如,对于本例,我们可以借用 16 位主机号中的 8 位作为子网号,假设我们给子网 1 分配的子网号为 0,给子网 2 分配的子网号为 1,给子网 3 分配的子网号为 2,之后,就可以给各自子网中的主机和路由器接口分配 IP 地址了。

如果未在图中标记子网号部分,那么我们或计算机又如何知道在分类地址中,主机号有多少比特被借用作为子网号了呢?这样我们就引出了一个划分子网的工具,他就是子网掩码。
2.2.4.1子网掩码
子网掩码可以表明分类IPv4地址的主机号部分被借用了几个比特作为子网号。
与IPv4地址类似,子网掩码也是由32比特构成的。
- 用左起多个连续的比特1对应IPv4地址中的网络号和子网号
- 之后的多个连续的比特0对应IPv4地址中的主机号


将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该IPv4地址所在子网的网络地址(主机号全为0)。这样,网络号和子网号被保留,而主机号被清零 ,结果为 IP 地址所在子网的网络地址。
2.2.4.2根据IP地址和子网掩码得出子网划分细节
只要给定了一个分类的IPv4地址及其相应的子网掩码,就可以得出子网划分的全部细节。

分析
- 题目给定网络地址为 218.75.230.0,从它的左起第一个十进制数可知,这是一个 C 类网络地址,因此网络号占三个字节,主机号占一个字节。
- 我们把主机号转为8比特表示,从左起有 1个 连续的1,表示从主机号借用1个 比特作为子网号。
划分细节

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 均分为两个子网。
练习


2.2.4.3默认子网掩码
默认子网掩码是指在未划分子网的情况下使用的子网掩码。

2.2.5无分类编制方法(CIDR)
2.2.5.1诞生背景

重新回到两级结构的IPv4地址:网络标识(网络地址)+主机标识(主机地址)

2.2.5.2地址掩码
与子网掩码类似,用左起多个连续的比特1对应IPv4地址中的网络前缀,之后的多个连续的比特0对应IPv4地址中的主机号。

2.2.5.3CIDR的斜线记法
为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPv4地址后面加上斜线“/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特1的数量),这种记法称为斜线记法。

2.2.5.4CIDR地址块
无分类域间路由选择CIDR是将网络前缀都相同的、连续的多个无分类IPv4地址,组成一个CIDR地址块,只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的以下全部细节:
- 地址块中的最小地址
- 地址块中的最大地址
- 地址块中的地址数量
- 地址块中聚合某类网络(A类、B类、C类)的数量
- 地址掩码

2.2.5.5使用CIDR地址块有效地分配IPv4地址空间
使用无分类编址方法,可以根据客户的需要分配适当大小的CIDR地址块,因此可以更加有效地分配IPv4的地址空间。


2.2.5.6路由聚合
使用无分类编址方法的另一个好处是路由聚合(也称为构造超网)。

如图所示:路由器 R1 与 5 个网络以及路由器 R2 直接相连。路由器 R1 和 R2 互为相邻路由器,它们周期性地通告自己所知道的路由信息给对方。R1 应该怎样地将路由信息通告给 R2 呢?
如果 R1 将自己直连的这五个网络的路由记录都通告给 R2,则 R2 的路由表会增加 5 条路由记录。为了减少路由记录对路由表的占用,能否将这 5 条记录聚合成 1 条呢?
答案是肯定的,其方法是“找共同前缀”,也就是找出这 5 个目的网络地址的共同前缀。这 5 个目的网络地址的左起前两个字节都是相同的,从第三个字节开始不同,因此,只需将第三个字节转换成二进制形式,这样就可以很容易找出这 5 个目的网络地址的共同前缀,共 22 个比特,我们将其记为“/22”。将共同前缀保持不变,而剩余的 10 个比特全部取 0,然后写成点分十进制形式,放在“/22”前面。这就是聚会后的地址块,也可以称为超网。


注意:这里求的是主机数,需要减去网络地址和广播地址

2.3IPv4地址的应用规划
IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址。
2.3.1定长子网掩码(FLSM)和变长子网掩码(VLSM)

2.3.2采用定长的子网掩码(FLSM)进行子网划分

①需求分析

②根据需求分析找出一个 用于子网划分的子网掩码


用三个十进制数 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 地址的严重浪费。
2.3.3采用变长的子网掩码(VLSM)进行子网划分

①需求分析

②根据需求分析找出用于各子网的地址块前缀

- 既然网络 1 需要 9 个地址,那么分配给网络 1 的地址的主机号应为 4 个比特,因为 2^4 等于 16,这样网络 1 就可有 16 个地址,由于使用 4 个比特作为主机号,因此剩余 28 个比特可作为网络前缀;
- 既然网络 2 需要 28 个地址,那么分配给网络 2 的地址的主机号应为 5 个比特,因为 2^5 等于 32,这样网络 2 就可有 32 个地址,由于使用 5 个比特作为主机号,因此剩余 27 个比特可作为网络前缀。
③从给定地址块中为各子网选择子块




注意理解网络地址的含义
2.4 IPv4地址与MAC地址
2.4.1 MAC地址、IP地址概述


2.4.2 IPv4地址与MAC地址的封装位置

如图所示,这是 TCP/IP 的四层体系结构,这是某个应用层协议封装的应用层报文,也称为应用层协议数据单元。
- 应用层将其向下交付给运输层,运输层也看不懂,也无需看懂应用层报文的结构和内容,因此我们将其用黑色表示。运输层的相应协议,仅仅为其添加一个运输层首部,使之称为运输层协议数据单元,并将其向下交付给网际层。
- 网际层看不懂也无需看懂运输层协议数据单元的结构和内容,因此我们将其用黑色表示。网际层的 IP 协议仅仅为其添加一个 IP 首部,使之成为网际层协议数据单元,也就是 IP 数据报,并将其向下交付给数据链路层。
- 数据链路层看不懂也无需看懂网际层协议数据单位的结构和内容,因此我们将其用黑色表示,数据链路层的相应协议,仅仅为其添加一个首部和一个尾部,使之成为数据链路层协议数据单元,也就是封装成帧,并将其向下交付给物理层。
- 物理层看不懂也无需看懂数据链路层协议数据单元的结构和内容,仅仅将它们看作是比特流,以便将它们转换为相应的电信号,发送到传输媒体。由于 IP 地址属于 TCP/IP 体系结构中网际层的范畴,因此,在 IP 首部中应该封装有源 IP 地址和目的 IP 地址,相应的,由于 MAC 地址属于数据链路层的范畴,因此,在帧首部中应该封装有源 MAC 地址和目的 MAC 地址。
2.4.3 数据包传送过程中IPv4地址与MAC地址的变化情况

如图所示,这是三个局域网通过两个路由器互传起来的小型互联网,假设主机 H1 给 H2 发送一个分组,该分组需要依次经过路由器 R1 和 R2 的转发才能最终到达 H2,我们从网络体系结构的角度,来看看数据包在传送过程中,IP 地址与 MAC 地址的变化情况,我们所关注的重点是网际层在封装IP 数据报时,源 IP 地址和目的 IP 地址应该填写什么,数据链路层在封装帧时,源 MAC 地址和目的 MAC 地址应该填写什么。因此,我们忽略网络体系结构中除网际层和数据链路层外的其他各层,各网际层进行水平方向的逻辑通信,各数据链路层进行水平方向的逻辑通信。
不难发现:
- 在数据包的传送过程中,数据包的源IP地址和目的IP地址保持不变;
- 在数据包的传送过程中,数据包的源MAC地址和目的MAC地址逐链路(或逐网络)改变。
2.4.4 IPv4地址与MAC地址的关系
如果仅使用MAC地址进行通信,则会出现以下主要问题:
- 因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的MAC地址。
- 手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由信息来自动构建路由表,也会因为路由信息需要包含海量的MAC地址信息而严重占用通信资源。
- 包含海量MAC地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延。
而因特网的网际层使用IP地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的MAC地址。
- 路由器收到IP数据报后,根据其首部中的目的IP地址的网络号部分,基于自己的路由表进行查表转发。
- 查表转发的结果可以指明IP数据报的下一跳路由器的IP地址,但无法指明该IP地址所对应的MAC地址。因此,在数据链路层封装该IP数据报成为帧时,帧首部中的目的MAC地址字段就无法填写,该问题需要使用网际层中的地址解析协议ARP来解决。
2.5地址解析协议ARP
2.5.1ARP高速缓存表

这是一个小型交换式以太网,为了简单起见,我们仅画出了该网络中的三台主机,这是它们各自所配置的 IP 地址,和其网卡上固化的 MAC 地址。假设主机 A 要给主机 B 发送一个分组,主机 A 知道主机 B 的 IP 地址,然而主机 A 不知道主机 B 的 MAC 地址,因此,主机 A 的数据链路层在封装以太网帧时,无法填写目的 MAC 地址。

实际上,每台主机都会维护一个 ARP 高速缓存表,ARP 高速缓存表中,记录了 IP 地址和 MAC 地址的对应关系。
2.5.2ARP广播请求和ARP单播响应

主机 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 都可以收到该广播帧。
- 主机 C 的网卡收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理,上层的 ARP 进程解析该ARP 请求报文,发现所询问的 IP 地址不是自己的地址,因此不予理会。
- 主机 B 的网卡收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理,上层的 ARP 进程解析该 ARP 请求报文,发现所询问的 IP 地址正是自己的 IP 地址,需要进行响应,主机 B 首先将 ARP 请求报文中所携带的主机A 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,然后给主机 A 发送 ARP 响应报文,以告知自己的 MAC 地址。

主机 A 将其所包含的主机 B 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,主机 A 现在可以给主机 B 发送分组了。
2.5.3ARP高速缓存表中的记录类型和生命周期
需要说明的是,ARP 高速缓存表中的每一条记录都有其类型,分为动态和静态两种。

2.5.4ARP相关注意事项
注意,ARP协议被用来解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题,不能跨网络使用。

如图所示,主机 H1和 H2之间有路由器 R1和 R2共2个路由器,当主机 H1要给主机 H2发送分组时,不能跨网络使用 ARP,而是要逐段链路或逐个网络使用 ARP。
- 由于ARP协议的主要用途是从网际层使用的IP地址解析出在数据链路层使用的MAC地址。因此,有的教材将ARP协议划归在网际层,而有的教材将ARP协议划归在数据链路层。这两种做法都是可以的。
- 除了ARP请求报文和响应报文,ARP协议还有其他类型的报文,例如用于检查IP地址冲突的“无故ARP”。
- 由于ARP协议很早就制定出来了(1982年11月),当时并没有考虑网络安全问题。因此,ARP协议没有安全验证机制,存在ARP欺骗和攻击等问题。
2.6IP数据报的发送和转发过程
IP数据报的发送和转发过程包含以下两个过程:
- 主机发送IP数据报
- 路由器转发IP数据报
为了将重点放在TCP/IP体系结构的网际层发送和转发IP数据报的过程上,在之后的举例中,将忽略以下过程:
- 使用ARP协议来获取目的主机或路由器接口的MAC地址的过程。
- 以太网交换机自学习和转发帧的过程。
2.6.1主机发送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 地址,分别分配给这两个网络中各主机和路由器的各接口。
2.6.1.1直接交付和间接交付

同一个网络中的主机之间可以直接通信,这属于直接交付,不同网络中的主机之间的通信,需要通过路由器来中转,这属于间接交付。那么源主机如何判断出目的主机是否与自己在同一个网络中呢?
2.6.1.2源主机判断目标主机是否与源主机在同一网络中的方法

假设主机 C 要给主机 F 发送 IP 数据报,主机 C 知道主机 F 的 IP 地址,于是将主机 F 的 IP 地址的前25个比特取出,与主机 C 自己的 IP 地址的前25个比特的网络前缀进行比较,可以发现,它们的 IP 地址的左起前25个比特并不完全相同,这就表明,主机 C 与 F 不在同一个网络。综上所述,主机 C 给主机 F 发送 IP 数据报,这属于间接交付,也就是说,主机 C 给主机 F 发送 IP 数据报,需要经过路由器的转发。
2.6.1.3默认网关

那么,主机 C 又是如何知道需要将 IP 数据报交给哪个路由器来转发呢?
实际上,用户为了让本网络中的各主机能与其他网络中的各主机进行通信,就必须给本网络中的各主机指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器也就被称为默认网关。

对于本例,我们可以将路由器接口0的 IP 地址指定给该接口所直连网络中的各主机作为默认网关。同理,可将路由器接口1的 IP 地址指定给该接口所直连网络中的各主机作为默认网关,这样,当本网络中的主机要和其他网络中的主机进行通信时,会将 IP 数据报发送给默认网关,由默认网关主机将 IP 数据报转发出去。
2.6.2路由器转发IP数据报
假设本例中的主机 A 要给主机 D 发送 IP 数据报,这属于间接交付,主机 A 会将该 IP 数据报发送给自己的默认网关,也就是图中所示的路由器,那么当路由器收到 IP 数据报后,又是如何进行转发的呢?

- 路由器首先会检查收到的 IP 数据报是否正确,例如该 IP 数据报的生存时间是否结束,首部是否出现了误码等,若不正确,则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送相应的 ICMP 差错报告。
- 假设该 IP 数据报没有出现差错,路由器基于 IP 数据报首部中的目的 IP 地址在自己的路由表中,查找匹配的路由条目,若找到匹配的路由条目,则按该路由条目的指示进行转发,否则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送相应的 ICMP 差错报告。
2.6.2.1查表转发

- 该 IP 数据报首部中,源 IP 地址192.168.0.1是主机 A 的 IP 地址,而目的 IP 地址192.168.0.129是主机 D 的 IP 地址。在我们给路由器的接口0配置 IP 地址和地址掩码后,路由器就可自行得出自己的接口0所直连网络的网络地址,目的网络为192.168.0.0,相应的地址掩码为255.255.255.128,不需要下一跳路由器因为该目的网络与接口0是直连的;
- 同理,在我们给路由器的接口1配置 IP 地址和地址掩码后,路由器可自行得出接口1的直连网络路由条目,目的网络为192.168.0.128,相应的地址掩码为255.255.255.128,不需要下一跳路由器因为该目的的网络与接口1是直连的。
需要说明的是路由表中可能还会有其他路由条目,这可能是用户或网络管理员手工配置的静态路由条目,也可能是路由器通过路由选择协议,自动获取到的动态路由条目。

路由器根据 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。
2.6.2.2路由器隔离广播域
我们再来看路由器对广播 IP 数据报的处理

假设主机 A 发送了一个广播 IP 数据报,该 IP 数据报首部中目的地址字段的值,可以设置为192.168.0.127,这是主机 A 所在网络的广播地址,也可以设置为受限的广播地址255.255.255.255。主机 A 所在网络中的各主机和路由器的接口0都会收到该广播 IP 数据报,默认情况下,路由器不会对广播IP 数据报进行转发,也就是说路由器是隔离广播域的。试想一下,如果因特网中数量巨大的路由器,收到广播 IP 数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。
相关文章:
计算机网络 第四章:网络层
一.网络层概述 1.1分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。 如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实…...
分享一个docker无法启动的小问题
准备看看docker服务怎么样 [rootlocalhost ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 这一看就是docker的进程崩了,我们启动下进程 [rootlocalhost ~]# systemctl start docker Faile…...
Linux 安全 - Capabilities机制
文章目录 前言一、简介二、Capabilities list2.1 POSIX-draft defined capabilities2.2 Linux-specific capabilities 三、 Past and current implementation四、Thread capability sets五、File capabilities六、Transformation of capabilities during execve()七、Capabilit…...
分布式搜索引擎es-3
文章目录 数据聚合聚合的种类RestAPI实现聚合 数据聚合 什么是聚合? 聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如…...
Matlab坐标轴标签中文设置宋体
对y坐标输出中文宋体 新罗马字符 x[1,2,3,4,5,6,7]; plot(x) ylabel(\fontname{宋体}\fontsize{20}长度\fontname{Times New Roman}\fontsize{10} (μm))可以灵活设置字体和大小,其图片如下图所示 也可以对全图的文字设置同一个字体 set(gca,FontSize,9,Fontname, Times New…...
做一个贪吃蛇小游戏happy一下
直接Vue上代码 <template><div><div>贪吃蛇</div><canvas id"canvas" width"400" height"400"></canvas></div> </template><script> export default {data() {return {ctx: null,inter…...
opencv形态学-膨胀
opencv形态学-膨胀 膨胀就是取每一个位置结构元邻域内最大值作为该位置的输出灰度值; 膨胀是取邻域内最大值,那么显然膨胀后图像整体亮度会比原先要高,图像中亮的物体尺寸会变大,相反暗的尺寸会减小,甚至是消失 结构元…...
玄子Share 设计模式 GOF 全23种 + 七大设计原则
玄子Share 设计模式 GOF 全23种 七大设计原则 前言: 此文主要内容为 面向对象七大设计原则(OOD Principle)GOF(Gang Of Four)23种设计模式拓展的两个设计模式 简单工厂模式(Simple Factory Pattern&#x…...
单链表操作 C实现
struct LNode { //定义一个节点 int data; //数据域 struct LNode *next; //指针域 }; 0.初始化 typedef sturct LNode{ //定义单链表结点类型 int date ; //每个结点存放一个数据元素struct LNode *next; //指针指向下…...
WordPress主题网站首页添加好看的四格小工具教程
直接到网站根目录创建一个css文件(文件名:sige.css),文件名可自定义(注意文件名一致) <link rel"stylesheet" href"你的网站/sige.css" type"text/css" > 然后在header.php模板最上方添加引入代码 也可自定义HTML里添加css代码最上方写…...
unittest自动化测试框架讲解以及实战
为什么要学习unittest 按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,通常指函数或者类,一般是开发完成的。 单元…...
数学建模之Matlab基础操作
作者由于后续课程也要学习Matlab,并且之前也进行了一些数学建模的练习(虽然是论文手),所以花了几天零碎时间学习Matlab的基础操作,特此整理。 基本运算 a55 %加法,同理减法 b2^3 %立方 c5*2 %乘法 x 1; …...
【Nuxt】04 Nuxt2-SEO: sitemap.xml、seo优化、robots.txt
1 SiteMap设置 环境准备 注意生成sitemap依赖于nuxtjs/sitemap,并且需要用axios进行请求,不要使用nuxtjs/axios,不然会报错 sitemap.xml配置 在nuxt.config.js中配置下面的内容 npm install nuxtjs/sitemap npm install axios在static/s…...
VMware VSAN 入门
一、虚拟化的存储 1.1、对于数据中心来说最重要的是数据,而承载数据的设备就是存储设备(Storage) 1.2、物理服务器的本地存储阵列 与 虚拟化服务器的本地存储阵列 对比 1.3、避免单台服务器故障的虚拟化高级特性:vSphere HA技术 …...
【设计模式】备忘录模式
文章目录 1.备忘录模式定义2.备忘录模式的角色3.备忘录模式实现3.1.场景说明3.2.结构类图3.3.代码实现 4.备忘录模式优缺点5.备忘录模式适用场景6.备忘录模式总结 主页传送门:💁 传送 1.备忘录模式定义 备忘录(Memento Pattern)模…...
vue3+elementUiPlus表格导出功能
1.下载需要的组件包 npm install file-saver xlsx 2.页面中导入 import FileSaver from file-saver import * as XLSX from xlsx; 3.页面中的表格加一个id <el-table :data"tableData" ref"multipleTableRef" style"width…...
专题五:优先级队列
"你了解我,最干净的轮廓, 握住小小风车和放肆的梦~" 堆是一个不错的数据结构,而在计算机中,无法表示二叉分支结构,因此我们经常会看到使用线性表来作为堆的存储容器。在接触堆的时候,我们是把它…...
游戏设计模式专栏(一):工厂方法模式
引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》,让糟糕的代码在潜移默化中升华,欢迎大家关注分享收藏订阅。 在游戏开发中,代码的组织和结构对于项目的可…...
element中使用el-steps 进度条效果demo(整理)
<template><div class"margin-top20"><!-- align-center 不要居中就去掉 --><!-- process-status 这几个参数值:改变颜色 wait / process / finish / error / --><!-- active 到第几个是绿色 --><el-steps :space&qu…...
038:mapboxGL 旋转地图(rotateTo)
第038个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中旋转地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...
Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...

