本文为计算机网络系列第四章笔记,陆续会更新余下内容。文章参考:计算机网络微课堂
系列文章:
计算机网络「三」 数据链路层
需要说明:文章中图片多来自于网络和网课,本文只用作后期学习时参考。
网络层知识预览
文章目录
一、网络层概述
- 网络层的主要任务是 实现网络互连,进而 实现数据包在各网络之间的传输
- 要实现网络层任务,需要解决以下主要问题:
- 网络层向运输层提供怎样的服务( “ 可靠 ” or “ 不可靠 ” )
- 网络层寻址问题
- 路由选择问题
- 因特网(Internet)是目前全世界用户数量最多的互连网,它使用 TCP/IP 协议栈
- 由于 TCP/IP 协议栈的网络层使用 网际协议 IP ,它是整个协议栈的核心协议,因此在 TCP/IP 协议栈中网络层常称为 网际层
下面,我们将基于 TCP/IP 协议栈的网际层来学习网络层的理论知识和实践技术。
二、网络层提供的两种服务
「一」面向连接的虚电路服务
- 虚电路服务核心思想为 可靠通信由网络来保证
- 两台计算机进行通信时必须建立 网络层的连接 —— 虚电路 VC(Virtual Circuit)
- 通信双方 沿着已建立的虚电路发送分组
说明:虚电路是一条逻辑上的连接,并不是真正建立了一条物理连接 - 目的主机的地址仅在连接建立阶段使用,之后每个 分组的首部只需携带一条虚电路的编号 (构成虚电路的每一段链路都有一个虚电路编号)
- 这种方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按需到达、不丢失、不重复)
- 通信结束后,需要释放之前所建立的虚电路
- 很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的 X.25 和逐渐过时的帧中继FR、异步传输模式ATM等
「二」无连接的数据报服务
- 数据报服务核心思想是 可靠通信应由用户主机来保证
- 两台计算机进行通信时 不需要建立网络层连接
- 通信双方 可以沿不同路径
- 每个分组的 首部必须携带目的主机的完整地址
- 这种通信方式所传送的 分组可能误码、丢失、重复和失序
- 由于 网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做得比较简单,而且价格低廉(与电信网的交换机相比)
- 因特网 就采取了这种设计思想,将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心
三、IPv4 地址
IPv4 地址概述
- IPv4 地址 就是给因特网上的 每一台主机(或路由器)的每一个接口 分配一个在全世界范围内是 唯一的 32 比特标识符
网际协议版本4(英语:Internet Protocol version 4,IPv4),又称互联网通信协议第四版,是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4是互联网的核心,也是使用最广泛的网际协议版本,其后继版本为IPv6,直到2011年,IANA IPv4位址完全用尽时,IPv6仍处在部署的初期。 —— 百度百科
- IPv4 地址的编码方法经历了如下 三个历史阶段
IPv4 地址表述方法
由于 32 比特的 IPv4 地址不方便阅读、记录以及输入等,因此 IPv4 地址采用 点分十进制表示方法 以方便用户使用
来个小练习
8 位无符号整数二进制与十进制转换问题
- 二进制转十进制
- 十进制转二进制
下面讲述 IPv4 编址的三个历史阶段,也就是三种方法:分类编址、划分子网、无分类编址
1. 分类编址
- 只有 A 类、B 类和 C 类地址可分配给网络中的主机或路由器的各接口
- 主机号为 “ 全 0 ” 的地址是网络地址,不能分配给主机或路由器的各接口
- 主机号为 “ 全 1 ” 的地址是广播地址,不能分配给主机或路由器的各接口
A 类地址
- 说明:
- 可指派的网络数量为 2 ^ (8 - 1) - 2 = 126
- 每个网络中可分配的 IP 地址数量为 2 ^ 24 - 2 = 16777214(去除主机号全 0 的网络地址、全 1 的广播地址)
B 类地址
- 可指派的网络数量为 2 ^ (16 - 2) = 16384
- 每个网络中可分配的 IP 地址数量为 2 ^ 16 - 2 = 65534
注意:有些教材中指出 128.0 是保留网络号,B 类第一个可指派的网络号为 128.1。但根据2002年9月发表的 RFC 3330 文档,128.0 网络号已经可以分配。
C 类地址
- 可指派的网络数量为 2 ^ (24 - 3) = 2097152
- 每个网络中可分配的 IP 地址数量为 2 ^ 8 - 2 = 254
注意:有些教材中指出 192.0.0 是保留网络号,C 类第一个可指派的网络号为 192.0.1。但根据2002年9月发表的 RFC 3330文档,192.0.0 网络号已经可以分配,只不过目前还没有分配出去
分类编址 —— 练习
-
习题一
-
习题二
下图为一般不使用的 IP 地址
-
习题三
2. 划分子网
为将某一网络划分出多个子网,可以借用主机号中某几位作为子网号,计算机通过子网掩码来获得分类地址中有多少比特被用作子网号。
子网掩码
-
32 比特的子网掩码可以表明分类 IP 地址的主机号部分被借用了几个比特作为子网号
- 子网掩码使用 连续的比特 1 来对应网络号和子网号
- 子网掩码使用 连续的比特 0 来对应主机号
-
将划分子网的 IPv4地址 与其相应的 子网掩码 进行 逻辑与 (AND) 运算 就可得到 IPv4 地址 所在子网的网络地址
-
若使用较少位数的子网号,则每一个子网上可连接的主机数就较多;若使用较多位数的子网号,则子网的数目较多但每个子网上可连接的主机数就较少
-
划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数
子网掩码 —— 举例说明
子网掩码 —— 习题
- 习题一
- 习题二
默认子网掩码
因特网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏;如果一个网络 未划分子网,那么该网络的子网掩码就使用默认子网掩码。
默认的子网掩码与网络号相与之后,网络号没有发生变化。
3. 无分类编址
先来一段背景知识
无分类域间路由选择 CIDR
-
CIDR 使用 “ 斜线记法 ”,或称 CIDR 记法。即在IPv4地址后面加上
/
,在 斜线后面写上网络前缀所占比特数量
-
CIDR 实际上是 将网络前缀都相同的连续的 IP 地址组成一个 “ CIDR地址块 ”
-
只要知道 CIDR 地址块中的任何一个地址,就可知道该地址块的全部细节
- 地址块的最小地址
- 地址块的最大地址
- 地址块的地址数量
- 地址块聚合某类网络(A类、B类或C类)的数量
- 地址掩码(子网掩码)
CIDR —— 举例说明
CIDR —— 路由聚合(构造超网)
- 网络前缀越长,地址块越小,路由越具体
- 若路由器查表转发分组时发现有多条路由器可选,则选择网络前缀最长的那条,这称为 最长前缀匹配,因为这样的路由更具体
路由聚合(构造超网)—— 相关考研题
- 习题一
- 习题二
4. 应用规划
给定一个 IPv4 地址块,如何将其划分成几个更小的地址块,并将这些地址块分配给互连网中的不同网络,进而可以给各网络中的主机和路由器接口分配 IPv4 地址。有两种方式:
- 定长的子网掩码 FLSM(Fixed Length Subnet Mask)
- 使用同一个子网掩码来划分子网
- 每个子网所分配的 IP 地址数量相同,造成 IP 地址的浪费
- 变长的子网掩码 VLSM(Variable Length Subnet Mask)
- 使用不同的子网掩码来划分子网
- 每个子网所分配的 IP 地址数量可以不同,尽可能减少对 IP 地址的浪费
定长的子网掩码 FLSM —— 举例说明
应用需求:将 C 类网络 218.75.230.0 划分成 5 个子网,每个子网上可分配的 IP 地址数量不得少于各自的需求
从子网 1 ~ 8 中任选 5 个分配给网络中的 N1 ~ N5 即可
说明
- 采用定长的子网掩码进行子网划分, 只能划分出 2 ^ n 个子网,其中 n 是从主机号部分借用的用来作为子网号的比特数量
- 每个子网分配的 IP 地址相同,容易造成 IP 地址的浪费
变长的子网掩码 VLSM —— 举例说明
应用需求:从地址块 218.75.230.0 / 24 中取出 5 个地址块(1个 “ /27 ” 地址块,3 个 " /28 "地址块,1 个 " /30 " 地址块),按需分配给上图所示的 5 个网络。
四、IP 数据报的发送和转发过程
-
IP 数据报的发送和转发过程包含以下两部分:
1. 主机发送 IP 数据报
2. 路由器转发 IP 数据报
说明:后续举例忽略了 ARP 协议获取目的主机或路由器接口的 MAC 地址的过程以及以太网交换机自学习和转发帧的过程
IP 数据报的发送和转发过程 —— 举例说明
如图所示小型互连网,路由器接口 0 和接口 1 分别直连一个交换式以太网,网络地址和子网掩码如图所示:
- 同一个网络中的主机可以直接通信,这属于 直接交付;不同网络间的主机,需要路由器中转,这属于 间接交付
问题 1 : 那么,源主机如何判断目的主机是否与自己在同一个网络中呢 ?
假设主机 C 向主机 F 发送 IP 数据报。首先,主机 C 将自己的 IP 地址和子网掩码相与,得到主机 C 所在网络的网络地址。 之后,主机 C 将主机 F 的 IP 地址与自己的子网掩码相与,得到目的网络地址。发现它们两个不相等,因此知道这是间接交付,需要路由器转发。
问题 2 : 源主机如何知道路由器的存在 ?
这就涉及到了 默认网关。可以通过指定路由器某接口的 IP 地址指定给各主机,所指定的路由器就被称为默认网关。
缺省网关(Default Gateway),也就是默认网关,是子网与外网连接的设备,通常是一个路由器。当一台计算机发送信息时,根据发送信息的目标地址,通过子网掩码来判定目标主机是否在本地子网中,如果目标主机在本地子网中,则直接发送即可。如果目标不在本地子网中则将该信息送到缺省网关/路由器,由路由器将其转发到其他网络中,进一步寻找目标主机。 —— 百度百科
问题 3 : 路由器收到 IP 数据报后如何转发 ?
- 首先,检查数据报首部是否出错: 若出错,则直接丢弃该 IP 数据报并通告源主机; 若没有出错,则进行转发
- 之后,根据 IP 数据报的目的地址在路由表中查找匹配的条目: 若找到匹配的条目,则转发给条目中指示的下一跳; 若找不到,则丢弃该 IP 数据报并通告源主机
下面来看发送广播 IP 数据报的情况
-
假设主机 A 给本网络上各设备发送了一个广播 IP 数据报。
路由器是隔离广播域的,收到后不会转发广播 IP 数据报,避免了广播风暴和资源浪费 -
假设主机 A 向另一个网络发送广播 IP 数据报。
路由器判断出这是广播 IP 数据报,不对其进行转发
相关练习题
- 习题一
- 习题二
- 习题三
五、静态路由配置及路由环路问题
1. 静态路由配置
- 静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器 人工配置路由表
- 这种人工配置方式简单、开销小。但 不能及时适应网络状态(流量、拓扑等)的变化
- 一般只在小规模网络中采用
- 使用静态路由配置可能出现以下导致产生 路由环路 的错误
- 配置错误
- 聚合了不存在的网络
- 网络故障
静态路由配置 —— 举例说明
采用如图所示的网络拓扑和相应的 IP 地址配置
假设 R1 要转发一个 IP 数据报给如图所指网络中某个主机, 应该怎么操作呢 ?
首先,R1 将 IP 数据报转发给路由器 R2 的接口 0,但 R1 的路由表中并没有该目的网络的路由条目。因此,我们可以使用路由器的相关配置命令,给 R1 添加一条到达该目的网络的路由条目。该路由条目即为我们 人工配置的静态路由。
默认路由 —— 举例说明
如图所示,路由器 R2 的接口 2 连接到了因特网。
R1 如何转发 IP 数据报到包含众多网络的因特网呢 ?
首先,R1 需要将该 IP 数据报转发给路由器 R2 的接口 0。由于因特网中包含了众多的网络,如果给 R1 添加针对这些网络的每一条路由条目,则会产生巨大工作量,且查表转发速度会降低。这就涉及到了 默认路由。
默认路由(Default route),是对IP数据包中的目的地址找不到存在的其他路由时,路由器所选择的路由。目的地不在路由器的路由表里的所有数据包都会使用默认路由。这条路由一般会连去另一个路由器,而这个路由器也同样处理数据包: 如果知道应该怎么路由这个数据包,则数据包会被转发到已知的路由;否则,数据包会被转发到默认路由,从而到达另一个路由器。每次转发,路由都增加了一跳的距离。 —— 百度百科
- 默认路由条目中的目的网络地址为 0.0.0.0,地址掩码也为 0.0.0.0,其 CIDR 形式为 0.0.0.0 / 0
对于本例,我们可以人工配置默认路由,来实现转发到互连网的目的。
特定主机路由 —— 举例说明
我们可以给路由器添加针对某个主机的特定主机路由条目,一般用于网络管理人员对网络的管理和测试。此外,在需要考虑某种安全问题时,也可采用特定主机路由。
如图所示为人工配置的特定主机路由
- 特定主机中的目的网络地址为该特定主机的 IP 地址,地址掩码为 255.255.255.255,其 CIDR 形式为 特定主机 IP 地址 / 32
2. 环路问题
下面介绍路由环路问题
静态路由配置错误导致路由环路 —— 举例说明
所谓 路由环路,就是指数据包不断在这个网络传输,始终到达不了目的地,导致掉线或者网络瘫痪。
如图所示,由于静态路由配置错误,原本下一跳为 R1 的接口 1 错误配置成了 R3 的接口 0,使得 R2 和 R3 之间产生路由环路。
如何解决数据报在路由环路中 永久兜圈 的问题呢 ?
在 IP 数据报首部设有 生存时间TTL 字段。IP 数据报进入路由器后,TTL 字段的值减 1。若 TTL 的值不等于 0,则被路由器转发,否则被丢弃。
聚合了不存在的网络导致路由环路 —— 举例说明
如图所示,假设 R2 要转发 IP 数据报到 192.168.2.0/24,但是因为聚合网络问题,会向 4 个网络进行转发,而其中两个目的网络地址无法在 R1 的路由表中查找到,则会转发到默认网关(即 R2),因此形成了路由环路。
为解决这种情况下的路由环路问题,涉及到了 黑洞路由,其下一跳为 null0
在 R2 的路由表中添加黑洞路由,将所有无关路由吸入其中,使它们有来无回。
网络故障导致路由环路 —— 举例说明
如图所示,路由器 R1 检测到其接口 0 所直连的网络出现了故障而不可达,在其路由表中删除对应的路由条目。当 R2 向其转发 IP 数据包时,无法查找到,因此会转发给默认路由。这就又回到了 R2 本身,造成路由环路。
为解决这种情况下的路由环路问题,同样要利用 黑洞路由:
将故障部分的路由设置为黑洞路由
六、路由选择
1. 路由选择协议概述
路由选择可分为 静态路由选择 和 动态路由选择 两类
- 静态路由选择
- 由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由
- 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化
- 一般只在小规模网络中采用
- 动态路由选择
- 路由器通过路由选择协议自动获取路由信息
- 比较复杂、开销比较大。但能较好地适应网络状态变化
- 适用于大规模网络
因特网所采用的路由选择协议的主要特点
因特网采用 分层次 的路由选择协议
- 自治系统
自治系统(Autonomous System,AS):单一技术管理下的一组路由器,这些路由器使用一种 AS 内部的路由选择协议和共同的度量来确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议来确定分组在 AS 之间的路由。
- 域内路由、域间路由
自治系统内部的路由选择称为 域内路由选择,自治系统之间的路由选择称为 域间路由选择。
- 因特网有两大类路由选择协议
- 内部网关协议 IGP: 内部网关协议即在一个自治系统内部使用的路由选择协议,它与互连网中其他自治系统选用什么路由选择协议无关。目前这类路由选择协议使用得最多,如 RIP 和 OSPF。
- 外部网关协议 EGP:若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时(两个自治系统可能使用不同的 IGP),就需要使用 外部网关协议 协议将路由选择信息传递到另一个自治系统。目前使用最多的外部网关协议是 BGP-4。
常见的路由选择协议
路由器的基本结构
路由器是具有多个输入端口和输出端口的专用计算机,其任务是转发分组,整个路由器结构可划分为两大部分:路由选择部分 和 分组转发部分
-
路由选择部分的核心构件是路由选择处理机。它的任务是根据所使用的路由选择协议周期性地与其他路由器进行路由信息的交互来更新路由表。
-
分组转发部分由三部分构成:交换结构、一组输入端口、一组输出端口。下面分析过程:
信号从某个输入端口进入路由器,物理层将其转为比特流送往数据链路层处理;数据链路层从比特流中识别出帧,去掉帧头帧尾后,送交网络层处理。
1) 如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发,网络层更新数据分组首部中某些字段的值,然后送交数据链路层进行封装,数据链路层将数据分组封装成帧,送交物理层处理,物理层将帧看作比特流,将其变成相应电信号发送。
2) 如果送交网络层的分组是路由器间交换路由信息的路由报文,则把这种分组送交路由选择处理机,路由选择处理机根据分组的内容来更新自己的路由表。 -
路由表一般仅包含从目的网络到下一跳的映射。路由表需要对网络拓扑变化的计算最优化。转发表是从路由表得出的。转发表的结构应当使查找过程最优化。(为简化问题,我们暂且不严格区分路由表、转发表,以路由表来表述)
-
路由选择处理机除了处理收到的路由报文外,还会周期性地给其他路由器发送自己所知道的路由信息
-
路由器的各端口还应具有输入缓冲区和输出缓冲区。输入缓冲区用于暂存新进入路由器但还来不及处理的分组。输出缓冲区用来暂存已经处理完毕但还来不及发送的分组
说明:路由器的端口一般都具有输入和输出功能,图中区分输入和输出是为了更好地展示
2. 路由信息协议 RIP
路由信息协议(Rounting Information Protocol,RIP)是内部网关协议 IGP 中最先得到广泛的协议。RIP 是一种分布式的基于距离向量的路由选择协议。
RIP 规定
-
RIP 要求自治系统 AS 内的每一个路由器都要维护从它自己到 AS 内其他每一个网络的距离记录。这是一组距离,称为 “ 距离向量 D-V(Distance Vector)”
-
RIP 使用 跳数(Hop Count) 作为度量来衡量到达目的网络的距离
-
路由器到直连网络的距离(跳数)定义为 1
-
路由器到非直连网络的距离定义为所经过的路由器数加 1
-
允许一条路径最多只能包含 15 个路由器(至多 15 跳)。距离等于 16 时相当于不可达,可见 RIP 只适用于小型互联网
-
RIP 特点
-
RIP 认为好的路由就是 “ 距离短 ” 的路由,也就是所通过路由器数量最少的路由
-
当到达同一目的网络有多条 “ 距离相等 ” 的路由时,可以进行 等价负载均衡,将通信量分布到多条等价路由上
-
RIP 包含三个要点:
- 和谁交换信息 —— 仅和相邻路由器交换信息
- 交换什么信息 —— 自己的路由表
- 何时交换信息 —— 周期性交换(例如每隔 30 秒)
RIP 基本工作工程 —— 举例说明
- 路由器刚开始工作时,只知道自己到直连网络的距离为 1
- 每个路由器仅和相邻路由器周期性地交换并更新路由信息
- 若干次交换和更新后,每个路由器都知道到达本 AS 内各网络的最短距离和下一跳地址,称为收敛
RIP 路由条目的更新规则 —— 举例说明
如下图,路由器 C 和 D 互为相邻路由器,它们之间周期性交换并更新路由信息。下图为更新路由信息前的情况:
路由器 D 接收到更新报文后,D 的路由表将进行更新
相关考研题
RIP 存在 “ 坏消息传得慢 ” 问题
网络出现故障时,会出现慢收敛现象(即需要较长时间才能将此信息传送到所有路由器),俗称 “ 坏消息传得慢 ”,使更新过程的收敛时间长。
如下图,假设 R1 到达其直连网络 N1 的链路出现了故障。当 R1 检查出该故障后,会将到达 N1 的路由条目中距离改为 16,表示不可达。并等待 RIP 更新周期到时后,发送该路由信息给 R2。但是,如果 R2 抢先一步将自己的路由信息发送给了 R1 ,则会出现下面问题:
-
“ 坏消息传得慢 ” 又称为 路由环路 或 无穷计数 问题,这是距离向量算法的一个固有问题。可以采用多种措施减少该问题出现的概率或减小该问题的危害
- 限制最大路径距离为 15(16 表示不可达)
- 当路由表发生变化时就立即发送更新报文(即,触发更新),而不仅是周期性发送
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口反方向传送(即,水平分隔)
-
即使采用上述算法路由环路问题也无法彻底避免,这是距离向量算法的本质所决定的
相关考研题
3. 开放最短路径优先 OSPF
开放最短路径优先 OSPF,是为克服 RIP 缺点开发出来的,是使用分布式链路状态路由算法的典型代表,也是内部网关协议 IGP 的一种
- 开放:表明 OSPF 协议不是受某一厂家控制,而是公开发表的
- 最短路径优先:因为使用了 Dijkstra 提出的最短路径算法 SPF
OSPF 特点
- OSPF 是基于 链路状态 的,而不像 RIP 那样是基于距离向量的
- OSPF 采用 SPF 算法计算路由,从算法上保证了不会产生路由环路
- OSPF 不限制网络规模,更新效率高,收敛速度快
链路状态
- 链路状态是指本路由器都和哪些路由器相连,以及相应链路的 “ 代价 ”
- 代价:用来表示费用、距离、时延、带宽等,由网络管理人员决定
问候分组 Hello
OSPF 相邻路由器之间通过交互 问候(Hello)分组,建立和维护邻居关系
- Hello 分组封装在 IP 数据报中,发往组播地址 224.0.0.5
- 问候分组的发送周期为 10 秒
- 若 40 秒未收到来自邻居路由器的 Hello 分组,则认为该邻居路由器不可达
OSPF 基本工作原理
使用 OSPF 的每个路由器都会产生 链路状态通告 LSA。LSA 中包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
LSA 被封装在 链路状态更新分组 LSU 中,采用 洪泛法 发送
- 洪泛法是一种简单的路由算法,将收到的封包,往所有的可能连结路径上递送,直到封包到达为止
- 收到链路状态更新分组的路由器,将从自己其他所有接口转发该分组
使用 OSPF 的每个路由器都有一个 链路状态数据库 LSDB,用于存储 LSA。通过各路由器洪泛发送封装有自己 LSA 的 LSU 分组,各路由器的 LSDB 最终将达到一致。
使用 OSPF 的各路由器 基于 LSDB 进行最短路径优先 SPF 计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
OSPF 五种分组类型
- 问候分组:用来发现和维护邻居路由器的可达性
- 数据库描述分组:向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
- 链路状态请求分组:向邻居路由器请求发送某些链路状态项目的详细信息
- 链路状态更新分组:用洪泛法对全文更新链路状态
- 链路状态确认分组:对链路状态更新分组的确认
OSPF 的基本工作过程 —— 举例说明
相邻路由器之间周期性发送问候分组,以便建立和维护邻居关系。建立邻居关系后,给邻居路由器发送数据库描述分组,也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器。
- 例如,R1 收到 R2 的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给 R2 发送链路状态请求分组。R2 收到后,将 R1 所缺少的链路状态项目的详细信息封装在链路状态更新分组中发送给 R1。
- R1 收到后,将这些缺少的链路状态项目的详细信息添加到自己的链路状态数据库中,并给 R2 发送链路状态确认分组。
- 最终 R1 和 R2 的链路状态数据库将达到一致,也就是 链路状态数据库达到同步。
此外, 每隔 30 分钟 或者 链路状态发生变化 时,路由器都会发送链路状态更新分组。收到该分组的其他路由器将洪泛转发该分组,并给该路由器发回链路状态确认分组。这就称为 新情况下的链路状态数据库同步。
OSPF 在多点接入网络中路由器邻居关系的建立
当 OSPF 路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量多播分组。
为了减少所发送分组的数量,OSPF 采用 选举指定路由器 DR 和 备用的指定路由器 BDR 的方法。
- 所有的非 DR/BDR 只与 DR/BDR 建立邻居关系
- 非 DR/BDR 之间通过 DR/BDR 交换信息
区域
为了使 OSPF 能够用于规模更大的网络,OSPF 把一个自治系统再划分为若干更小的范围,叫做 区域 。
- 每个区域都有一个 32 比特的区域标识符,可以用点分十进制表示
- 主干区域的标识符必须为 0 。主干区域用于连通其他区域,其他区域标识符不能为 0,且互不相同
划分区域的好处就是,将利用洪泛法交换链路状态信息的范围局限于每个区域而非整个自治系统,减少了整个网络上的通信量。
- 使得每个区域内部交换路由信息的通信量大大减少,因而使 OSPF 协议能够用于规模很大的自治系统中
4. 边界网关协议 BGP
内部网关协议 IGP(如 RIP、OSPF)
- 设法使分组在同一个自治系统内尽可能有效地从源网络传输到目的网络
- 无需考虑自治系统外部其他方面的策略
外部网关协议 EGP(如 BGP)
-
在不同自治系统内,度量路由的 “ 代价 ” (距离、带宽、费用等)可能不同。由于没有统一的度量,因此寻找最佳路由是不现实的
-
自治系统之间的路由选择必须考虑相关策略(政治、经济、安全等)
考虑到上述环境,BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而非寻找一条最佳路由。
BGP 工作原理
在配置 BGP 时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的 “ 发言人 ”
- 一般来说,两个 BGP 发言人都是通过一个共享网络连接在一起的
- BGP 发言人往往就是 BGP 边界路由器
不同自治系统的 BGP 发言人要交换路由信息,首先必须建立 TCP 连接,端口号 179(可见 BGP 报文是通过 TCP 传送的,也就是作为 TCP 报文的数据部分)
- 在此 TCP 连接上交换 BGP 报文以建立 BGP 会话
- 利用 BGP 会话 交换路由信息(如,增加新的路由、撤销过时路由、报告出错情况等)
- 使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此称为对方的 邻站 或 对等站
BGP 发言人除了运行 BGP 外,还需要运行自己所在自治系统所使用的内部网关协议 IGP(如 RIP 或 OSPF)。
BGP 发言人 交换网络可达性的信息(要到达某个网络所要经过的一些列自治系统)。
当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是 构造出树形结构、不存在回路的自治系统连通图。
BGP 适用于多级结构的因特网
下面给出一个 BGP 发言人交换路径向量的例子:
BGP - 4 共使用 4 种报文
- 打开(Open)报文 :用来与相邻的另一个 BGP 发言人建立关系,使通信初始化
- 更新(Update)报文:用来通告某一路由的信息,以及列出要撤销的多条路由
- 保活(Keepalive)报文:用来周期性证实邻站的连通性
- 通知(Notification)报文:用来发送检测到的差错
相关习题
- 习题一
- 习题二
七、IPv4 数据报的首部格式
IP 首部的部分重要字段含义如下:
-
版本:占 4 比特,表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的版本号为 4(IPv4)。
-
首部长度:占 4 比特,表示 IP 数据报首部的长度。该字段的取值以 4 字节(32 位)为单位。
- 最小十进制取值为 5,表示 IP 数据报首部只有 20 字节固定部分
- 最大十进制取值为 15,表示 IP 数据报首部包含 20 字节固定部分和最大 40 字节可变部分
-
可选字段:长度从 1 个字节到 40 个字节不等。用来支持排错、测量及安全等措施。
- 可选字段增加了 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理 IP 数据报的开销。实际上可选字段很少被使用
-
填充字段:确保首部长度为 4 字节的整数倍。使用全 0 填充。
- 当 IP 分组的首部长度不是 4 字节的整数倍时,必须利用最后的填充字段加以填充。使得 IP 数据报的数据部分永远在 4 字节的整数倍开始,这样在实现 IP 协议时较为方便
-
区分服务:占 8 比特,用来获得更好的服务。
- 该字段在旧标准中叫做服务类型,但实际上一直没有被使用过
- 1998年,因特网工程任务组 IETF 把这个字段改名为区分服务
- 利用该字段的不同数值可提供不同等级的服务质量
- 只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段
-
总长度:占 16 比特,表示 IP 数据报的总长度(首部 + 数据载荷)
- 最大取值为十进制的 65535,以字节为单位
- 举例:首部长度和总长度
下面介绍一下 标识、标志、片偏移。这三个字段共同用于 IP 数据报分片。
如果某个 IP 数据报的长度超过最大传输单元时,将无法封装成帧,需要将原 IP 数据报分片成更小的 IP 数据报,再将各 IP 数据报封装成帧。
最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。
以太网 和 802.3 对数据帧的长度都有一个限制,其最大值分别是 1500 字节和 1492 字节。
-
标识字段:占 16 比特,属于同一个数据报的各分片数据报应该具有相同的标识。
- IP 软件维持一个计数器,每产生一个数据报,计数器值加 1, 并将此值赋给标识字段
-
标志:占 3 比特,各比特含义如下:
- DF位 :标志字段的中间一位。1 表示不允许分片; 0 表示允许分片
- MF位:标志字段中的最低位。1 表示 “后面还有分片”;0 表示 “这是最后一个分片”
- 保留位:必须设置为 0
-
片偏移:占 13 比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位。
- 片偏移以 8 个字节位单位
- 除最后一个数据报片外,每个分片的长度一定是 8 字节(64位)的整数倍
IP 数据报如何分片 ?—— 举例说明
假设如下 IP 数据报,它由 20 字节的固定首部和 3800 字节的数据载荷两部分构成。。假设使用以太网传送该 IP 数据报。以太网的最大传送单元 MTU 为 1500 字节,无法封装,因此进行切片处理。
于是分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。
-
生存时间 TTL:占 8 比特,最初以秒为单位,最大生存周期为 255 秒;路由器转发 IP 数据报时,将 IP 数据报首部中的该字段的值减去 IP 数据报在本路由器上所耗费的时间,若不为 0 就转发,否则就丢弃。
- 随着技术进步,现在把 TTL 字段的功能改为 跳数限制,路由器在每次转发 IP 数据报时,将 IP 数据报首部中的 TTL 的值减 1,若该值不为 0 就转发,否则就丢弃
-
协议:占 8 比特,指明 IPv4 数据报的数据部分是何种协议数据单元。
- 常用的一些协议和相应的协议字段值如下表
-
首部检验和:占 16 比特,用来检测首部(不包括数据部分)在传输过程中是否出现差错。所采用的检错码比 CRC 检验码简单,称为因特网检验和。
- IP 数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化
-
源 IP 地址和目的 IP 地址:各占 32 比特,用来填写发送该 IP 数据报的源主机的 IP 地址和接收该 IP 数据报的目的主机的 IP 地址。
相关练习题
- 习题一
注意:除最后一个数据报片外,每个分片的长度一定是 8 字节(64位)的整数倍
- 习题二
解析:
1)Web 请求在网际层被封装在 IP 分组的数据部分,Web服务器的 IP 地址就填写在 IP 分组首部中的目的 IP 地址字段。IP 分组还要封装成以太网帧才能发送。在 IP 分组头中,目的 IP 地址字段前还有 16 个字节的内容。在以太网帧中,数据载荷前还有 14 个字段的内容。因此可知,在以太网帧中,从第 31 个字节开始的 4 个字节,实际上就是 IP 地址的内容。
题目中所给的以太网数据帧的第一列数据,实际上并不是以太网帧的内容,仅仅作为行号,其增量16,表示每行有 16 个字节的内容。
由此,Web服务器的 IP 地址为 64.170.98.32。
2)从图中可知,主机的默认网关就是路由器 R,主机会将 Web 请求发送给默认网关,由默认网关将 Web 请求转发到因特网。因此,以太网头中的目的 MAC 地址字段,封装的就是默认网关的 MAC 地址。具体为 00-21-27-21-51-ee。
3)IP 分组经过路由器 R 时,生存时间字段被减 1;首部检验和会被重新计算;若 IP 分组总长度大于 MTU,则需要进行分片,此时总长度字段、标志字段、片偏移字段都需要修改。
此题有些复杂,但是仔细探讨一下还是有挺多收获的。
八、网际控制报文协议 ICMP
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP(Internet Control Message Protocol)。
- 主机或路由器使用 ICMP 来发送 差错报告报文 和 询问报文
- ICMP报文被封装在 IP 数据报中发送
1. ICMP 差错报文
ICMP 差错报文共有以下五种:
终点不可达
- 当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。具体可再根据 ICMP 的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等 13 种错误
源点抑制
- 当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢
时间超过
- 当路由器收到一个目的 IP 地址不是自己的 IP 数据报时,会将其生存时间 TTL 字段的值减 1。若结果不为 0,则将该 IP 数据报转发出去;若结果为 0,除丢弃该 IP 数据报外,还要向源点发送时间超过报文
- 另外,当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过报文
参数问题
- 当路由器或目的主机收到 IP 数据报后,根据其首部中的检验和字段发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。
改变路由(重定向)
- 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
需要注意,以下情况不应发送 ICMP 差错报告报文:
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文
- 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文
- 对具有多播地址的数据报都不发送 ICMP 差错报告报文
- 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文
相关练习题
2. ICMP 询问报文
回送请求和回答
- ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问
- 收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文
- 这种询问报文用来 测试目的站是否可达 及了解其有关状态
时间戳请求和回答
- ICMP 时间戳请求报文是请某个主机回答当前的日期和时间
- 在 ICMP 时间戳回答报文中有一个 32 位的字段,其中写入的整数代表从 1900年1月1日 起到当前时刻一共有多少秒
- 时间戳请求与回答可 用于时钟同步和时间测量
3. ICMP 应用举例
分组间探测 PING
- 用来测试主机或路由器间的连通性
- 应用层直接使用网际层的 ICMP(没有通过运输层的 TCP 或 UDP)
- 使用 ICMP 回送请求和回答报文
跟踪路由 traceroute
- 用来测试 IP 数据报从源主机到目的主机要经过那些路由器
- Window 版本
- tracert 命令
- 应用层直接使用网际层 ICMP
- 使用了 ICMP 回送请求和回答报文以及差错报告报文
- Unix 版本
- traceroute 命令
- 在运输层使用 UDP 协议
- 仅使用 ICMP 差错报告报文
tracert 命令实现原理 —— 举例说明
如下图 H1 想知道到达 H2 要经过哪些路由器,就要给 H2 发送 ICMP 回送请求报文,该报文封装在 IP 数据报中,然后采用 “ 疯狂试探 ” 的方法:
- 首先,IP 数据报首部中生存时间字段 TTL 的值被设置为 1。到达 R1 后,TTL 减少为 0,丢弃 IP 数据报并给源主机发送 ICMP 差错报告。H1 就知道了第一个路由器 R1。
- H1 继续发送 TTL 值为 2 的 IP 数据报,同样,H1 就知道了第二个路由器 R2。
- H1 继续发送 TTL 值为 3 的 IP 数据报,该数据报到达主机 H2 ,生存时间减少为 1。H2 解析该数据报,发现其内部封装的是 ICMP 回送请求报文,于是给 H1 发送封装有 ICMP 回送请求回答报文的 IP 数据报。这样,H1 知道了已经跟踪到最后一站,即目的主机。
九、虚拟专用网 VPN 与网络地址转换 NAT
1. 虚拟专用网 VPN
利用公用的因特网作为本机构各专用网之间的通信载体,这样的专用网又称为 虚拟专用网(Virtual Private NetWork)。
虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。虚拟专用网是对企业内部网的扩展。—— 百度百科
那么,虚拟专用网中各主机分配怎样的 IP 地址呢 ?
由于 IPv4 地址的紧缺,一个机构能够申请到的 IPv4 地址数量往往小于本机构所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址。
需要注意:私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。也就是私有地址只能用作 本地地址 而不能用作 全球地址 。在因特网中的所有路由器对目的地址是私有地址的 IP 数据报一律不进行转发。
举例说明
下图为部门 A 的主机 10.1.0.3 要给部门 B 中的主机 10.2.0.3 发送数据所经历的过程:
- 先封装成内部 IP 数据报发送给路由器 R1。R1 收到后发现目的网络必须通过因特网才能到达,就将该内部 IP 数据包进行加密,然后重新添加上数据报的首部,封装成在因特网上可以发送的外部数据报
- 路由器 R2 收到该外部数据报后,去掉其首部,将其数据部分进行解密,恢复其原来的内部数据报。再根据原来的目的地址发送数据。
虽然通过了公用的因特网,但在效果上好像是再本机构的专用网上传送一样。从逻辑上看,R1 和 R2 之间好像是一条直通的点对点链路,因此也被称为 IP 隧道技术。
本例属于同一机构不同部门的内部网络所构成的虚拟专用网 VPN,又称为 内联网 VPN 。
有时一个机构的 VPN 需要有某些外部机构(通常是合作伙伴)参与进来,这样的 VPN 就称为 外联网 VPN 。
在外地工作的员工需要访问公司内部的专用网络,只要在任何地点接入到因特网,运行驻留在员工 PC 中的 VPN 软件,在员工的 PC 和公司主机之间建立 VPN 隧道,即可访问专用网络中的资源。这种 VPN 称为 远程接入 VPN 。
2. 网络地址转换 NAT
1994 年提出了一种网络地址转换 NAT 的方法再次缓解了 IPv4 地址空间即将耗尽的问题(2019年11月25日 IPv4 地址完全耗尽)。
NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源 。
问题:使用私有地址的主机如何才能与因特网上使用全球 IP 地址的主机进行通信呢 ?
这需要在专用网络连接到因特网的路由器上安装 NAT 软件。装有 NAT 软件的路由器叫做 NAT 路由器,它至少有一个有效的外部全球 IP 地址。
这样,所有使用私有地址的主机在和外界通信时,都要在 NAT 路由器上将其私有地址转换成全球 IP 地址。
举例说明
下图为专用网中某主机 192.168.0.2 向因特网中某主机 218.75.230.30 发送数据的过程:
因特网上的这台主机给源主机发回数据报:
该 IP 数据报到达 NAT 路由器后,路由器在 NAT 转换表中进行查找,发现该数据报的目的地址所对应的私有地址为 192.168.0.2,于是修改目的地址并发送给相应主机。
该转换方法存在一个问题:如果 NAT 路由器具有 N 个全球 IP 地址,那么至多只能有 N 个内网主机能够同时和因特网上的主机通信。
由于绝大多数的网络应用都是使用运输层协议 TCP 或 UDP 来传送数据,因此可以利用运输层的端口号和 IP 地址一起进行转换。
这样,用一个全球 IP 地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和 IP 地址一起进行转换的技术叫做 网络地址与端口号转换 NAPT。
NAPT —— 举例说明
实际上,现在很多家用路由器都是这种 NAPT 路由器。由于端口号概念属于运输层,此处不再详细解释。
问题:内网主机与外网主机间的通信,是否能由外网主机首先发起 ?
答案是否定的。原因是在 NAPT 转换表中找不到相应的记录,无法把数据报转发给内网中的主机。因此,使用私有地址的主机不能直接充当因特网服务器。
对于一些点对点(P2P)网络应用,需要外网主机主动与内网主机进行通信,在通过 NAT 时也会遇到问题,需要网络应用自己使用一些特殊的 NAT 穿越技术来解决问题。
另外,由于 NAT 对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护。