网络层-湖科大计网笔记

网络层概述

实现网络互联
主要解决以下问题：

为运输层提供服务（可靠或不可靠）；

网络寻址问题（网络编号与路由器接口）

路由选择问题；

分组转发和路由选择

网络层的主要任务：就是将分组从源主机经过多个网络和多段链路传输到目的主机，可以将该任务划分为分组转发和路由选择两种重要的功能

如上图，路由器要处理怎么有效地从 A 到 B 的问题

路由表需要对网络拓扑变化的计算最优化

转发表是从路由表得出，转发表的结构需要使查找最优化

网络层向上提供的两种服务

面向连接的虚电路服务

== 看图，核心是，直达，走出一条路来，放佛是拉着一根物理线 ==

核心思想是 “可靠通信应由网络自身来保证”。

必须首先建立网络层连接 —— 虚电路（Virtual Circuit，VC），以保证通信双方所需的一切网络资源

通信双方沿着已建立的虚电路发送分组。(是逻辑连接，分组沿着这条逻辑连接按照存储转发方式传送，不是真正物理连接)

分组的首部仅在连接建立阶段使用完整的目的主机地址，之后每个分组的首部只需要携带一条虚电路编号即可。

通信结束后，需要释放之前所建立的虚电路。（有两种，也有不释放的虚电路)

使用虚电路 + 可靠传输的网络协议，就可使所发送的分组最终正确（== 无差错按序到达、不丢失、不重复 ==）到达接收方

很多广域分组交换网都使用面向连接的虚电路服务。例如，曾经的 X.25 和逐渐过时的帧中继 （Frame Relay，FR）、异步传输模式（Asynchronnous Transfer Mode，ATM）。

但因特网没有采用虚电路服务，而采用无连接的数据报服务。

无连接的数据报服务

核心思想是 “可靠通信应由用户主机来保证”(自己随便走，问题留给接收方处理)

不需要建立网络层连接。（分组可能误码、丢失、重复和失序。）

每个分组可走不同的路径。因此，每个分组的首部都必须携带目的主机的完整地址。

网际协议（IP）

网际协议（Internet Protocol，IP）是 TCP/IP 体系结构网际层中的核心协议
TCP 和 IP 的通信来往

TCP 为应用层的某些协议提供可靠，UDP 为... 提供不可靠

与 IP 协议配套使用的四个协议：

ICMP：网际控制报文协议

IGMP：网际组管理协议

RARP：逆地址解析协议

ARP：地址解析协议

也就是网际层下有
ICMP IGMP
↓
IP
↓
ARP
的结构

与异构网络互联

网际层把一团网络视作一个统一网络处理

IPv4

IPv4 是什么

因特网（Internet）上的每一个主机（或路由器）的每一个接口分配的一个在全世界范围内唯一的 32 比特的标识符。

IPv6 有 128 比特
Pv 4 地址的编址方法：分类编制、划分子网、无分类编制

IPV 4 地址表示方法（点分十进制表示方法）

点分十进制表示方法：每 8 位一组，每组之间用。分割

二进制转 10 进制再组合

分类编址方法

A 类地址

本地软件环回测试地址，用于本主机内的进程之间的通信。

若主机发送一个目的地址为环回测试，例如 127.0.0.1 的 IP 数据报，则本主机的协议软件就处理数据报中的数据，而不会把数据报发送到任何网络。目的地址为环回地址的 IP 数据报永远不会出现在任何网络上，因为网络号为 127 的地址根本不是一个网络地址。

主机号全 0—— 网络地址：即是这个网络中的所有主机的地址

主机号全 1—— 广播地址：即是向这个网络中所发送广播的地址

127 开头是定死了的，是本地使用的地址，127 后面的二进制数字组合就是我们可以在本地分配的地址

126 是最大的可以去联网的 8 位前缀

不同的前缀也就是组合起来了不同的 "每个"A 类地址，每个 A 类地址中具体的地址数量也就是后面这 24 位决定的

B 类地址

C 类地址

地址间的对比

ABCDE 五类 ipv 4 地址的指派范围

18m51s

路由器之间的点对点链路也可看作是一个网络。该网络中有 65534 台主机和一个路由器接口，需要可分配的 ipv 4 地址数量为 65535 个，这超过了一个 b 类网，可分配的 I P V 4 地址数量只能为该网络分配一个 a 类网络号，也就是从 1- 126 中挑选一个。
该网络中有 254 台主机和一个路由器接口，需要可分配的 ipv 4 地址数量为 255 个，这超过了一个 c 类网可分配的 IPV 4 地址数量只能为该网络分配一个 b 类网络号，也就是从 128. 0 到 191. 255 中挑选一个。该网络中有 42 台主机和一个路由器接口，需要可分配的 IPV4 地址数量为 43 个，可以为该网络分配一个 c 类网络号，也就是从 192. 0. 0 到 223. 25 中挑选一个。 255. 该网络中没有主机，但包含两个路由器接口，需要可分配的 IPV4 地址数量为两个，可以为该网络分配一个 c 类网络号，也就是从 192. 0. 0 到 23. 25 武装挑选一个，但不能与之前已分配的那个 c 类网络号相同。 255.
在给各网络分配了网络号后，就可以给各网络中的各主机和路由器的各接口分配相应网络号下的 IPV4 地址了。请同学们注意，同一个网络中，不同主机和路由器的各接口的 IPV4 地址的主机号必须各不相同，并且不能为全 0 和全一。因为主机号为全 0 的地址是网络地址，而主机号为全一的地址是广播地址，这两种地址是不能分配给主机或路由器接口的。通过本例可以看出， IPV4 分类编制方法最大的缺点就是容易造成 IPV4 地址的大量浪费。例如路由器 R1 的接口 2 所连接的网络需要的可分配 IPV4 地址数量为 255 个。由于一个 c 类网络所包含的可分配 IPV4 地址数量为 254 个，无法满足该网络对可分配 IBV4 地址数量的需求，因此不得不为该网络分配一个 b 类网络号。然而，一个 b 类网络所包含的可分配 IPV4 地址数量为 65534 个，而该网络只需要 255 个地址，因此会造成 == 大量地址浪费 ==

IPv4 地址的划分子网编址方法 - 第二阶段 - 三级结构

当一个团队给自己的所有主机，申请到了，比如说 B 类地址，但是主机数量远远没有达到 B 类的上限，就造成了浪费

从 IPv4 地址的主机号部分借用一些比特作为子网号来区分不同的子网，就可以利用原有网络中剩余的大量 IPv4 地址，而不用申请新的网络地址了

IPv4 地址的划分子网编址方法

子网掩码可以表明分类 IPv4 地址的主机号部分被借用了几个比特作为子网号。

与 IPv4 地址类似，子网掩码也是由 32 比特构成的。

用左起多个连续的比特 1 对应 IPv4 地址中的网络号和子网号；

之后的多个连续的比特 0 对应 IPv4 地址中的主机号

将划分子网的 IPv4 地址与相应的子网掩码进行逐比特的逻辑与运算，就可得到该 IPv4 地址所在子网的网络地址。

关于默认子网掩码：满足既可以子网划分又可以不进行子网划分

例题：

无分类编址 -CIDR

存在问题：数量巨大的 C 类网由于其每个网络所包含的地址数量太小，没有得到充分使用。

地址掩码

无分类编址方法使用的地址掩码与划分子网使用的子网掩码类似，由 32 比特构成。

用左起多个连续的比特 1 对应 IPv 4 地址中的网络前缀；

之后的多个连续的比特 0 对应 IPv 4 地址中的主机号。

仅从 IPv 4 地址自身无法看出网络前缀和主机号各自的长度，必须配合地址掩码使用

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

斜线记法：

例题：

路由聚合

网络前缀越长，地址块越小，路由越具体

若路由器查表转发分组时发现有多条路由条目匹配，则选择网络前缀最长的那条路由条目，这称之为最长路由匹配，因为这样的路由更具体

拆分 CIDR 地址块，目的地址的概念，也就是得到前缀后，主机那一部分全部都取成 0

这里明确一个概念，题目里说的，192.168.9.128/26 是子网，也就是说，它的那一类中，聚合的网络如果有，应该是比 26 要小于等于的，取 25 位的比特前缀也就有他了

应用规划

秉持原则

先分类

分类就是，就有个图，我们就从主机号那里看借来多少位取 2 的幂大于要覆盖的图

再分个数

主机号剩下的比特位就是我们能用来具体给每一个分配的地址

定长子网掩码

使用同一个子网掩码来划分子网
子网依次增大，主机号控制着每个之间内的覆盖大小，这里的主机号是 5 位，那么它们网络地址之间的间隔就是 2 的五次方，也就是 32

如下所示，每个子网都分配 32 个，但实际需要的却不要这么多，故造成不必要的浪费

网络 5 只要 4 个地址，但是给他分配了 32 个

变长子网掩码

07m01s

使用不同的子网掩码来划分子网；

每个子网所分配的 IP 地址数量可以不同，尽可能减少对 IP 地址的浪费；

子块选择原则：

每个子块的起点位置不能随便选取，只能选取主机号部分是块大小整数倍的地址作为起点。

建议先为大的子块选取。

例题：

二叉树的划分方法

【定长子网划分】

【变长子网划分】

变长子网划分的方法可能不止一种，但不是随意选五个子块都可以

【例题】

IPv 4 地址与 MAC 地址

IPv 4 地址与 MAC 地址的封装位置

数据包传送过程中 IPv 4 地址与 MAC 地址的变化情况

在数据包的传送过程中，数据包的源 IP 地址和目的 IP 地址保持不变（也就是出发地和最终目的地，下图中的源 mac 1 和目的 mac 2）

在数据包的传送过程中，数据包的源 MAC 地址和目的 MAC 地址逐链路（或逐网络）改变。

例题：

IPv4 地址与 MAC 地址的关系
因特网要使用 IP 地址和 MAC 地址这两种类型的地址来共同完成寻址工作

路由器收到 IP 数据报后，根据其首部中的目的 IP 地址的网络号部分，基于自己的路由表进行查表转发。

地址解析协议 ARP 会将 IP 地址对应成 MAC 地址

地址解析协议 Arp

每台主机会维护自己的 ARP 缓存表，每次根据 ip 地址招人的时候，会先去自己的缓存表中找找看，目的地的 ip 地址有没有对应的 ARP 缓存信息在自己的缓存表中

如果不在，它就会发送广播帧（全 f）给到同一网络下的所有设备，携带的信息如下：
我是 xxx，我的目的是 xxx，我的 mac 地址是 xxx
如果每台主机检查 ip 地址发现，自己和发出主机的目的地不是一致的，就会把它舍弃掉，如果是一致的，那么就会发送单播的响应报文，
我是 xxx，我的目的地是 xxx，我的 mac 地址是 xxx
这个响应报文回到发出者以后，发出者就在自己的 ARP 缓存中把这个 ip 地址和 mac 地址的对应关系建立起来

动态静态类型

-- 动态：ARP 记录是主机通过 ARP 自动获取到的，生命周期默认为两分钟。生命周期结束后，该记录自动删除

-- 静态：该记录是由用户或网络维护人员手工配置，不同操作系统下的生命周期不同，例如系统重启后不存在或系统重启后依然有效

周期性缓存表中的对应关系

交换机转发表中的 mac 地址和交换机接口号的对应关系是需要周期性删除的，因为这种对应关系不是永久不变的

同理，arp 中的 ip 地址和 mac 地址的对应关系，也不是永久不变的，比如用户更换了一块新的网卡

ip 数据报的发送和转发过程

主机发送 ip 数据报

路由器转发 ip 数据报

路由器维护自己接口所处的子网和子网验码及其自己的接口的对应关系
接收到出发点发来的目的地址以后，路由器把自己维护的接口对应的子网的地址掩码和目的地址逻辑 & 运算，如果结果匹配上了自己的某个接口对应的子网，就从这个接口转发出去

默认网关：如图，主机 A 如何知道能在网络中通信，必须指定本网络中的一个路由器，由该路由器帮忙转发，所指定的路由器为被称为默认网关

路由器在接收到 IP 数据报如何转发呢

❶ 检查收到的 IP 数据报是否正确

生存时间是否结束；首部是否误码

若不正确，则丢弃该 IP 数据报，并向发送该 IP 数据报的源主机发送差错报告

❷ 基于 IP 数据报首部中的目的 IP 地址在路由表中进行查找。

若找到匹配的路由条目，则按该路由条目的指示进行转发，否则丢弃该 IP 数据报，并向发送该 IP 数据报的源主机发送 ICMP 差错报告。

路由器将目的地址与路由条目中的地址掩码相与得到目的网络地址，查看该目的网络是否匹配；

路由器对广播数据报的处理

路由器隔离广播域，同子网下的其他设备都能接收到，路由器不会转发广播

例题：
12m35s

ip 数据报的首部格式

ipv 4 数据报的首部格式及其内容是实现本协议各种功能的基础

在 tcp/ip 中，各种数据格式总是以 32 比特，也就是 4 个字节为单位来描述

分为固定部分和可变部分

固定部分：每个 ipv 4 数据报都要包含的部分 （理解为格式）
可变部分：某些 ipv 4 数据报的首部，除了包含 20 字节的固定部分(这是基础)，还包含一些可选地字段来增加 ipv 4 数据报的功能 （理解为插件）

版本：

4 个比特，表示 ip 协议的版本，通信双方必须使用一样的版本

首部长度：

表示 ip 数据报的首部的长度，字段取值以 4 字节为单位
- 首部长度的最小取值为 0101，也就是十进制的 5，再乘以 4 个字节每单位，也就表示 ==ipv 4 数据报首部占比有 20 字节的固定部分 ==（无可变部分）
- 首部长度的最大取值为 1111，也就是十进制的 15，再乘以 4 个字节每单位，也就是表示 ipv 4 数据报首部包含 20 字节固定部分和最大 40 字节可变部分

可选字段：

长度从 1 到 40 字节不等，用来支持排错、测量及安全等
用来增加 IP 数据报的功能，但也增加了路由器处理 IP 数据报的开销，实际很少被使用；（在数据报的整个传送路径中的全部路由器，都要对选项字段进行检查，降低了路由器处理数据报的速度）

04m14s

填充字段：

确保首部长度为 4 字节的整数倍，使用全 0 进行填充
当首部长度（20 字节固定部分 + 可变部分）的长度不是 4 字节整数倍时，填充相应数量的全 0 字节，以确保 IPv4 数据报的首部长度是 4 字节的整数倍

区分服务：

占 8 比特，用来获得更好的服务，该字段一般不使用

总长度：

占用 16 比特，表示 ip 数据报的总长度（首部 + 数据载荷）最大为 65535

标识 + 标志 + 片偏移共同作用于 ipv 4 数据报分片

标识：

占 16 比特，属于同一个数据报的各分片数据报应该具有相同的标识，ip 软件维持一个计数器，每产生一个数据报计数器 + 1，并将此值赋给标识字段

标志：

占 3 比特
- 最低位：MF 位，1 表示后面还有分片，0 表示是最后一个分片了
- 中间位：DF 位，1 表示不允许分片，0 标识为允许
- 最高位：保留位，必须为 0

片偏移：

占 13 比特，指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位（以 8 字节为单位）

生存时间：

占 8 比特，以秒为单位，最大生存周期为 255，路由器转发 ip 数据报时，将 ip 数据报首部中的该字段的值减去 ip 数据报在本路由上所消耗的时间，若不为 0 就转发，否则就丢弃

生存时间 TTL 字段的作用，防止被错误路由的 ipv 4 数据报无限制地困住在因特网中兜圈

协议

长度为 8 个比特，用来指明 ipv 4 数据报的数据部分是何种协议数据单元 PDU
ICMP 协议：字段设置为 1
IGMP 协议：字段设置为 2
TCP 协议：字段设置为 6
UDP 协议：字段设置为 17
IPV 6 协议：字段设置为 41
OSPF 协议：字段设置为 89

首部检验和

占 16 比特，用来检验首部再传输过程中是否出现差错
IPv 4 数据报每经过一个路由器，其首部中的某些字段的值（例如生存时间 TTL、标志以及片偏移等）都可能发生变化，因此路由器都要重新计算一下首部检验和。

发送端计算方法：以 16 bit 为单位，每个字相加后（先将首部检验和字段全置为 0），得到的结果取反码后填入首部检验和字段

接收端：以 16 bit 为单位，每个字相加后，得到的结果取反码

由于网际层并不向其高层提供可靠传输的服务，并且计算首部检验和是一项耗时的操作，因此在 IPv 6 中，路由器不再计算首部检验和，从而更快转发 IP 数据报。

源 IP 地址

占用 32 比特，发送端 IP 地址

目的 IP 地址

占用 32 比特，接收端 IP 地址

分片的概念

例题：

首部检验和计算的重点在于二进制反码求和的运算

静态路由配置

03m23s
用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。
优点：人工配置方式简单、开销小
缺点：不能及时适应网络状态（流量、拓扑等）的变化
使用环境：一般只在小规模网络中采用。

默认路由的概念

情景是，现在 R 1 要发送出去的目的上的设备太多了，不像上面一样只有几个设备，而是因特网，或者说超级多设备，这个时候，要在所有因特网中的设备的 ip 地址的映射关系手动写进路由表里就不太现实了

解决方案：添加一条默认条目，替代去往因特网众多网络的海量路由条目

特定主机路由

08m44s
手动添加去往的子网区域的路由器的端口作为下一跳，手动添加特定网络的地址作为目的网路，

路由选择分类

在一个自治系统内部，使用的具体的内部网关协议与外部的网关协议是没有关系

自洽系统之间（比如这里的 AS 1 和 AS 2 ）叫做域间路由选择，自洽系统内部，比如 as 1 自己内部，叫做域内路由选择

域间路由：选择外部网关协议 EGP (External Gateway Protocol) 这个类别的路由选择协议，例如 BGP 4

域内路由：选择内部网关协议 IGP (Interior Gateway Protocol) 这个类别的路由选择协议，例如 RIP

外部网关协议 EGP 和内部网关协议 IGP 只是路由选择协议的分类名称，而不是具体的路由选择协议。

外部网关协议和内部网关协议名称中使用的是 “网关” 这个名词，是因为在因特网早期的 RFC 文档中，没有使用 “路由器” 而使用的是 “网关” 这一名词。

若源主机和目的主机处在不同的自治系统中（这两个自治系统可能使用不同的内部网关协议），当数据报传到一个自治系统的边界时，就需要使用一种协议将路由选择信息传递到另一个自治系统中 EGP

首先要知道的：RIP 基于 UDP，OSPF 基于 IP，BGP 基于 TCP，这些在 TCP/IP 协议栈中定义的路由协议用于发现和维护前往目的地的最短路径。

然后怎么判断，某个协议是属于哪一层的：一个协议的实现需要依赖协议所在层次的下一层功能。
TCP、UDP 是属于传输层的协议；IP 是属于网络层的协议；
（1）：RIP 用 UDP（RIP 用到传输层），所以 ==RIP 是应用层的协议 ==；
（2）：OSPF 用 IP（RIP 用到网络层），所以 ==OSPF 是网络层协议 ==；（有交材认为是传输层）
（比如在考研的考纲中：OSPF 协议是不使用 UDP 数据报传送，而是直接使用 IP 数据报传送，因此 OSPF 是被划分到属于网络层协议 - 这一点考研党要以考纲为标准）；
（3）：BGP 用 TCP（RIP 用到传输层），所以 BGP 是应用层协议；

路由信息协议 RIP - 工作在应用层，解决的是网络层的问题的协议

路由信息协议 RIP 的相关基本概念

路由信息协议（Routing Information Protocol，RIP）

RIP 要求自治系统 AS 内的每一个路由器都要维护从他自己到 AS 内每一个网络的距离记录（距离向量 Distance-Vecto，D-V）；

RIP 使用跳数来衡量到达目的网络的距离；

路由器到直连网络的距离定义为 1；

路由器到非直连网络的距离定义为所经过的路由数加 1；

允许一条路径最多只能包含 15 个路由器，只适用于小型互联网；

“加 1” 是因为到达目的网络后就进行直接交付，而到直接连接的网络的距离已经定义为 1。

原理 ：

原则一：RIP 会选择通过路由器数量最少的路由（走得慢，我也要走得少）

原则二：当到达同一目的网络有多条距离相等的路由时，可以进行等价负载均衡，将通信量均衡地分布到多条等价的路径上（距离相等就分多波走）

三要素：

- 和谁交换信息 - 仅和相邻路由器交换；

- 交换什么信息 - 路由器自己的路由表。

即本路由器到所在自治系统 AS 中各网络的最短 RIP 距离，以及到各网络应经过的下一跳路由器。

- 何时交换信息 - 周期性交换。即按固定的时间间隔交换路由信息。

为了加快 RIP 的收敛速度，当网络拓扑发生变化时，路由器要及时向相邻路由器通告拓扑变化后的路由信息，这称为触发更新（变化了就立刻更新，而不需要等固定时间间隔）。

【基本工作过程】：

路由器刚开始工作时，只知道自己到直连网络的距离为 1；

每个路由器仅和相邻路由器周期性地交换并更新路由信息；

若干次交换和更新后，每个路由器都知道到达本 AS 内各网络的最短距离和下一跳地址，称为收敛；（“收敛” 就是在自治系统中所有的结点都得到正确的路由选择信息的过程。）

RIP 的基于距离向量路由选择算法

每个结点基于其与邻居结点间的直接链路距离，以及邻居交换过来的距离向量计算并更新其到达每个目的结点的最短距离，然后将新的距离向量再通告给其所有邻居，直到距离向量不再改变。

对地址为 X 的相邻路由器发来的 RIP 报文，先修改此报文中的所有项目：

把 “下一跳” 字段中的地址都改为 X，并把所有的 “距离” 字段的值加 1（见后面的解释 1）。每一个项目都有三个关键数据，即：到目的网络 N，距离是 d，下一跳路由器是 X。

【RIP 路由更新规则】：

当有一个路由器 C，将其路由表中要到达的目的网络的下一跳都记为问号，若假设 C 的 RIP 更新报文发送周期到了，则 C 将自己路由表中的相关路由信息，封装到 RIP 更新报文中发送给路由器 D，D 对 C 的路由表进行改造，并按照更新理由和不更新理由进行更新。

更新理由

发现了新的网络，添加

到达目的网络，相同的下一跳（指都经过 C 转发），最新消息，要更新

到达目的网络，同的下一跳（指原来路径不经过 C 转发），新路由优势，要更新

到达目的网络，不同的下一跳，RIP 距离相等，可以等价负载均衡，添加

不更新理由

到达目的网络，不同的下一跳，新路由劣势，不更新

RIP 存在的问题 ——“坏消息传播得慢”

“坏消息传播得慢”（路由环路或 RIP 距离无穷计数问题）

是距离向量算法的一个固有问题。（无法彻底解决）

以下措施减少出现该问题的概率或减小该问题带来的危害：

限制最大 RIP 距离为 15（16 表示不可达）。

当路由表发生变化时就立即发送路由更新报文（即 “触发更新”），而不仅是周期性发送。

让路由器记录收到某个特定路由信息的接口，而不让同一路由信息再通过此接口向反方向传送（即 “水平分割”）。

5. RIP 版本和相关报文的封装

RIP 使用 udp 协议传输的（UDP 端口号为 520），在 UDP 之上，属于应用层

RIP 的封装格式：L 2 Header + IP + UDP + RIP

6. RIP 的优缺点

OSPF 协议 - 开放最短路径优先协议

对于规模较大的自治系统 AS 应该使用 OSPF
OSPF 是为了解决 RIP 的问题而开发出来的，开放最短路径优先只是一个名字，并不表示其他的路由选择协议不是最短路径优先，事实上，每个对于自洽系统内的内部网关协议，比如 RIP，都是寻找的最短路径

OSPF 的基本特征是

基于链路状态管理

采用最短路径算法 SPF，保证不会产生路由环路

OSPF 不限制网络规模，更新效率高，收敛速度快

使用 IP 数据报（协议号 89）进行封装，而 RIP 使用 UDP 封装（应用层）

多点接入的 OSPF 中，选举 BR 和 BDR 来维护邻居信息

链路状态

OSPF 是基于链路状态的，而不是像 RIP 一样是基于距离向量的
链路状态指的是：本路由器都和哪些路由器相邻以及相应的链路的代价 COST（这个代价用来表示费用、距离、时延和带宽，由网络管理人员来做这个参数设置）

思科路由器中的 OSPF 协议的代价就是：$\displaystyle \frac {100Mb/s}{链路带宽}$，计算结果如果小于 1 那么进位计为 1，如果大于 1，那么舍弃小数，保留整数

问候分组

OSPF 使用问候分组来维护相邻节点的信息
问候分组封装在 IP 数据报中，发送组播地址 224.0.0.5
224.0.0.5 这是个 D 类多播地址
IP 数据报首部中的协议号字段的取值为 89，标明 IP 数据报的数据载荷是 OSPF 分组
还记得 IP 数据报吗，它长成这样

通过发送问候分组，每个路由器都建立一张邻居表
问候分组的发送周期是 10 秒，
如果 40 秒没有收到来自邻居的问候分组，那么认为邻居路由器不可达

以上面的 R1 为例，R4 和它的接口 0 相连接，接口 1 和 R2 路由器相连接，收到来自 R4 和 R2 的问候分组，就重置判活倒计时，直到下次收到来自他们的问候分组

LSA 链路状态通告

OSPF 中的路由器会产生链路状态通告（LSA）
LSA 中会包含以下两类链路状态信息：

直连网络的链路信息

邻居路由器的链路状态信息

LSU 链路状态更新

LSA 被封装在 LSU 分组中，采用 == 可靠 == 的 == 洪泛法 == 进行发送

洪泛法

洪泛法的要点是 == 路由器向自己所有的邻居路由器 == 发送 LSU 链路状态更新分组
收到该分组的各路由器 == 又将该分组转发给自己所有的邻居路由器 ==（但其上游路由器除外），以此类推
像是多米诺骨牌一样

可靠的洪泛法是指收到 LSU 链路状态更新分组后要发送确认，收到重复的更新分组无需再次转发，但要发送一次确认

LSDB 链路状态数据库

每个 OSPF 中的路由器都维护一个 LSDB，用户存储 LSA 链路状态通告
通过各路由器洪泛发送封装有各自链路状态通告 LSA 的链路状态更新分组 LSU，各路由器的链路状态数据库 LSDB 最终将达到一致

基于链路状态数据库进行最短路径优先计算

对于每个路由器维护的 LSDB 进行最短路径优先计算，构建出出各自到达其他各路由器的最短路径，即构建各自的路由表

OSPF 维护的五种分组

问候分组

LSDB

LSR

LSU

LSA

OSPF 的工作过程

多点接入网络中的 OSPF 路由器

为了减少洪泛发送问候分组和链路状态更新分组的数量，OSPF 采用以下措施
选举指定路由器（Designated Router，DR）和备用的指定路由器（Backup Designated Router，BDR）
所有的非 DR/BDR 只与 DR/BDR 建立邻居关系
非 DR/BDR 之间通过 DR/BDR 交换信息
通过选举 BR 和 BDR 后，建立的邻居关系数量为 $\displaystyle 2\times (n-1) + 1$

OSPF 划分区域

为了使 OSPF 协议能够用于规模很大的网络，OSPF 把一个自治系统 AS 再划分为若干个更小的范围，称为区域（area）
每个区域的规模不应太大，一般所包含的路由器不应超过 200 个
每个区域都由一个 32 比特的区域标识符，可用点分十进制表示
划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域，而不是整个自治系统 AS，这样就减少了整个网络上的通信量。
第 4 章 - 网络层

主干区域需要与其他自治系统交换路由信息，这样的路由器称为自治系统边界路由器（AS Border Router，ASBR）：R6

主干区域内的路由器称为主干路由器（Backbone Router，BBR）：R3、R4、R5、R6 和 R7

如果路由器的所有接口都在区域内，则该路由器称为区域内路由器（Internal Router，IR）：区域 1 内的 R1 和 R2，区域 2 内的 R8，区域 3 内的 R9

本区域与本自治系统内的别的区域联通的路由器，称为区域边界路由器（Area Border Router，ABR）：R3、R4 和 R7。区域边界路由器的一个接用用于连接自身所在区域，另一个接口用于连接主干区域。

OSPF 例题

BGP 边界网关协议

这是两个自洽系统之间沟通使用的外部网关协议

因为在不同 AS 内度量路由的 “代价”（距离、带宽、费用等）可能不同，因此对于 AS 之间的路由选择，使用统一的 “代价” 作为度量来寻找最佳路由是不行的
比如下面这个图中，根据不同的度量尺度，可能有多种最短路径的答案

另一方面，我们可能因为自身的需求，有一些路径上的个性化的需求

自治系统之间的路由选择必须考虑相关策略 (政治，经济，安全等)；

BGP 只能是力求寻找一条能够到达目的网络且比较好的路由，而并非要寻找一条最佳路由 (不兜圈)；

BGP 是怎么运行的

在配置 BGP 时，每个 AS 的管理员要选择至少一个路由器作为该 AS 的 “BGP 发言人”

一般来说，两个 BGP 发言人都是通过一个共享网络连接在一起的，而 BGP 发言人往往就是 ==BGP 边界路由器 ==

使用TCP连接交换路由信息的两个 BGP 发言人，彼此称为对方的邻站（neighbor）或对等站（peer）

BGP 发言人除了运行 BGP 协议外，还必须运行自己所在 AS 所使用的内部网关协议 IGP，例如 RIP 或 OSPF

也就是说，发言人承担着一个沟通内部和外部的角色

BGP 发言人交换网络可达性的信息

也就是要到达某个网络所要经过的一系列自治系统

当 BGP 发言人相互交换了网络可达性的信息后

各 BGP 发言人就根据所采用的策略，从收到的路由信息中找出到达各自治系统的较好的路由

也就是构造出树形结构且不存在环路的自治系统连通图

![[第 4 章 - 网络层.pdf#page=350]]

BGP 发言人交换路径向量的例子

BGP 适用于多级结构的因特网
![[第 4 章 - 网络层.pdf#page=351]]
可以达到目的地的，可沿路径叫做路径向量
AS3 要去到目的地，显然不能选择会经过自身的路径

BGP 的四种报文

BGP-4 是目前使用得最多的版本，在 [RFC 4271] 中规定了 BGP-4 的四种报文
[[第 4 章 - 网络层.pdf#page=352]]

打开 - OPEN;; 用来与相邻的另一个 BGP 发言建立关系，使通信初始化

保活 - KEEPALIVE;; 用来周期性地证实邻站的连通性

更新 - UPDATE;; 用来通告某一条路由的信息，以及列出要撤销的多条路由

通知 - NOTIFICATION;; 用来发送检测到的差错

路由器的基本工作原理

路由器的定义

路由器是一种具有多个输入端口和输出端口的专用计算机，其任务是转发分组

路由选择

路由选择处理机

路由选择协议

分组转发

输入

输出

交换结构

路由器的转发流程

信号从路由器的某个输入端口进入路由器

物理层将信号转换成比特流后，向上交付给数据链路层处理

数据链路层从比特流中识别出帧，去掉帧头和帧尾后，向上交付给网络层处理

如果交付给网络层处理的分组是普通待转发的数据分组

则根据分组首部中的目的地址进行查表转发
1. 若找不到匹配的转发条目，就丢弃该分组
2. 否则按照匹配条目中所指示的端口进行转发

网络层更新数据分组首部中的某些字段的值

例如，将数据分组的生存时间 TTL 减一

然后向下交付给数据链路层进行封装

数据链路层将数据分组封装成帧后，向下交付给物理层处理

物理层将真看作比特流，将其变换成相应的电信号发送出去
在第四步中，会出现一个分支

如果交付给网络层处理的是携带有路由报文的路由分组

则把路由报文送交路由选择处理机

路由选择处理机根据路由报文的内容来更新自己的路由表

路由表一般仅包含从目的网络到下一跳的映射

路由表需要对网络拓扑变化的计算最优化，而转发表是从路由表得出来的

转发表的结构应当使查找过程最优化

路由选择处理机除了处理收到的路由报文，还会周期性的给其他路由器发送自己所知道的路由信息

交付网络层的是数据分组

交付网络层的是带有路由报文的路由分组

路由器的特点

路由表一般仅包含从目的网络到下一跳的映射

路由表需要对网络拓扑变化的计算最优化

转发表是从路由表得出的

转发表的结构应当使查找过程最优化

路由器的各端口还应具有输入缓冲区和输出缓冲区

输入缓冲区用来暂存新进入路由器但还来不及处理的分组

输出缓冲区用来暂存已经处理完毕但还来不及发送的分组

路由器的端口一般都具有输入和输出功能（也就是一个端口是有两个功能的，这个把两个功能分化为两个端口，为了简化理解）

交换结构的速率对于路由器的性能是至关重要的

交换结构

实现交换结构的三种方式

通过存储器

通过总线

通过互联网络
三种交换结构可实现的路由器转发速率依次提高

ICMP 网际控制报文协议

为什么要发明 ICMP

?
为了更有效地转发 IP 数据报以及提高 IP 数据报交付成功的机会

ICMP 的特点

ICMP 运行在哪一层

?
TCP/IP 体系结构的网际层使用了网际控制报文协议

ICMP 封装在哪里

?
ICMP 报文被封装在IP 数据报中发送

什么使用 ICMP，用它干啥

主机或者路由器使用 ICMP 来发送 == 差错报告报文 == 和 == 询问报文 ==

ICMP 报文类型

ICMP 报文分为以下两大类
[[第 4 章 - 网络层.pdf#page=375]]

差错报告报文

?
用来向主机或路由器报告差错情况
常见的 ICMP 差错报告报文有以下五种
[[第 4 章 - 网络层.pdf#page=376]]

终点不可达

?

当路由器或主机不能交付 IP 数据报时

就向源点发送重点不可达报文

具体可再根据 ICMP 的代码字段细分为多达 13 种

目的网络不可达、

目的主机不可达、

目的协议不可达、

目的端口不可达、

目的网络未知、

目的主机未知等

源点抑制

当路由器或主机由于拥塞而丢弃 IP 数据报时，就向发送该 IP 数据报的源点发送源点抑制报文，使源点知道
应当把IP 数据报的发送速率放慢

[!HINT]
抑制的是发送速度

时间超过（超时）

当路由器收到一个目的 IP 地址不是自己的 IP 数据报时，会将其首部中生存时间 TTL 字段的值减 1。
若结果不为 0，则路由器将该数据报转发出去；
若结果为 0，路由器不但要丢弃该数据报，还要向发送该 IP 数据报的源点发送时间超过（超时）报文

参数问题

当路由器或目的主机收到 IP 数据报后，根据其首部中的检验和字段的值发现首部在传送过程中出现了误码，就丢弃该数据报，并向发送该数据报的源点发送参数问题报文

改变路由（重定向）

路由器把改变路由报文发送给主机，让主机知道下次应将 IP 数据报发送给另外的路由器，这样可以通过 == 更好的路由到达目的主机 ==

差错报告报文的注意点

以下情况不应发送 ICMP 差错报告报文
[[第 4 章 - 网络层.pdf#page=386]]
?

对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。

报告 ICMP 错了的报文，如果错误了，不能再套娃报告了

对第一个分片的 IP 数据报片的所有后续数据报片都不发送 ICMP 差错报告报文

分片传输的 ip 数据报片，后续的片应该不管它

对具有多播地址的 IP 数据报都不发送 ICMP 差错报告报文

多播地址的 ip 数据报，也就是广播的数据报，不应该发

对具有特殊地址（例如 127.0.0.0 或 0.0.0.0) 的 IP 数据报不发送 ICMP 差错报告报文

本地数据不报

询问报文

?
用来向主机或路由器询问情况
常用的 ICMP 询问报文有以下两种
[[第 4 章 - 网络层.pdf#page=388]]

回送请求和回答

?

由主机或路由器向一个特定的目的主机或路由器发出
收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送 ==ICMP 回送回答报文 ==
这种询问报文用来 == 测试目的站是否可达以及了解其有关状态 ==

时间戳请求和回答

?

用来请求某个主机或路由器回答当前的日期和时间
在 ICMP 时间戳回答报文中有一个 ==32 比特 == 的字段，其中写入的整数代表从 ==1900 年 1 月 1 日 == 起到当前时刻一共有多少秒。
这种询问报文用来进行 == 时钟同步和测量时间 ==

ICMP 的典型应用

分组网间探测 Ping

?

分组网间探测 PING 用来测试；；主机或路由器之间的连通性

PING 是 TCP/IP 体系结构的应用层直接使用网际层 ICMP 的一个例子；；它并不使用运输层的 TCP 或 UDP

PING 应用所使用的 ICMP 报文类型为；；回送请求和回答

某些主机或服务器为了防止恶意攻击，并会不理睬外界发来的 ICMP 回送请求报文

跟踪路由

?

跟踪路由应用 traceroute，用于探测 IP 数据报 == 从源主机到达目的主机要经过哪些路由器 ==。

在不同操作系统中，traceroute 应用的命令和实现机制有所不同：

在 UNIX 版本中，具体命令为 “==traceroute==”，其在 == 运输层 == 使用 ==UDP 协议 ==，在 == 网络层 == 使用 ICMP 报文类型只有 == 差错报告报文 ==。

在 Windows 版本中，具体命令为 “tracert”，其 == 应用层 == 直接使用 == 网际层的 ICMP 协议 ==，所使用的 ICMP 报文类型有 == 回送请求 == 和 == 回答报文 == 以及 == 差错报告报文 ==

跟踪路由 - 以 windows 版本为例

00:09:35

[!cite] 视频文稿转录

报文如下所示，这是我在家里的主机上使用 Windows 操作系统的命令行工具 TRT，探测该主机与中国互联网络信息中心 CNNIC 的官方网站服务器之间要经过哪些路由器

图中的每一行有三个时间，这是因为针对路径中的每一个路由器要进行三次测试

时间中出现星号表示在超时时间内没有收到路由器发来的响应报文。

出现这种情况的原因有多种，例如，路由器对 IP 数据报出现差错的情况进行策略性的差错报告。

例如， 10 个同样的差错只报告一个，而不是针对每一个同样的错误都发送一个相应的差错报告，否则容易受到恶意攻击。

接下来我们以 Windows 版本中的 trace RT 命令为例，看看它是如何利用 ICMP 来实现跟踪路由的功能。如图所示，假设主机 H1 想知道到达主机 H2 要经过哪些路由器

H1 给 H2 发送 ICMP 回送请求报文，该报文被封装在 IP 数据报中。

发送 IP 数据报首部中生存时间 ttl 字段的值被设置为 1

ip 数据报，到达路由器 R1 号，其 ttl 字段的值被减 1，结果为 0。

因此 R1 丢弃该数据报，并向发送该数据报的原主机 H1 发送封装有 ICMP 差错报告报文的 IP 数据报

ICMP 差错报告类型为时间超过

这样 H1 就知道了到达 H2 的路径中的第一个路由器的 IP 地址

H1 继续发送下一个封装有 ICMP 回送请求报文的 IP 数据报，其手部中 TTL 字段的值被设置为 2

经过 R2 的转发后，该数据报的 TTL 字段的值被减少为 1

该数据报到达 r2 后，其 TTL 字段的值被减一，结果为 0。因此 R2 丢弃该数据报，并向发送该数据报的原主机 H1 发送封装有 ICMP 差错报告报文的 IP 数据报

SMP 差错报告类型为时间超过，这样 H1 就知道了到达 H2 的路径中的第二个路由器的 IP 地址

H1 继续发送下一个封装有 ICMP 回送请求报文的 IP 数据报，其首部中 TTL 字段的值被设置为 3。

经过 R1 和 R2 的转发后，该数据报到达 H2，其首部中 TTL 字段的值被 R1 和 R2 减小到 1

H2 解析该数据报，发现其内部封装的是 ICMP 回送请求报文，于是就给 H1 发送封装有 ICMP 回送回答报文的 IP 数据报，这样 H1 就知道已经跟踪到路径中的最后一站，也就是目的主机 H2

虚拟专用网 VPN

利用公用的因特网作为本机构各专用网之间的通信载体，这样形成的网络又称为虚拟专用网

出于安全考虑，专用网内的各主机并不应该直接 “暴露” 于公用的因特网上
所以主机分配到的 ip 地址应该只能在自身网络内部通信
给专用网内各主机配置的 IP 地址应该是该专用网所在机构可以自行分配的 IP 地址，这类 IP 地址仅在机构内部有效，称为专用地址（Private Address），不需要向因特网的管理机构申请

专用地址

在因特网中的所有路由器，对目的地址是专用地址的 IP 数据报一律不进行转发，这需要由因特网服务提供者 ISP 对其拥有的因特网路由器进行设置来实现

VPN 的通信过程

如下图，H1 要给 H2 发信息

先封装一个内部 ip 数据报，给到 R1 首部中的源地址和目的地址，如实填写

R1 拿到这个内部 ip 数据报以后，发现，这个数据报不是自己系统内部的，必须要通过因特网才能到达，就会把这个ip 数据报加密

然后重新添加一个首部，封装成可以在因特网中传送的数据

这个首部的添加规则中是：

源地址：路由器 R1 全球唯一的公有 IP 地址

目的地址：路由器 R2 全球唯一的公有 IP 地址

R2 拿到以后，先去掉首部

然后对这个加密的内部数据报进行解密，拿到原本的内部 ip 数据报

接着拿着原本的内部数据报里面的目的 ip 地址，找到自己系统内部的目的主机

总结一下：

在因特网中的所有路由器，对目的地址是专用地址的 IP 数据报一律不进行转发（需由因特网服务提供者 ISP 对其拥有的因特网路由器进行设置来实现）

使用两层封装：对内部加密的 IP 数据报再添加一个首部封装成一个数据报发送

IP 隧道技术

在 VPN 的通信过程中那样描述的模式中：
IP 数据报在因特网中可能要经过多个网络和路由器，但从逻辑上看，路由器 R1 和 R2 之间好像是一条直通的点对点链路，因此也被称为 IP 隧道技术

VPN 的分类

内联网 VPN

VPN 的通信过程中示范的案例
是同一机构内不同部门的内部网络所构成的 VPN，又称为内联网 VPN

外联网 VPN

在内联网 VPN 的基础上，有时，一个机构的虚拟专用网 VPN 需要某些外部机构（通常是合作伙伴）参加进来，这样的 VPN 就称为外联网 VPN。

远程接入 VPN

在外地工作的员工需要访问公司内部的专用网时，只要在任何地点接入因特网，运行驻留在员工 PC 中的 VPN 软件，在员工的 PC 和公司的主机之间建立 VPN 隧道，就可以访问专用网中的资源，这种虚拟专用网又称为远程接入 VPN

NAT 网络地址转换

用来缓解 IPv4 地址空间即将耗尽的问题。

NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。

这种方法需要在专用网络连接到因特网的路由器上安装 NAT 软件。装有 NAT 软件的路由器称为 NAT 路由器，它至少要有一个有效的外部全球地址 $IP_{G}$

使用内部专用地址的主机在和外部因特网通信时，都要在 NAT 路由器上将其内部专用地址转换成 $IP_{G}$

NAT 最基本的方法 - 示例

首先，对于两个通信的主机提出了一些要求

主机 a 位于专用网中，其 IP 地址为专用地址 IPA

主机 b 位于专用网中，其 IP 地址为专用地址 IPB

源地址出来这里的路由器得是一个 NAT 路由器，有全球唯一的 IP 地址 IPG

主机 a 给主机 b 发送一个 IP 数据报

该数据报首部中的源地址为主机 a 的专用地址 IPA

目的地址为主机 b 的全球地址 IPB

该数据报必须经过 net 路由器的转发

net 路由器收到该数据报后

自己的全球地址池中为主机 a 选择一个临时的全球地址 IPG

将数据报首部中的源地址修改为 IPG

并在自己的 net 转换表中记录 IPA 与 IPG 的对应关系

之后将修改过原地址的数据报转发到因特网

主机 b 收到该 IP 数据报后

给主机 a 发回一个 IP 数据报

该数据报首部中的源地址为主机 b 的全球 IP 地址 IPB 目的地址为 NAT 由器为主机 a 选择的临时全球地址 IPG

当 net 路由器从因特网上收到该数据报时

根据 net 转换表中的相关记录

net 路由器会将该数据报转发给专业网中的主机 a，NAT 路由器将数据报首部中的目的地址修改为主机 a 的专用地址 IPA 后，转发给专用网中的主机 a

网络地址与端口号转换方法 - NAPT

将 NAT 和运输层端口号结合使用，称为网络地址与端口号转换

[!question] 为什么要用 NAPT
由于目前绝大多数基于 TCP/IP 协议栈的网络应用，都使用运输层的传输控制协议 TCP或用户数据报协议 UDP
为了更加有效地利用 NAT 路由器中的全球 IP 地址，现在常将 NAT 转换和运输层端口号结合使用

[!attention] 家用路由器是 NAT 但是不运行路由选择协议
现在很多家用路由器将家中各种智能设备（手机、平板、笔记本电脑、台式电脑、物联网设备等）接入因特网，这种路由器实际上就是一个 NAPT 路由器，但往往并不运行路由选择协议

NAPT 的通信流程

专用网中的主机 a 给因特网中的主机 c 发送封装有运输层 pdu 的 IP 数据报

原地址为主机 a 的 IP 地址，原端口号为 30000，目的地址为主机 C 的 IP 地址，目的端口号为 80

NAPT 路由器收到 a 发来的数据报以后，对其进行相应修改，然后转发到因特网

具体的修改内容为，将其源地址从内部专用网地址修改为 NAPT 路由器的外部全球地址

将其封装的运输层 PDU 的原端口号修改为一个新的运输层端口号，这是由 NAPT 路由器动态分配的

NAPT 路由器还要将相关修改内容记录到自己的 NAPT 转换表中

因特网中的主机 c 收到专用网中的主机 a 发来的 IP 数据报后

给主机 a 发回一个封装有运输层 PDU 的 IP 数据报，这是相关的 IP 地址和端口号

NAPT 路由器收到该数据报后，根据 NAPT 转换表中的相关记录，NAPT 路由器就可知道该数据报要发送给专用网中的主机 a

NAPD 路由器将数据报首部中的目的地址和所封装的运输层 PDU 的目的端口号按 NAPT 转换表中的记录进行修改，然后将数据报发送给主机 a

NAT 的缺陷

NAT 的出现在很大程度上缓解了 IPV4 地址资源紧张的局面，，但 NAT（和 NAPT）对网络应用并不完全透明，会对某些网络应用产生影响

NAT（和 NAPT）的一个重要特点就是通信必须由专用网内部发起，因此拥有内部专用地址的主机不能直接充当因特网中的服务器

对于目前 P2P 这类需要外网主机主动与内网主机进行通信的网络应用，在通过 NAT 时会遇到问题，需要网络应用自身使用一些特殊的 NAT 穿透技术来解决

IP 多播

单播

用于发送数据包到单个目的地，且每发送一份单播报文都使用一个单播 IP 地址作为目的地址。是一种点对点传输方式

广播

是指发送数据包到同一广播域或子网内的所有设备的一种数据传输方式，是一种点对多点传输方式

多播

多播（Multicast，也称为组播）是一种实现 “一对多” 通信的技术，与传统单播 “一对一” 通信相比，多播可以极大地节省网络资源
在因特网上进行的多播，称为 IP 多播

多播的优势

比如说，有 60 个主机要接收来自视频服务器的同一个视频节目
如果采用单播方式，则视频服务器需要发送 60 个该视频节目，这些视频节目通过各路由器的转发，最终到达各主机。

如果采用多播方式，可将这 60 个主机看作是同一个多播组的成员，视频服务器只要向该多播组发送一个视频节目即可
由于路由器 R1 支持 IP 多播， R1 在转发该视频节目时，需要把该视频节目复制成两个副本，分别向路由器 R2 和 R3 转发一个副本。当该视频节目到达目的局域网时，由于局域网具有硬件多播功能，因此不需要复制该视频节目，在局域网上的该多播组成员都能收到这个视频节目

多播中路由器的作用

IP 多播地址

在 IPv4 中，==D 类地址 == 被作为多播地址

多播地址只能用作；；目的地址，而不能用作源地址

IP 多播地址的分类

预留的多播地址

也称作永久多播地址

全球范围可用的多波地址

本地管理的多波地址

多播组

用每一个 D 类地址来标识 == 一个 == 多播组，使用同一个 IP 多播地址 == 接收 IP 多播数据报的所有主机 == 就构成了一个多播组

每个多播组的成员是可以随时变动的，一台主机可以随时加入或离开多播组

多播组成员的数量和所在的地理位置也不受限制

非多播组成员也可以向多播组发送 IP 多播数据报

与 IP 数据报相同， IP 多播数据报也是尽最大努力交付，不保证一定能够交付给多播组内的所有成员

IP 多播分两类

IP 多播可以分为以下两种
[[第 4 章 - 网络层.pdf#page=443]]

只在本局域网上进行的硬件多播

在因特网上进行的多播

目前大部分主机都是通过局域网接入因特网的

[!NOTE|aside-l]
因特网多播的最后一步是局域网多播

因此，在因特网上进行多播的最后阶段，还是要把 IP 多播数据报在局域网上用硬件多播交付给多播组的所有成员

局域网上的硬件多播

由于 MAC 地址（也称为硬件地址）有 == 多播 MAC 地址 == 这种类型

因此只要把 ==IPv4 多播地址映射成多播 MAC 地址 ==，即可将 ==IP 多播数据报 == 封装在 == 局域网的 MAC 帧中 ==

而 MAC 帧首部中的目的 MAC 地址字段的值，就设置为由 ==IPv4 多播地址映射成的多播 MAC 地址 ==

这样，可以很方便地利用硬件多播来实现局域网内的 IP 多播

当给某个多播组的成员主机配置其所属多播组的 IP 多播地址时，系统就会根据映射规则从该 IP 多播地址生成相应的局域网多播 MAC 地址

IPv4 多播地址映射成多播 MAC 地址

因特网号码指派管理局 IANA，将自己从 IEEE 注册管理机构申请到的以太网 MAC 地址块中从 01-00-5E-00-0000 到 01-00-5E-7F-FF-FF 的多播 MAC 地址，用于映射 IPv4 多播地址

这些多播 MAC 地址的左起前 25 个比特都是相同的，剩余 23 个比特可以任意变化，因此共有 ==2^23 个 ==

MAC 地址为 ==6== 字节

最小多播 MAC 地址

25 比特固定部分保持不变，剩余 23 比特全部取 0，就可以得到最小多播 MAC 地址

最大多播 MAC 地址

将 25 比特固定部分保持不变，剩余 23 比特全部至 1，就可以得到最大多播 MAC 地址

32 比特的 IPV4 多播地址映射成 48 比特的多播 MAC 地址

32 比特的 IPV4 多播地址的左起前 4 个比特固定为 1110，剩余 28 个比特可以任意变化

然而 48 比特的多播 MAC 地址只有低 23 比特可以任意变化，因此只能与多播 IP 地址的低 23 比特进行映射

这带来一个影响：IP 多播地址可变化的 28 比特的前 5 个比特无法映射到 MAC 多播地址

这会造成 IP 多播地址与多播 MAC 地址的映射关系并不是唯一的

IP 多播地址与多播 MAC 地址的映射关系并不是唯一

下面是两个 IP 多播地址和他们各自的二进制形式

左起前四个比特固定为 1110，表示这是 IP 多播地址

剩余可变化的 28 个比特中的这 5 个比特无法映射 因此只有剩余 23 比特可映射到多播 MAC 地址

第 23 比特多播 MAC 地址左起，前 25 个比特固定不变，将 IP 多播地址的第 23 比特映射到，或者说作为 MAC 多播地址的第 23 位，这样就得出了 IP 多播地址相应的多播 MAC 地址

由于 IP 多播地址与多播 MAC 地址的映射关系不是唯一的

因此收到 IP 多播数据报的主机还要在网际层利用软件进行过滤，把不是主机要接收的 IP 多播数据报丢弃

相同映射关系的 IP 多播数据报进行过滤

00:07:13

在因特网上进行 IP 多播需要的两种协议

要在因特网上进行 IP 多播，就必须要考虑 IP 多播数据报经过多个多播路由器进行转发的问题
多播路由器必须根据 IP 多播数据报首部中的 IP 多播地址，将其转发到有该多播组成员的局域网

IGMP 网际组管理协议

路由器如何知道自己各接口所在局域网中是否有某个多播组的成员？
网际组管理协议 IGMP
[[第 4 章 - 网络层.pdf#page=462]]

网际组管理协议（Internet Group Management Protocol，IGMP）是 TCP/IP 体系结构网际层中的协议

其作用是让连接在本地局域网上的多播路由器知道本局域网上是否有主机（实际上是主机中的某个进程）加入或退出了某个多播组

==IGMP 仅在本网络有效 ==，使用 IGMP 并不能知道多播组所包含的成员数量，也不能知道多播组的成员都分布在哪些网络中

== 仅使用 IGMP== 并不能在因特网上进行 IP 多播。连接在局域网上的多播路由器还必须和因特网上的 == 其他多播路由器 == 协同工作，以便把 IP 多播数据报用 == 最小的代价 == 传送给所有的多播组成员，这就需要使用 == 多播路由选择协议 ==

IGMP 的三种报文类型

三种报文类型（IGMP 报文被封装在 ==IP 数据报 == 中传送）

协议字段的值 = ==2==，表示数据载荷部分是 ==IGMP 报文 ==

目的地址字段的值根据其所封装 IGMP 报文类型 == 各有不同 ==，但都 == 属于 IP 多播地址 ==

生成时间 TTL 字段的值 = ==1==，避免封装 IGMP 报文的 IP 多播数据报被路由器转发到其他网络

成员报告报文

?
加入多播组（由组内一个成员声明即可）

成员查询报文

?
主要查询的特定多播组的 IP 多播地址

离开组报文

?
当主机要退出某个多播组时，可主动发送一个离开组报文而不必等待多播路由器的查询。这样可使多播路由器能够更快地发现某个组有成员离开

IGMP 的工作原理

IGMP 加入多播组

网际组管理协议 IGMP 的基本工作原理 —— 加入多播组
![[第 4 章 - 网络层.pdf#page=472]]

主机 A 想加入多播组 X，则主机 A 应向多播组 X 的多播地址发送 IGMP 报文，说明自己想要成为里面的成员；

多播路由器收到 IGMP 报文后，解析该报文，把主机 A 的多播 IP 地址加入到多播组列表中。

IGMP 成员报告报文封装在 IP 多播数据报中
IP 多播数据报封装在 == 以太网多播帧 == 中
IGMP 成员报告报文的内容：226.0.9.26
IP 多播数据报的目的地址： 226.0.9.26
以太网多播帧的目的地址：01-00-5E-00-09-1A

IGMP 监视多播组的成员变化的过程

网际组管理协议 IGMP 的基本工作原理 —— 监视多播组的成员变化
![[第 4 章 - 网络层.pdf#page=478]]

多播路由器默认每隔 125 秒就向其 == 直连网络 == 发送一个封装有 IGMP 报文的 IP 多播数据报；

只要某个多播组的 == 一个 == 主机响应（使用 == 延迟响应，响应时间在 1-10 秒内随机 ==），则认为这个组是活跃的；

若连续多次查询，某个多播组均没有一个主机响应，则认为这个组不活跃，将该组从多播组列表中删除。

[!attention]

同一网络中的多播路由器可能不止一个，但没有必要每个多播路由器都周期性地发送 IGMP 成员查询报文。

只要在这些多播路由器中选择一个作为 == 查询路由器 ==，由查询路由器发送 IGMP 成员查询报文，而其他的多播路由器仅被动接收响应并更新自己的多播组列表即可。

选择查询路由器的方法：

每个多播路由器若监听到源 IP 地址比自己的 IP 地址小的 IGMP 成员查询报文则退出选举。

最后，网络中只有 IP 地址最小的多播路由器成为查询路由器

IGMP 退出多播组的过程

网际组管理协议 IGMP 的基本工作原理 —— 退出多播组
![[第 4 章 - 网络层.pdf#page=488]]

IGMPv2 在 IGMPv1 的基础上增加了一个可选项：当主机要退出某个多播组时，可主动发送一个离开组报文，而不必等待多播路由器的查询。这样可使多播路由器能够更快地发现某个组有成员离开

多播路由选择协议

多播路由选择协议的主要任务是：在多播路由器之间为每个多播组建立一个 == 多播转发树 ==

多播转发树连接多播源和所有拥有该多播组成员的路由器

有以下两种方法来构建多播转发树

基于源树多播路由选择（Source-Base Tree）

组共享树多播路由选择（Group-Shared Tree）

IP 多播数据报只要沿着多播转发树进行 == 洪泛 ==，就能被传送到所有拥有该多播组成员的多播路由器

之后，在多播路由器所直连的局域网内，多播路由器通过硬件多播，将 IP 多播数据报发送给该多播组的所有成员

针对不同的多播组需要维护不同的多播转发树，而且必须 == 动态地适应 == 多播组成员的变化，但此时网络拓扑 == 并不一定发生变化 ==，因此多播路由选择协议要比 == 单播路由选择协议（例如 RIP、OSPF 等）== 复杂得多

即使某个 == 主机不是任何多播组的成员 ==，它也可以 == 向任何多播组 == 发送 == 多播数据报 ==

为了覆盖多播组的所有成员，多播转发树可能要经过一些没有多播组成员的路由器（例如下图中的 R2）

多播转发树构建的两种方法

基于源树多播路由选择（Source-Base Tree）

组共享树多播路由选择（Group-Shared Tree）

移动 IP 技术

能上网是来自于路由器分配的 IP，移动 IP 使得移动主机在个网络之间漫游时，仍能保持其原来的 IP 地址不变

移动 IP 技术还为因特网中的非移动主机提供了相应机制，使得它们能够将 IP 数据报正确发送到移动主机

归属网络

每个移动主机都有一个默认连接的网络或初始申请接入的网络，称为归属网络（Home Network）

归属地址

移动主机在归属网络中的IP 地址在其整个移动通信过程中是 == 始终不变 == 的，因此称为永久地址（Permanent Address）或归属地址（Home Address）

归属代理

在归属网络中，代表移动主机执行移动管理功能的实体称为归属代理（Home Agent）。归属代理通常就是 == 连接在 [[归属网络]] 上的路由器 ==，然而它作为代理的特定功能则是在 [[网络层]] 完成的

外地网络

移动主机当前漫游所在的网络称为外地网络（Foreign Network）或被访网络（Visited Network）

外地代理

在外地网络中，帮助移动主机执行移动管理功能的实体称为外地代理（Foreign Agent）

转交地址

外地代理通常就是连接在外地网络上的路由器。外地代理会为移动主机提供一个临
时使用的属于外地网络的转交地址（Care-of Address）

移动 IP 技术的基本工作原理

代理发现与注册

移动 IP 技术的基本工作原理 —— 代理发现与注册
[[第 4 章 - 网络层.pdf#page=531]]

移动主机 A 通过自己的 == 代理发现协议 ==，与 [[外地代理]] 建立联系，并从外地代理获得一个属于该外地网络的 [[转交地址]]（例如 175.1.1.1/16），同时向外地代理注册自己的 [[永久地址]] 和 [[归属代理]] 地址

外地代理将移动主机 A 的永久地址记录在自己的注册表中，并向移动主机的 [[归属代理]] 注册该移动主机的 [[转交地址]]（== 也可由移动主机直接进行注册 ==）

归属代理会将移动主机 A 的转交地址记录下来，此后 == 归属代理会代替移动主机接收 == 所有发送给该移动主机的 IP 数据报，并利用 [[IP 隧道技术]] 将这些数据报转发给 == 外地网络中的移动主机 ==

== 当移动主机不在归属网络时 ==，归属代理会以自己的 MAC 地址应答所有对该移动主机的 ARP 请求，即 == 归属代理采用 ARP 代理技术 ==。为了使归属网络中其他各主机和路由器能够尽快更新各自的 ARP 高速缓存，== 归属代理还会主动发送 ARP 广播 ==，== 并声称自己是该移动主机 ==。这样，所有发送给该移动主机的 IP 数据报都会发送给归属代理

固定主机向移动主机发送 IP 数据报

移动 IP 技术的基本工作原理 —— 固定主机向移动主机发送 IP 数据报
[[第 4 章 - 网络层.pdf#page=536]]

00:06:15

当 [[外地代理]] 和移动主机不是同一台设备时， 固定主机 B 转交地址实际上是 == 外地代理的地址 == 而不是移动主机的地址

转交地址既不会作为移动主机发送 IP 数据报的源地址，也不会作为移动主机所接收的 IP 数据报的目的地址

转交地址仅仅是归属代理到外地代理的 IP 隧道的出口地址

所有使用同一外地代理的移动主机都可以 == 共享同一个 [[转交地址]]==

当外地代理从 IP 隧道中收到并解封出原 IP 固定主机 B 数据报时，会在自己的代理注册表中查找移动主机的永久地址所对应的 MAC 地址，并将该数据报封装到目的地址为该 MAC 地址的帧中发送给移动主机

这与 IP 数据报的正常转发流程是不同的，否则会造成该数据报又被发回移动主机的归属网络

移动主机向固定主机发送 IP 数据报

移动 IP 技术的基本工作原理 —— 移动主机向固定主机发送 IP 数据报
[[第 4 章 - 网络层.pdf#page=543]]

IP 数据报被移动主机 A 按照正常的发送流程发送出去即可。

由于 IP 路由器并不关心 IP 数据报的源地址，因此该 IP 数据报被直接路由到固定主机 B，而 == 无须再通过归属代理进行转发 ==

为此，移动主机可以将外地代理作为自己的默认路由器，也可以通过 == 代理发现协议 == 从外地代理获取外地网络中其他路由器的地址，并将其设置为自己的默认路由器

同址转交地址方式

移动 IP 技术的基本工作原理 —— 同址转交地址方式
[[第 4 章 - 网络层.pdf#page=547]]

外地代理除了可以配置在外地网络中的某个路由器上，可以以直接运行在移动主机上。

移动主机需要运行额外的外地代理软件。

外地网络也需要提供相应机制，使移动主机能够自动获取一个外地网络中的地址作为自己的 IP 地址和外地代理的地址，被称为同址转交地址（Co-Located Care-of Address）

三角形路由问题

移动 IP 技术的基本工作原理 —— 三角形路由问题
[[第 4 章 - 网络层.pdf#page=548]]

即使在固定主机与移动主机之间存在一条更有效的路径，发往移动性主机的 IP 数据报也要先发送给归属代理，造成 IP 数据报转发的低效

三角形路由问题的解决方法

解决三角形路由问题的一种方法：

给固定主机配置一个 == 通信代理 ==，固定主机发送给移动主机的 IP 数据报，都要通过该 == 通信代理转发 ==

通信代理先从归属代理获取移动主机的转交地址，之后所有发送给移动主机的 IP 数据报，都利用转交地址直接通过 IP 隧道发送给移动主机的外地代理，而无须再通过移动主机的归属代理进行转发

这种方法以增加复杂性为代价，并要求固定主机也要配置通信代理，也就是对固定主机不再透明

IPV6

因特网工程任务组 IETF 早在 1992 年 6 月就提出要制定下一代的 IP，即 IPng（IP Next Generation）。IPng 现在正式称为 IPv6

直接将因特网的核心协议从 IPv4 更换成 IPv6 是不可行的

IPV4 对比 IPV6 的缺陷

IPv4 地址早期的编址方法（分类的 IPv4 地址和划分子网的 IPv4 地址）也不够合理，造成 IPv4 地址资源的浪费
NAT 仅仅是为了延长 IPv4 使用寿命而采取的权宜之计，解决 IPv4 地址耗尽的根本措施就是采用具有更大地址空间（IP 地址的长度为 128 比特）的新版本 IP，即 IPv6

IPV6 相对 IPV4 的主要变化

IPv6 引进的主要变化
[[第 4 章 - 网络层.pdf#page=556]]

更大的地址空间

IPv6 将 IPv4 的 ==32 比特 == 地址空间增大到了 ==128 比特 ==，在采用合理编址方法的情况下，在可预见的未来是不会用完的

扩展的地址层次结构

可划分为更多的层次，这样可以更好地反映出因特网的拓扑结构，使得对寻址和路由层次的设计更具有灵活性。

灵活的首部格式

与 IPv4 首部并不兼容。IPv6 定义了许多可选的的扩展首部，不仅可提供比 IPv4 更多的功能，而且还可以提高路由器的处理效率，因为路由器对逐跳扩展首部外的其他扩展首部都不进行处理

改进的选项

Pv6 允许分组包含 == 有选项的控制信息 ==，因而可以包含一些新的选项。然而 IPv4 规定的选项却是固定不变的。

允许协议继续扩充

这一点很重要，因为技术总是在不断地发展，而新的应用也会层出不穷。然而 IPv4 的功能却是固定不变的

支持即插即用（即自动配置）

IPv6 支持主机或路由器自动配置 IPv6 地址及其他网络配置参数。因此 ==IPv6 不需要使用 DHCP==

支持资源的预分配

IPv6 能为实时音视频等要求保证一定带宽和时延的应用，提供更好的服务质量保证

IPV6 数据报的首部

所有的扩展首部并不属于 IPv6 数据报的首部，它们与其后面的数据部分合起来构成有效载荷（payload，也称为净负荷）

IPV6 首部和 IPV4 首部对比

IPv6 将 IPv4 数据报首部中不必要的功能取消了，这使得 IPv6 数据报基本首部中的字段数量减少到 == 只有 8 个 ==

但由于 IPv6 地址的长度扩展到了 128 比特，因此使得 IPv6 数据报基本首部的长度反而增大到了 ==40 字节 ==，

比 IPv4 数据报首部 == 固定部分的长度 ==（20 字节）增大了 ==20 字节 ==

IPV6 首部的 8 个变化

取消了首部长度字段，因为 IPv6 数据报的首部长度 是固定的 40 字节

取消了区分服务（服务类型）字段，因为 IPv6 数据 报首部中的通信量类和流标号字段实现了区分服务字段的功能

取消了总长度字段，改用有效载荷长度字段。这是 因为 IPv6 数据报的首部长度是固定的 40 字节，只有其后面的有效载荷长度是可变的

取消了标识、标志和片偏移字段，因为这些功能已包含在 IPv6 数据报的分片扩展首部中

把生存时间 TTL 字段改称为跳数限制字段，这样名 称与作用更加一致

取消了协议字段，改用下一个首部字段

取消了首部检验和字段，这样可以加快路由器处理 IPv6 数据报的速度

取消了选项字段，改用扩展首部来实现选项功能

IPV6 数据报的基本首部

IPv6 数据报的基本首部
[[第 4 章 - 网络层.pdf#page=571]]

版本字段：长度为 4 比特，用来表示 IP 协议的版本。对于 IPv6 该字段的值是 6。

通信量类字段：长度为 8 比特，该字段用来区分不同的 IPv6 数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。

流标号字段：长度为 20 比特。 IPv6 提出了流的抽象概念。

“流” 就是因特网上从特定源点到特定终点（单播或多播）的一系列 IPv6 数据报（如实时音视频数据的传送），而在这个 “流” 所经过的路径上的所有路由器都保证指明的服务质量。

所有属于同一个流的 IPv6 数据报都具有同样的流标号。换句话说，流标号用于资源分配。

流标号对于实时音视频数据的传送特别有用，但对于传统的非实时数据，流标号则没有用处，把流标号字段的值置为 0 即可。

有效载荷长度字段：长度为 16 比特，它指明 IPv6 数据报基本首部后面的有效载荷（包括扩展首部和数据部分）的字节数量。

该字段以字节为单位，最大取值为 65535，因此 IPv6 数据报基本首部后面的有效载荷的最大长度为 65535 字节。

下一个首部字段：长度为 8 比特。该字段相当于 IPv4 数据报首部中的协议字段或可选字段。

当 IPv6 数据报没有扩展首部时，该字段的作用与 IPv4 的协议字段一样，它的值指出了 IPv6 数据报基本首部后面的数据是何种协议数据单元 PDU。

当 IPv6 数据报基本首部后面带有扩展首部时，该字段的值就标识后面第一个扩展首部的类型。

跳数限制字段：长度为 8 比特。该字段用来防止 IPv6 数据报在因特网中永久兜圈。

源点在每个 IPv6 数据报发出时即设定某个跳数限制（最大 255 跳）。

每个路由器在转发 IPv6 数据报时，要先把跳数限制字段中的值减 1。当跳数限制的值为 0 时，就把这个 IPv6 数据报丢弃（即不转发）。

源地址字段和目的地址字段：长度都为 128 比特。分别用来填写 IPv6 数据报的发送端的 IPv6 地址和接收端的 IPv6 地址。

IPV6 的扩展首部

IPv6 数据报的扩展首部
[[第 4 章 - 网络层.pdf#page=580]]

IPv4 数据报如果在其首部中使用了选项字段，则在数据报的整个传送路径中的全部路由器，都要对选项字段进行检查，这就降低了路由器处理数据报的速度。

实际上，在路径中的路由器对很多选项是不需要检查的。因此，为了提高路由器对数据包的处理效率，IPv6 把原来 IPv4 首部中的选项字段都放在了扩展首部中，由路径两端的源点和终点的主机来处理，而数据报传送路径中的所有路由器都不处理这些扩展首部（除逐跳选项扩展首部）。

IPV6 的六种扩展首部

在 [RFC 2460] 中定义了以下六种扩展首部：
[[第 4 章 - 网络层.pdf#page=581]]

逐跳选项

路由选择

分片

鉴别

封装安全有效载荷

目的站选项

每一个扩展首部都由若干个字段组成，它们的长度也各不相同。

== 所有扩展首部中的第一个字段都是 8 比特的下一个首部字段 ==。该字段的值指出在该扩展首部后面是何种扩展首部。

当使用多个扩展首部时，应按以上的先后顺序出现。

IPV6 地址空间大小

在 IPv6 中，每个地址占 128 个比特
IPV6 地址空间大小为 $2^{128}$

IPV6 地址的表示方法

IPv6 地址的表示方法
[[第 4 章 - 网络层.pdf#page=584]]
分为两步来进行表示

第一步，按照 16 比特为一组，把 128 位分成 8 组

第二步，在每个组的内部，在按照每四个为一组，表示为一个 16 进制数字

最后 ipv6 地址是以 16 进制数字的组合展示的

IPV6 表示方法的语法糖

在 IPv6 地址的冒号十六进制记法的基础上，再使用 “左侧零” 省略和 “连续零” 压缩
[[第 4 章 - 网络层.pdf#page=585]]

“左侧零” 省略是指两个冒号间的十六进制数中最前面的一串 0 可以省略不写。

“连续零” 压缩是指一连串连续的 0 可以用一对冒号取代

在一个 IPv6 地址中只能使用一次 “连续零” 压缩，否则会导致歧义

冒号十六进制记法还可结合点分十进制的后缀。这在 IPv4 向 IPv6 过渡阶段非常有用

CIDR 的斜线表示法在 IPv6 中仍然可用

IPv6 地址的分类

IPv6 数据报的目的地址有三种基本类型

[[第 4 章 - 网络层.pdf#page=590]]

单播

传统的点对点通信

多播

一点对多点的通信
数据报发送到一组计算机中的每一个
IPv6 没有采用广播的术语，而将广播看作多播的一个特例

任播

这是 IPv6 新增的一种类型。
任播的终点是一组计算机，但数据报只交付其中的一个，
通常是按照路由算法得出的距离最近的一个。

IPV6 分五种地址

未指明地址

128 个比特为 “全 0” 的地址，可缩写为两个冒号 “::”。

该地址不能用作 [[目的地址]]，只能用于还没有配置到一个标准 IPv6 地址的主机用作源地址。

未指明地址 == 仅有一个 ==。

环回地址

最低比特为 1，其余 127 个比特为 “全 0”，即 0:0:0:0:0:0:0:1，可缩写为::1。

该地址的作用与 IPv4 的环回地址相同。

IPv6 的环回地址 == 只有一个 ==。

多播地址

最高 8 比特为 “全 1” 的地址，可记为 FF00::/8。

IPv6 多播地址的功能与 IPv4 多播地址相同。

这类地址占 IPv6 地址空间的 1/256。

本地链路单播地址

最高 10 比特为 1111111010 的地址，可记为 FE80::/10。

即使用户网络没有连接到因特网，但仍然可以使用 TCP/IP 协议。连接在这种网络上的主机都可以使用本地链路单播地址进行通信，但不能和因特网上的其他主机通信。

这类地址占 IPv6 地址空间的 1/1024。

全球单播地址

全球单播地址是使用得最多的一类地址。
IPv6 全球单播地址采用三级结构，这是为了使路由器可以更快地查找路由。

全球路由选择前缀

分配给公司和机构，用于因特网中路由器的 == 路由选择 ==，相当于 IPv4 分类地址中的网络号。

子网标识符

用于各公司和机构构建自己的子网。

接口标识符

用于指明主机或路由器的单个网络接口，相当于 IPv4 分类地址中的主机号。有 64 个比特，足以将各种接口的硬件地址直接进行编码，这样就不需要使用 ARP。

从 IPv4 向 IPv6 过渡

![[第 4 章 - 网络层.pdf#page=598]]
新部署的 IPv6 系统必须能够向后兼容，也就是 IPv6 系统必须能够接收和转发 IPv4 数据报，并且能够为 IPv4 数据报选择路由

从 ipv4 向 ipv6 过度有两种策略

[[双栈协议]]

[[隧道技术]]

双栈协议

双协议栈（Dual Stack）是指在完全过渡到 IPv6 之前，使一部分主机或路由器装有 IPv4 和 IPv6 两套协议栈

双协议栈主机或路由器既可以和 IPv6 系统通信，又可以和 IPv4 系统通信

双协议栈主机或路由器记为 IPv6/IPv4，表明它具有一个 IPv6 地址和一个 IPv4 地址

双协议栈主机在与 IPv6 主机通信时采用 IPv6 地址，而与 IPv4 主机通信时采用 IPv4 地址。

双协议栈主机通过域名系统 DNS 查询目的主机采用的 IP 地址：

若 DNS 返回的是 IPv4 地址，则双协议栈的源主机就使用 IPv4 地址；

若 DNS 返回的是 IPv6 地址，则双协议栈的源主机就使用 IPv6 地址。

隧道技术

当 IPv6 数据报要进入 IPv4 网络时，将 IPv6 数据报 == 重新封装成 IPv4 数据报 ==，即整个 ==IPv6 数据报成为 IPv4 数据报的数据载荷 ==。

封装有 IPv6 数据报的 IPv4 数据报 == 在 IPv4 网络中传输 ==。

当 IPv4 数据报要 == 离开 IPv4 网络时 ==，再将其 == 数据载荷（即原来的 IPv6 数据报）取出并转发到 IPv6 网络 ==

ICMPv6 网际报文协议

由于 IPv6 与 IPv4 一样，都不确保数据报的可靠交付，因此 IPv6 也需要使用网际控制报文协议 ICMP 来向发送 IPv6 数据报的源主机反馈一些差错信息，相应的 ICMP 版本为 ICMPv6。

ICMPv6 比 ICMPv4 要复杂得多，它合并了 == 原来的地址解析协议 ARP 和网际组管理协议 IGMP 的功能 ==。因此与 IPv6 配套使用的 == 网际层协议就只有 ICMPv6== 这一个协议。

ICMPv6 报文需要封装成 IPv6 数据报进行发送
![[第 4 章 - 网络层.pdf#page=610]]
存储在下一首部中，取值为 58，表明数据
载荷为 ICMPv6 报文
如果有扩展首部，那么存在扩展首部里的下一个首部中，也有这个取值为 58 的载荷

ICMPv6 报文的分类

ICMPv6 报文的分类
[[第 4 章 - 网络层.pdf#page=612]]
ICMPv6 报文可被用来报告差错、获取信息、探测邻站或管理多播通信
在对 ICMPv6 报文进行分类时，不同的 RFC 文档使用了不同的策略：
在 [RFC 2463] 中定义了六种类型的 ICMPv6 报文
在 [RFC 2461] 中定义了五种类型的 ICMPv6 报文
在 [RFC 2710] 中定义了三种类型的 ICMPv6 报文

软件定义网络 SDN

软件定义网络（Software Defined Network，SDN）：一种新型网络体系结构

为了理解这个概念，我们需要首先回顾一下路由器的功能
![[第 4 章 - 网络层.pdf#page=616]]

一般的网络是这样的体系结构

在 SDN 体系结构中，路由器中的路由软件都不存在了。因此，路由器之间不再交换路由信息。
在控制层面中，有一个在 == 逻辑上集中的远程控制器 ==。
逻辑上集中的远程控制器在物理上可由 == 不同地点的多个服务器组成 ==

远程控制器掌握各主机和整个网络的状态。
远程控制器能够为每一个分组计算出最佳的路由。
远程控制器为每一个路由器生成其正确的转发表。

因特网本来是分散控制的，为什么现在 SDN 又提出了集中控制呢？
![[第 4 章 - 网络层.pdf#page=626]]

OpenFlow 协议

OpenFlow 协议可被看成是 SDN 体系结构中控制层面与数据层面之间的通信接口。

OpenFlow 协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制

SDN 并未规定必须使用 OpenFlow，只不过大部分 SDN 产品采用 OpenFlow 作为其控制层面与数据层面的通信接口

传统意义上的数据层面的任务

传统意义上的数据层面的任务：== 根据转发表转发分组 ==

转发分组分为以下两个步骤：

进行 “匹配”：查找转发表中的网络前缀，进行最长前缀匹配。

执行 “动作”：把分组从匹配结果指明的接口转发出去。

OpenFlow 交换机和流表

在 SDN 的广义转发中，完成 “匹配 + 动作” 的设备并不局限在网络层工作

因此不再称为路由器，而称为 “OpenFlow 交换机” 或 “分组交换机”，或更简单地称为 “交换机”

流表

相应的，在 SDN 中取代传统路由器中转发表的是 “流表（Flow Table）”

一个流就是穿过网络的一种分组序列，而在此序列中的每个分组都共享分组首部某些字段的值。例如，某个流可以是具有相同源 IP 地址和目的 IP 地址的一连串分组

OpenFlow 交换机中的流表是由 SDN 远程控制器来管理的。SDN 远程控制器通过一个安全信道，使用 OpenFlow 协议来管理 OpenFlow 交换机中的流表。

每个 OpenFlow 交换机必须有一个或多个流表。

每一个流表可以包含多个流表项。

每个流表项包含三个字段：首部字段值（或称匹配字段）、计数器、动作。

首部字段值

首部字段值字段包含有一组字段，用来使入分组（Incoming Packet）的对应首部与之匹配，因此又称为匹配字段。匹配不上的分组就被丢弃，或被发送到 SDN 远程控制器做更多的处理。

在 OpenFlow 交换机中，既可以处理数据链路层的帧，也可以处理网际层的 IP 数据报，还可以处理运输层
的 TCP 或 UDP 报文。

计数器

计数器字段是一组计数器
![[第 4 章 - 网络层.pdf#page=636]]

记录已经与该流表项匹配的分组数量的计数器；

记录该流表项上次更新到现在经历时间的计数器。

动作

动作字段是一组动作，当分组匹配某个流表项时，执行该流表项中动作字段指明的以下某个或多个动作
![[第 4 章 - 网络层.pdf#page=637]]

把分组转发到指明的端口

丢弃分组

把分组进行复制后再从多个端口转发出去

重写分组的首部字段（包括数据链路层、网际层以及运输层的首部）

简单转发实现案例

可以实现负载均衡
简单转发
![[第 4 章 - 网络层.pdf#page=638]]

防火墙实现案例

仅接收来自于 S1 相连的主机所发送的分组，而不管这些分组是从 S2 自己的哪个端口进来的

SDN 体系结构

SDN 体系结构及其四个关键特征

基于流的转发。SDN 控制的交换机的分组转发工作，能够基于运输层，网络层或链路层首部中任意数量的首部字段值进行。SDN 控制平面的工作是计算，管理和安装所有网络交换机中的流表项。

数据平面与控制平面分离。数据平面由网络交换机组成，交换机是相对简单（但快速）的设备，该设备在它们的流表中执行 “匹配加动作” 的规则。控制平面由服务器以及决定和管理交换机流表的软件组成部分

网络控制功能。控制平面自身由两个组件组成：一个 SDN 控制器或网络操作系统，以及若干网络控制应用程序。实践中，控制器仅是逻辑上集中的，通常在几台服务器上实现。

可编程网络。通过运行在控制平面中的网络控制应用程序，该网络是可编程的

在 SDN 之前模式中，交换机路由器连其嵌入的控制平面软件和协议实现是一个整体，是垂直的，综合的，并且由单一的厂商所销售。在 SDN 中数据平面交换机，SDN 控制器和网络控制应用程序是分离的实体。

SDN 控制器