# 路由选择协议概述

# 静态路由选择

  • 由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由
  • 这种人工配置方式简单、开销小。但不能及时适应网络(流量、拓扑等)的变化
  • 一般只在小规模网络中采用

# 动态路由选择

  • 路由器通过路由选择协议自动获取路由信息

  • 比较复杂、开销比较大。能较好地适应网络状态的变化

  • 适用于大规模网络

因特网所采用的路由选择协议的主要特点

适应性:动态路由选择,能较好地适应网络状态的变化

分布式:路由器之间交换路由信息

分层次:将整个因特网划分为许多较小的自治系统 AS

因特网采用分层次的路由选择协议

自治系统 AS 直接通过路由器相连,使用外部网关协议 FGP

自治系统 AS 内部使用内部网关协议 IGP,不同的自治系统 AS 可使用不同的内部网关协议

常见的路由选择协议

  • 内部网关协议 IGP
    • 路由信息协议 RIP
      • 基于距离向量
      • RIP 在因特网上最早使用
    • 内部网关路由协议 IGRP
      • 基于距离向量
      • IGRP 是思科早期私有的协议,现在已被 EIGRP 取代
    • 增强型内部网关路由协议 EIGRP
      • 思科私有的,用来取代 IGRP 的混合型路由协议(结合距离向量和链路状态)
    • 开放式最短路径优先 OSPF
      • 基于链路状态的
      • OSPF 在各种网络中广泛使用
    • 中间系统到中间系统 IS-IS
      • 局域链路状态的
      • 集成化的 IS-IS 是 ISP 骨干网上最常使用的 IGP 协议
  • 外部网关协议 FGP
    • 边界网关协议 BGP

# 路由器的基本结构

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

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

  • 转发表是从路由表得出的

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

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

    • 端口一般都具有输入和输出的功能
    • 输入缓冲区用来暂存新进入路由器但还来不及处理的分组
    • 输出缓冲区用来暂存已经处理完毕但还来不及发送的分组

# 路由协议 RIP 的工作原理

路由信息协议 RIP 是内部网关协议 IGP 中最先得到广泛使用的协议之一,其相关标准文档为 RFC 1058

RIP 要求自治系统 AS 内的每一个路由器都要维护从它自己到 AS 内其他每一个网络的距离记录。这是一组距离,称为 "距离向量 D-V"

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

  • 路由器到直连网络的距离定义为 1
  • 路由器到非直连网络的距离定义为所经过的路由器数加 1
  • 允许一条路径最多只能包含 15 个路由器。"距离" 等于 16 时相当于不可达。因此 RIP 只适用于小型互联网

RIP 认为好的路由就是 "距离短" 的路由,也就是所通过路由器数量最少得路由

当到达同一目的网络有多条 "距离相等" 的路由时,可以进行等价负载均衡

RIP 包含以下三个要点:

  • 和谁交换信息:仅和相邻路由器交换信息
  • 交换什么信息:自己的路由表
  • 何时交换信息:周期性交换(例如每 30 秒)

RIP 的基本工作过程

  • 路由器刚开始工作时,只知道自己到直接网络的距离为 1
  • 每个路由器仅和相邻路由器周期性地交换并更新路由信息
  • 若干次交换和更新后,每个路由器都知道到达本 AS 内各网络的最短距离和下一跳地址,称为收敛

RIP 的路由条目的更新规则

到达目的网络,相同下一跳,最新消息,更新

发现了新的网络,添加

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

到达目的网络,不同下一跳,等价负载均衡,更新

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

坏消息传播得慢问题

RIP 存在 "坏消息传播得慢" 的问题

"坏消息传播得慢" 又称为路由环路问题或距离无穷计数问题,这是距离向量算法的一个固有问题。可以采取多种措施减少出现该问题的概率或减小该问题带来的危害

  • 限制最大路径距离为 15(16 表示不可达)
  • 当路由表发生变化时就立即发送更新报文(即 "触发更新"),而不仅是周期性发送
  • 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即 "水平分割")

习题

1、某自治系统内采用 RIP 协议,若该自治系统内的路由器 R1 收到其邻居路由器 R2 的距离矢量,距离矢量中包含信息 <net1,16>,则能得出的结论是(D)

A.R2 可以经过 R1 到达 net1,跳数为 17

B.R2 可以到达 net1,跳数为 16

C.R2 可以经过 R2 到达 net1,跳数为 17

D.R1 不能经过 R2 到达 net1

解析:在 RIP 协议中,距离 16 表明目的网络不可达。因此 R2 无法到达 net1,R1 也无法通过 R2 到达 net1

2、

解析:答案选 B,由 R3 检测网络 201.1.2.0/25 可知,R3 与该网络是直连的,向 R2 通告后,R2 到 201.1.2.0/25 修改为 16。但 R2 更新后,R1 会向 R2 发送更新报文,因此 R2 会由 R1 的信息 "通过 R3 到 201.1.2.0/25 的距离为 2",因此 R2 就会更新成 "通过 R1 到 201.1.2.0/25 的距离为 3"

# 开放最短路径优先 OSPF 的基本工作原理

开放最短路径优先 OSPF 是为克服 RIP 的缺点在 1989 年开发出来的

  • "开放" 表明 OSPF 协议不是受某一家厂商控制,而是公开发表的
  • "最短路径优先" 是因为使用了迪杰斯特拉提出的最短路径算法 SPF

OSPF 是基于链路状态的,而不像 RIP 那样是基于距离向量的

OSPF 采用 SPF 算法计算路由,从算法上保证了不会产生路由环路

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

链路状态是指本路由器在和哪些路由器相邻,以及相应链路的 "代价"

  • "代价" 用来表示费用、距离、时延、带宽等等,这些都由网络管理人员来决定

OSPF 相邻路由之间通过交互问候(Hello)分组,建立和维护邻居关系

  • Hello 分组封装在 IP 数据报中,发往组播地址 224.0.0.5
  • 发送周期为 10 秒
  • 40 秒未收到来自邻居路由器的 Hello 分组,则认为该邻居路由器不可达

使用 OSPF 的每个路由器都会产生链路状态通告 LSA,LSA 包含以下内容:

  • 直连网络的链路状态信息
  • 邻居路由器的链路状态信息

LSA 被封装在链路状态更新分组 LSU 中,采用洪泛法发送

使用 OSPF 的每个路由器都有一个链路状态数据库 LSDB,用于存储 LSA

通过各路由器洪范发送封装有自己 LSA 的 LSU 分组,各路由器的 LSDB 最终将达到一致

使用 OSPF 的各路由器基于 LSDB 进行最短路径优先 SPF 计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表

OSPF 分组类型

OSPF 有以下五种分组类型:

  • 类型 1:问候分组
    • 用来发现和维护邻居路由器的可达性
  • 类型 2:数据库描述分组
    • 向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
  • 类型 3:链路状态请求分组
    • 向邻居路由器请求发送某些链路状态项目的详细信息
  • 类型 4:链路状态更新分组
    • 路由器使用这种分组将其链路状态进行洪范发送,即用洪泛法对全网更新链路状态
  • 类型 5:链路状态确认分组
    • 这是对链路状态更新分组的确认分组

OSPF 的基本工作过程

OSPF 在多点接入网络中路由器邻居关系的建立

  • 选举指定路由器 DR 和备用的指定路由器 BDR
  • 所有的非 DR/BDR 只与 DR/BDR 建立邻居关系
  • 非 DR/BDR 之间通过 DR/BDR 交换信息

为了使 OSPF 能够用于规模很大的网络,OSPF 把一个自治系统再划分为若干个更小的范围,即做区域

划分区域的好处就是把利用洪范方法交换链路体信息的范围局限于每一个区域而不是整个自治系统,这就减少了整个网络上的通信信息

# 边界网关协议 BGP 的基本工作原理

外部网关协议 EGP(例如边界网关协议 BGP)

  • 在不同自治系统内,度量路由的 "代价"(距离,带宽,费用等)可能不同。因此,对于自治系统之间的路由选择,使用 "代价" 作为度量来寻找最佳路由是不行的

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

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

在配置 BGP 时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的 "BGP 发言人"

不同自治系统的 BGP 代言人要交换路由信息,首先必须建立 TCP 连接,端口号为 179

  • 在此 TCP 连接上交换 BGP 报文以建立 BGP 会话

  • 利用 BGP 会话交换路由信息(例如,增加新的路由,或撤销过时的路由,以及报告出错的情况等)

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

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

BGP 发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统)

当 BGP 发言人互相交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略从收到的路由信息中找出各自治系统的较好路由。也就是构造出树形结构,不存在回路的自治系统连通图

BGP 适用于多级结构的因特网

BGP-4 有以下 4 种报文:

  • OPEN(打开)报文:用来与相邻的另一个 BGP 发言人建立关系,使通信初始化
  • UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由
  • KEEPALIVE(保活)报文:用来周期性地证实邻站的连通性
  • NOTIFICATION(通知)报文:用来发送检测到的差错

习题

1、

解析:R1 和 R2 之间是两个不同的自治系统 AS,且 R1 和 R2 为两个自治系统边缘连接路由器,因此采用外部网关协议 EGP 协议,具体为 BGP 协议进行路由信息交换,BGP 路由协议报文被封装到 TCP 报文中进行传输

2、直接封装 RIP、OSPF、BGP 报文的协议分别是(D)

A.TCP、UDP、IP B.TCP、IP、UDP C.UDP、TCP、IP D、UDP、IP、TCP

解析:记住下面的封装关系即可

# IPv4 数据报的首部格式

  • 版本

    • 占 4 比特,表示 IP 协议的版本
    • 通信双方使用的版本必须一致,目前广泛使用的 IP 协议版本号为 4(即 IPv4)
  • 首部长度

    • 占 4 比特,表示 IP 数据报首部的长度,该字段的取值以 4 字节为单位
    • 最小十进制取值为 5,表示 IP 数据报首部只有 20 字节固定部分
    • 最大十进制取值为 15,表示 IP 数据报首部只包含 20 字节固定部分和最大 40 字节可变部分
  • 可选字段

    • 长度从 1 个字节到 40 个字节不等。用来支持排错、测量和安全措施
    • 可选字段增加了 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理 IP 数据报的开销。实际上可选字段很少被使用
  • 填充字段:用于确保首部长度为 4 字节的整数倍,使用全 0 进行填充

  • 区分服务

    • 占 8 比特,用来获得更好的服务
    • 该字段在旧标准中叫工作服务类型,但实际上一直没有被使用过
    • 利用该字段的不同数值可提供不同等级的服务质量
    • 只有在使用区分服务时,该字段才起作用。一般情况下都不使用该字段
  • 总长度

    • 占 16 比特,表示 IP 数据报的总长度(首部 + 数据载荷)
    • 最大取值为十进制的 65535,以字节为单位
  • 标识、标志、片偏移

    • 三个字段共同用于 IP 数据报分片
    • 标识
      • 占 16 比特,属于同一个数据报的各分片数据报应该有相同标识
      • IP 软件维持一个计数器,每产生一个数据报,计数器增加 1,并将此赋给标识字段
    • 标志
      • 占 3 比特,各比特含义如下:
      • DF 位:1 表示不允许分片,0 表示允许分片
      • MF 位:1 表示后面还有分片,0 表示这是最后一个分片
      • 保留位:必须设置为 0
    • 片偏移:
      • 占 13 比特,指出分片数据报的数据载荷部分偏移其在原数据报的位置有多少个单位
      • 片偏移以 8 个字节为单位
  • 生存时间字段 TTL

    • 占 8 比特,最初以秒为单位,最大生存周期为 255 秒;路由器转发 IP 数据报时,将 IP 数据报首部中的该字段的值减去 IP 数据报在本地路由器上所耗费的时间,若不为 0 就转发,否则就丢弃
    • 现在以 "跳数" 为单位,路由器转发 IP 数据报时,将 IP 数据报首部中的该字段减 1,若不为 0 就转发,否则就丢弃
    • 作用:防止 IP 数据报在网络中永久兜圈
  • 协议

    • 占 8 比特,指明 IPv4 数据报的数据部分是何种协议数据单元。常用的一些协议和相关协议字段如下:
    • ICMP:1;IGMP:2;TCP:6;UDP:17;IPv6:41;OSPF:89;
  • 首部检验和

    • 占 16 比特,用来检测首部在传输过程中是否出现差错。比 CRC 检验码简单,称为因特网检验和
    • IP 数据报每经过一个路由器,路由器都要重新计算首部检验和,因为某些字段(生存时间、标志、片偏移等)的取值可能发生变化
    • 由于 IP 层本身并不提供可靠传输服务,并且计算首部校验和是一项耗时的操作,因此在 IPv6 中,路由器不再计算首部校验和,从而更快转发 IP 数据报
  • 源 IP 地址和目的 IP 地址

    • 各占 32 比特,用来填写发送该 IP 数据报的源主机 IP 地址和接受该 IP 数据报的目的主机的 IP 地址

习题

1、

解析:

由于每个分片需要分最大的分片,因此封装数据的字节数为 800-20=780B,一共有 1480B 数据传输至少需要 2 个分片,第一个分片的片偏移量为 0/8=0,第二个分片的片偏移量为 780/8=97.5,由于片偏移量必须是整数,因此,这种方案不行。

将分片长度改为小于 780 且能整除 8 的最大整数,因此,第一个分片装 776 字节,第二个分片装 704 个字节,分片二的片偏移量为 776/8=97

2、

解析:

Web 请求在网际层被封装在 IP 分组的数据部分,IP 分组头部目的 IP 地址前有 16 个字节,在以太网帧中,数据部分前面还有 14 个字节,因此,从第 30 个字节开始后的 4 个字节数据即是目的 IP 地址。因此目的 IP 地址为:40aa6220->64.170.98.32。由图可知,主机的默认网关就是路由器 R,以太网帧中封装的目的 MAC 地址就是默认网关的地址:00-21-27-21-51-ee

IP 分组经过 R 时,IP 分组头中的生存时间字段需要减 1,首部检验和会被重新计算。若 IP 分组总长度大于 MTU,则需要进行分片,此时总长度字段、标志字段、片偏移字段都需要修改

# 网际控制报文协议 ICMP

为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网络控制报文协议 ICMP

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

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

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 差错报告报文

常用的 ICMP 询问报文由以下两种:

  • 回送请求和回答
    • ICMP 回送请求报文是由主机或路由器向一个特定的主机发送的询问
    • 收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文
    • 这种询问报文用来测试目的站是否可达及了解其有关状态
  • 时间戳清奇和回答
    • ICMP 时间戳请求报文是请某个主机或路由器回答当前的日期和时间
    • 在 ICMP 时间戳回答报文中有一个 32 位的字段,其中写入的整数代表 1900 年 1 月 1 日起到当前时刻一共有多少秒
    • 这种时钟报文用来时钟同步和测量时间

ICMP 应用举例

分组网络探测 PING

  • 用来测试主机或路由器间的连通性
  • 应用层直接使用网际层的 ICMP(没有通过运输层的 TCP 或 UDP)
  • 使用 ICMP 回送请求和回答报文

跟踪路由:

  • 用来测试 IP 数据报从源主机到达目的主机要经过哪些路由器
  • Windows 版本
    • tracert 命令
    • 应用层直接使用网际层 ICMP
    • 使用了 ICMP 回送请求和回答报文以及差错报告报文
  • Unix 版本
    • traceroute 指令
    • 在运输层使用 UDP 协议
    • 仅使用 ICMP 差错报告报文

习题

1、若路由器 R 因为拥塞丢弃 IP 分组,则此时 R 可向发送出该 IP 分组的源主机发送的 ICMP 报文类型是(C)

A. 路由重定向 B. 目的不可达 C. 源点抑制 D. 超时

解析:因拥塞丢弃分组需要发送源点抑制 ICMP 差错报文,使源点知道应把数据报的发送速率放慢

# 虚拟专用网 VPN 和网络地址转发 NAT

虚拟专用网 VPN

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

由于 IPv4 地址的紧缺,一个机构能够申请到的 IPv4 地址数量往往远小于本机所拥有的主机数量。因此,虚拟专用网中的各主机所分配的地址应该是本机构可自由分配的专用地址,而不是需要申请的、在因特网上使用的公有地址

同一机构内不同的部门的内部网络所构成的虚拟专用网络 VPN 又称为内联网 VPN

有时一个机构的 VPN 需要有某些外部机构(通常就是合作伙伴)参与进来,这样的 VPN 就称为外联网 VPN

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

网络地址转换 NAT

虽然因特网采用了无分类编址方式来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4 地址空间即将面临耗尽的危险仍没有被解除

本质上是公司内网的主机怎么和全球因特网主机进行信息交流

该转换方法有一个问题:如果 NAT 路由器具有 N 个全球 IP 地址,那么至多能有 N 个内网主机能够和因特网上的主机通信

由于绝大多数的网络应用都是使用运输层 TCP 或 UDP 来传送数据,因此可以利用运输层的端口号和 IP 地址一起进行转换。

这样,用一个全球 IP 地址就可以使多个拥有本地地址的主机同时和因特网上的主机进行通信。这种将端口号和 IP 地址一起进行转换的技术叫做网络地址与端口号转换 NAPT

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

另外,由于 NAT 对外网屏蔽了内网主机的网络地址,能为内网的主机提供一定的安全保护