# 网络层概述
# 分组转发和路由选择
- 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能
- 路由选择处理机执行路由选择协议生成路由表,再生成转发表
# 网络层向其上层提供的两种服务
# 面向连接的虚电路服务
- 核心思想是 “可靠通信应由网络自身来保证”。
- 必须首先建立网络层连接 —— 虚电路(Virtual Circuit,VC),以保证通信双方所需的一切网络资源。
- 通信双方沿着已建立的虚电路发送分组
- 虚电路表示这是一条逻辑上的连接,分组沿着这条逻辑连接按照存储转发方式传送,而不是真正建立了一条物理连接。
- 分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需要携带一条虚电路编号即可。
- 通信结束后,需要释放之前所建立的虚电路。
- 这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确(无差错按序到达、不丢失、不重复)到达接收方。
# 无连接的数据报服务
因特网真正使用的:
-
核心思想是 “可靠通信应由用户主机来保证”。
-
不需要建立网络层连接。
-
每个分组可走不同的路径。 因此,每个分组的首部都必须携带目的主机的完整地址。
-
通信结束后,没有需要释放的连接。
-
这种通信方式所传送的分组可能误码、丢失、重复和失序
-
简单灵活的、无连接的不可靠的数据报服务
-
由于网络自身不提供端到端的可靠传输服务,这就使得网络中的路由器可以做得比较简单,大大降低了网络造价
-
这种设计思想的运行方式灵活、能够适应多种应用。因特网能够发展到今日的规模,充分证明了当初采取这种设计思想的正确性
# 网际协议 (IP)
# 网际协议
- 网际协议(Internet Protocol,IP)是 TCP/IP 体系结构网际层中的核心协议
# 异构网络互联
- 要将众多的异构型网络都互连起来,并且能够互相通信,则会面临许多需要解决的问题
- 不同的网络接入机制
- 不同的差错恢复方法
- 不同的路由选择技术
- 不同的寻址方案
- 不同的最大分组长度
- 不同的服务(面向连接服务和无连接服务)
# IPv4 地址及其编址方法
- 由于 IPv4 地址由 32 比特构成,不方便阅读、记录以及输入等,因此 IPv4 地址采用点分十进制表示方法以方便用户使用。
- 网络号
- 标志主机(或路由器)的接口所连接到的网络
- 同一个网络中,不同主机(或路由器)的接口的 IPv4 地址的网络号必须相同,表示它们属于同一个网络。
- 主机号
- 标志主机(或路由器)的接口
- 同一个网络中,不同主机(或路由器)的接口的 IPv4 地址的主机号必须各不相同,以便区分各主机(或路由器)的接口。
# IPv4 地址概述
- IPv4 地址是给因特网(Internet)上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的 32 比特的标识符。
- IPv4 地址是给因特网(Internet)上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的 32 比特的标识符。
- IPv4 地址由因特网名字和数字分配机构(Internet Corporation for Assigned Names and Numbers,ICANN)进行分配。
# IPv4 地址的分类编址方法
- A 类、B 类和 C 类地址都是单播地址,只有单播地址可以分配给网络中的主机(或路由器)的各接口。
- 主机号为 “全 0” 的地址是网络地址,不能分配给主机(或路由器)的各接口。
- 主机号为 “全 1” 的地址是广播地址,不能分配给主机(或路由器)的各接口。
- A 类网络
- 最小网络号为 0,表示本网络,不能指派;
- 最大网络号为 127,作为本地环回测试地址,不能指派
- B 类网络
- 最小可指派的网络号为 128.0
- 最大可指派的网络号为 191.255
- 即能指派 2(16-2)(B 类开头固定 10)
- C 逻辑同 B
此例说明分类编址 IPv4 地址浪费大
# IPv4 地址的划分子网编址方法
- 随着更多的中小网络加入因特网,IPv4 分类编址方法不够灵活、容易造成大量 IPv4 地址资源浪费的缺点就暴露出来了。
- 与 IPv4 地址类似,子网掩码也是由 32 比特构成的。
- 用左起多个连续的比特 1 对应 IPv4 地址中的网络号和子网号;
- 之后的多个连续的比特 0 对应 IPv4 地址中的主机号。
- 子网划分后也要记得减去 2 得到可分配地址
- 默认子网掩码是指在未划分子网的情况下使用的子网掩码
- 某主机的 IP 地址为 180.80.77.55,子网掩码 255.255.252.0,若该主机向其所在子网发送广播分组,则目的地址可以是
# IPv4 地址的无分类编址方法
- 网络前缀是不定长的,仅从 IPv4 地址自身是无法确定其网络前缀和主机号的,需要配合使用 32 比特的地址掩码。
- 无分类编址方法使用的地址掩码与划分子网使用的子网掩码类似,由 32 比特构成。
- 用左起多个连续的比特 1 对应 IPv4 地址中的网络前缀;
- 之后的多个连续的比特 0 对应 IPv4 地址中的主机号。
- 为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的 IPv4 地址后面加上斜线 “/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特 1 的数量),这种记法称为斜线记法
- 实际上,无分类域间路由选择 CIDR 是将网络前缀都相同的、连续的多个无分类 IPv4 地址,组成一个 CIDR 地址块,只要知道 CIDR 地址块中的任何一个地址,就可以知道该地址块的以下全部细节
- 地址块中的最小地址
- 地址块中的最大地址
- 地址块中的地址数量
- 地址块中聚合某类网络(A 类、B 类、C 类)的数量
- 地址掩码
- 使用无分类编址方法,可以根据客户的需要分配适当大小的 CIDR 地址块,因此可以更加有效地分配 IPv4 的地址空间。
- 使用无分类编址方法的另一个好处是路由聚合(也称为构造超网)
- 路由聚合
# IPv4 地址的应用规划
- 在地址块中选取子块的原则
- 每个子块的起点位置不能随便选取,只能选取主机号部分是块大小整数倍的地址作为起点。
- 建议先为大的子块选取
- 若将 101.200.16.0/20 划分为 5 个子网,则可能的最小子网的可分配 IP 地址数是
# IPv4 地址与 MAC 地址
- 网际层在:运输层传输的运输层首部 + 应用层报文之前再加 IP 地址
- 在数据包的传送过程中,数据包的源 IP 地址和目的 IP 地址保持不变;
- 在数据包的传送过程中,数据包的源 MAC 地址和目的 MAC 地址逐链路(或逐网络)改变。
- 路由器 R 通过以太网交换机 S1 和 S2 连接两个网络,R 的接口、主机 H1 和 H2 的 IP 地址与 MAC 地址如下图所示。若 H1 向 H2 发送一个 IP 分组 P,则 H1 发出的封装 P 的以太网帧的目的 MAC 地址、H2 收到的封装 P 的以太网帧的源 MAC 地址分别是
- 如果仅使用 MAC 地址进行通信,则会出现以下主要问题:
- 因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的 MAC 地址。
- 手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由
- 信息来自动构建路由表,也会因为路由信息需要包含海量的 MAC 地址信息而严重占用通信资源。
- 包含海量 MAC 地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延
- 因特网的网际层使用 IP 地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的 MAC 地址。
- 路由器收到 IP 数据报后,根据其首部中的目的 IP 地址的网络号部分,基于自己的路由表进行查表转发。
- 查表转发的结果可以指明 IP 数据报的下一跳路由器的 IP 地址,但无法指明该 IP 地址所对应的 MAC 地址。因此,在数据链路层封装该 IP 数据报成为帧时,帧首部中的目的 MAC 地址字段就无法填写,该问题需要使用网际层中的地址解析协议 ARP 来解决。
# 地址解析协议 ARP
-
处于网际层
-
当不知道目的主机的 mac 时,发送广播报文获取目的 IP 对应的 mac 地址
-
ARP 请求报文包括自己的 IP 和 mac, 目的主机的 IP
-
非目的主机接受到直接诶丢弃,目的主机接收到后保存源主机的 IP 和 mac, 记录到自己的 ARP 高速缓存表中
-
目的主机给源主机发送单播 ARP 响应报文,包含自己的 IP,MAC, 源主机 (目的主机的目的主机) MAC 地址
-
源主机保存信息至自己的 ARP 高速缓存表
-
ARP 表不是不变的,静态手动配置,不变;动态自动获取并周期删除,默认 2 分钟周期
-
由于 ARP 协议的主要用途是从网际层使用的 IP 地址解析出在数据链路层使用的 MAC 地址。因此,有的教材将 ARP 协议划归在网际层,而有的教材将 ARP 协议划归在数据链路层。这两种做法都是可以的。
-
除了 ARP 请求报文和响应报文,ARP 协议还有其他类型的报文,例如用于检查 IP 地址冲突的 “无故 ARP”(Gratuitous ARP)。
-
由于 ARP 协议很早就制定出来了(1982 年 11 月),当时并没有考虑网络安全问题。因此,ARP 协议没有安全验证机制,存在 ARP 欺骗和攻击等问题
# IP 数据报的发送和转发流程
- IP 数据报的发送和转发过程包含以下两个过程:
- 主机发送 IP 数据报
- 路由器转发 IP 数据报
- 暂时忽略使用 ARP 获取 mac 和交换机自学习过程
- 同一网络中的主机可以直接交付,不同网络之间通过路由器间接交付
- 二者查询自己的 IP, 看是否在一个子网
- 本网络所在路由器称为默认网关,间接交付时交给默认网关即可
- 路由器检查收到的 IP 数据报是否正确
- 生存时间是否结束
- 首部是否误码
- 若不正确,则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送差错报告。
- 基于 IP 数据报首部中的目的 IP 地址在路由表中进行查找。
- 若找到匹配的路由条目,则按该路由条目的指示进行转发,否则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送差错报告。
- 对于给定 CIDR 地址块的 IP, 路由器可以得出目的网络的网络号和地址掩码,从而判断下一跳去哪里
- 路由器检查收到的 IP 数据报是否正确
- 若是广播,可以是本网络广播地址,也可以是受限广播地址 (全 255)
- 路由器不转发广播 IP 数据报,即路由器隔离广播域。
- 如果因特网中数量巨大的路由器收到广播 IP 数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源
解答
H1H2 网络前缀相同,同一个网络
H3H4 网络前缀相同,同一个网络
H1,H4 网络前缀不同,不同网络
设备 1 路由器,其他交换机
又 R 的 IP192.168.1.253/30, 除去网络号和广播仅剩一个地址 192.168.1.254/30, 给 IF1
IF2,IF3 看主机默认网关的 IP 即可得出
主机 H3 发送的是广播,所以 H3,H4 会收到
# IP 数据报的首部格式
- IPv4 数据报的首部格式及其内容是实现 IPv4 协议各种功能的基础。
- 在 TCP/IP 标准中,各种数据格式常常以 32 比特(即 4 字节)为单位来描述。
- 固定部分是指每个 IPv4 数据报都必须要包含的部分。
- 某些 IPv4 数据报的首部,除了包含 20 字节的固定部分,还包含一些可选的字段来增加 IPv4 数据报的功能
- IPv4 数据报首部中的各字段或某些字段的组合,用来表达 IPv4 协议的相关功能。
- 版本
- 长度为 4 个比特,用来表示 IP 协议的版本。
- 通信双方使用的 IP 协议的版本必须一致。目前广泛使用的 IP 协议的版本号为 4(即 IPv4)。
- 首部长度
- 长度为 4 个比特,该字段的取值以 4 字节为单位,用来表示 IPv4 数据报的首部长度。
- 最小取值为二进制的 0101,即十进制的 5,再乘以 4 字节单位,表示 IPv4 数据报首部只有 20 字节固定部分。
- 最大取值为二进制的 1111,即十进制的 15,再乘以 4 字节单位,表示 IPv4 数据报首部包含 20 字节固定部分和最大 40 字节可变部分
- 可选字段
- 长度从 1 字节到 40 字节不等,用来支持排错、测量以及安全措施等功能。
- 虽然可选字段增加了 IPv4 数据报的功能,但这同时也使得 IPv4 数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理 IPv4 数据报的开销。
- 实际上,可选字段很少被使用。
- 填充
- 用来确保 IPv4 数据报的首部长度是 4 字节的整数倍,使用全 0 进行填充。
- 区分服务
- 长度为 8 个比特,用来获得更好的服务。
- 该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
- 只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段。
- 总长度
- 长度为 16 个比特,该字段的取值以字节为单位,用来表示 IPv4 数据报的长度(首部长度 + 数据载荷长度)。
- 最大取值为二进制的 16 个比特 1,即十进制的 65535(很少传输这么长的 IPv4 数据报)。
-
标识,标志,片偏移共同用于 IPv4 数据报分片
- 标识:长度为 16 个比特,属于同一个 IPv4 数据报的各分片数据报应该具有相同的标识。IP 软件会维持一个计数器,每产生一个 IPv4 数据报,计数器值就加 1,并将此值赋给标识字段
- 标志:
- 最低位(More Fragment,MF)
- MF=1 表示本分片后面还有分片
- MF=0 表示本分片后面没有分片
- 中间位(Don’t Fragment,DF)
- DF=1 表示不允许分片
- DF=0 表示允许分片;
- 最高位为保留位,必须设置为 0
- 片偏移
- 长度为 13 个比特,该字段的取值以 8 字节为单位,用来指出分片 IPv4 数据报的数据载荷偏移其在原 IPv4 数据报的位置有多远。(通过调整片长) 必须为整数
假设经过某个网络后再次分片:
- 长度为 13 个比特,该字段的取值以 8 字节为单位,用来指出分片 IPv4 数据报的数据载荷偏移其在原 IPv4 数据报的位置有多远。(通过调整片长) 必须为整数
-
生存时间 (Time To Live,TTL)
- 长度为 8 个比特,最大取值为二进制的 11111111,即十进制的 255。该字段的取值最初以秒为单位。因此,IPv4 数据报的最大生存时间最初为 255 秒。路由器转发 IPv4 数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为 0 就转发,否则就丢弃。
- 生存时间字段后来改为以 “跳数” 为单位,路由器收到待转发的 IPv4 数据报时,将其首部中的该字段的值减 1,若结果不为 0 就转发,否则就丢弃。
- 防止被错误路由的 IPv4 数据报无限制地在因特网中兜圈
-
协议
- 长度为 8 个比特,用来指明 IPv4 数据报的数据载荷是何种协议数据单元 PDU。
- ICMP:1
- IGMP:2
- TCP:6
- UDP:17
- IPv6:41
- OSPF:89
-
首部检验和
- 长度为 16 个比特,用于检测 IPv4 数据报在传输过程中其首部是否出现了差错。
- IPv4 数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间 TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
- 发送端将数据报首部分为 n 个 16 比特字,首部检验字段置 0, 用反码算术运算将所有 16 比特字相加再取反码得到 16 比特检验和,写入首部检验字段
- 接收方数据报首部分为 n 个 16 比特字,首部检验字段不动,用反码算术运算将所有 16 比特字相加再取反码得到 16 比特检验和,结果为 0 则无问题
- 上述检验和的计算方法不仅用于 IP 协议,还用于运输层的用户数据报协议 UDP 和传输控制协议 TCP,常被称为因特网检验和(Internet Checksum)。这种检验和的检错性能虽然不如 CRC,但更易用软件实现
- 两个数进行二进制反码求和的运算规则是从低位到高位逐列进行计算:
- 0 和 0 相加是 0
- 0 和 1 相加是 1
- 1 和 1 相加是 0,但要产生一个进位 1,加到下一列
- 若最高位相加后产生进位,则最后得到的结果要加 1 (加到最后)
- 由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在 IPv6 中,路由器不再计算首部检验和,从而更快转发 IP 数据报。
-
源 IP 地址:32bit
-
目的 IP 地址:32bit
# 静态路由配置
- 静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。
- 人工配置方式简单、开销小、但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。
- 路由器自己的每个接口可以自行得出
- 跨越路由器的链接可以进行人工配置,如一个路由器连接另一个路由器下的子网
- 可以添加默认路由条目,目的地址 0.0.0.0 表示任意网络,/0 是最短的网络前缀,下一跳给出接口
- 路由器在查找转发表转发 IP 数据报时,遵循 “最长前缀匹配” 的原则,因此默认路由条目的匹配优先级最低。
- 特定主机路由:出于某种安全问题的考虑,同时为了使网络运维人员更方便地控制网络和测试网络,特别是在对网络的连接或路由表进行排错时,指明到某一台主机的特定主机路由是十分有用的。
- 例如:特定主机路由条目中的目的网络 192.168.2.1/32,其中 192.168.2.1 是特定主机的 IP 地址,而网络前缀 “/32”(相应地址掩码为 255.255.255.255)是最长的网络前缀。
- 路由器在查找转发表转发 IP 数据报时,遵循 “最长前缀匹配” 的原则,因此特定主机路由条目的匹配优先级最高
- 进行静态路由配置需要认真考虑和谨慎操作,否则可能出现以下问题:
- 路由条目配置错误,甚至导致出现路由环路。
- 聚合路由条目时可能引入不存在的网络。
# 因特网的路由选择协议
静态路由选择:
- 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。
- 静态路由选择简单、开销小,但不能及时适应网络状态(流量、拓扑等)的变化。
- 静态路由选择一般只在小规模网络中采用。
动态路由选择:
- 路由器通过路由选择协议自动获取路由信息。
- 动态路由选择比较复杂、开销比较大,但能较好地适应网络状态的变化
- 动态路由选择适用于大规模网络。
因特网是全球最大的互联网,它所采取的路由选择协议具有以下三个主要特点:
-
自适应:因特网采用动态路由选择,能较好地适应网络状态的变化。
-
分布式:因特网中的各路由器通过相互间的信息交互,共同完成路由信息的获取和更新。
-
分层次:将整个因特网划分为许多较小的自治系统(Autonomous System,AS)。在自治系统内部和外部采用不同类别的路由选择协议,分别进行路由选择
-
外部网关协议 EGP 和内部网关协议 IGP 只是路由选择协议的分类名称,而不是具体的路由选择协议。
-
外部网关协议和内部网关协议名称中使用的是 “网关” 这个名词,是因为在因特网早期的 RFC 文档中,没有使用 “路由器” 而使用的是 “网关” 这一名词。
# 路由信息协议 RIP
- 路由信息协议(Routing Information Protocol,RIP)是内部网关协议中最先得到广泛使用的协议之一,其相关标准文档为 [RFC 1058]。
- RIP 要求自治系统 AS 内的每一个路由器,都要维护从它自己到 AS 内其他每一个网络的距离记录。这是一组距离,称为距离向量(Distance-Vector,D-V)。
- RIP 使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离。
- RIP 将路由器到直连网络的距离定义为 1。
- RIP 将路由器到非直连网络的距离定义为所经过的路由器数加 1。
- RIP 允许一条路径最多只能包含 15 个路由器,距离等于 16 时相当于不可达。因此 RIP 只适用于小型互联网
思科路由器将路由到直连网络距离定义为 0
- RIP 认为好的路由就是 “距离短” 的路由,也就是所通过路由器数量最少的路由,而不是带宽
- 当到达同一目的网络有多条 RIP 距离相等的路由时,可以进行等价负载均衡,也就是将通信量均衡地分布到多条等价的路径上。
- RIP 具有以下三个重要特点:
- 和谁交换信息:仅和相邻路由器交换信息
- 交换什么信息:路由器自己的路由表。即本路由器到所在自治系统 AS 中各网络的最短 RIP 距离,以及到各网络应经过的下一跳路由器
- 何时交换信息:(例如,每个约 30 秒), 为了加快 RIP 的收敛速度,当网络拓扑发生变化时,路由器要及时向相邻路由器通告拓扑变化后的路由信息,这称为触发更新。
RIP 的基本工作过程:
- 路由器刚开始工作时,只知道自己到直连网络的 RIP 距离为 1。
- 每个路由器仅和相邻路由器周期性地交换并更新路由信息。
- 若干次交换和更新后,每个路由器都知道到达本自治系统 AS 内各网络的最短距离和下一跳路由器称为收敛。
# RIP 的距离向量算法
-
到达目的网络,相同的下一跳,最新消息,要更新
-
发现了新的网络,添加
-
到达目的网络,不同的下一跳,新路由优势,要更新
-
到达目的网络,不同的下一跳,RIP 距离相等,可以等价负载均衡,添加
-
到达目的网络,不同的下一跳,新路由劣势,不更新
-
除了上述 RIP 路由条目更新规则,在 RIP 的距离向量算法中还包含以下一些时间参数:
- 路由器每隔大约 30 秒向其所有相邻路由器发送路由更新报文。
- 若 180 秒(默认)没有收到某条路由条目的更新报文,则把该路由条目标记为无效(即把 RIP 距离设置为 16,表示不可达),若再过一段时间(如 120 秒),还没有收到该路由条目的更新报文,则将该路由条目从路由表中删除。
-
某自治系统内采用 RIP 协议,若该自治系统内的路由器 R1 收到其邻居路由器 R2 的距离矢量,距离矢量中包含信息 <net1,16>,则能得出的结论是
-
某网络中的所有路由器均采用距离向量
路由算法计算路由。若路由器 E 与邻居路由器 A、B、C 和 D 之间的直接链路距离分别是 8,10,12 和 6,且 E 收到邻居路由器的距离向量如下表所示,则路由器 E 更新后的到达目的网络 Net1~Net4 的距离分别是
- RIP 存在的问题:坏消息传递的慢
- 当 B 能通过 A 到达 N1 时,A 和 N1 连接断开,若 B 的 RIP 更新报文先到,A 会误认为可以连接到 N1, 产生谣言
- 当 B 能通过 A 到达 N1 时,A 和 N1 连接断开,若 B 的 RIP 更新报文先到,A 会误认为可以连接到 N1, 产生谣言
- “坏消息传播得慢” 的问题又被称为路由环路或 RIP 距离无穷计数问题。这是距离向量算法的一个固有问题。可以采取以下多种措施减少出现该问题的概率或减小该问题带来的危害:
- 限制最大 RIP 距离为 15(16 表示不可达)
- 当路由表发生变化时就立即发送路由更新报文(即 “触发更新”),而不仅是周期性发送
- 让路由器记录收到某个特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即 “水平分割”)。
- 使用上述措施仍无法彻底解决问题。因为在距离向量算法中,每个路由器都缺少到目的网络整个路径的完整信息,无法判断所选的路由是否出现了环路
# RIP 版本和相关报文的封装
- 现在较新的 RIP 版本是 1998 年 11 月公布的 RIP2 [RFC 2453],已经成为因特网标准协议。与 RIP1 相比,RIP2 可以支持变长子网掩码和 CIDR。另外,RIP2 还提供简单的鉴别过程并支持多播。
- RIP 相关报文使用运输层的用户数据报协议 UDP 进行封装,使用的 UDP 端口号为 520。
- 从 RIP 报文封装的角度看,RIP 属于 TCP/IP 体系结构的应用层。
- 但 RIP 的核心功能是路由选择,这属于 TCP/IP 体系结构的网际层。
# RIP 的优缺点
优点:
- 实现简单,路由器开销小
- 如果一个路由器发现了 RIP 距离更短的路由,那么这种更新信息就传播得很快,即 “好消息传播得快”。
缺点:
- RIP 限制了最大 RIP 距离为 15,这就限制了使用 RIP 的自治系统 AS 的规模。
- 相邻路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也随之增大。
- “坏消息传播得慢”,使更新过程的收敛时间过长。因此,对于规模较大的自治系统 AS,应当使用 OSPF 协议。
# 开放最短路径优先协议 OSPF
- 开放最短路径优先(Open Shortest Path First,OSPF)协议是为了克服路由信息协议 RIP 的缺点在 1989 年开发出来的。
- “开放” 表明 OSPF 协议不是受某一厂商控制,而是公开发表的。
- “最短路径优先” 是因为使用了 Dijkstra 提出的最短路径算法 (Shortest Path First,SPF)
“开放最短路径优先” 只是一个路由选择协议的名称,但这并不表示其他的路由选择协议不是 “最短路径优先”。实际上,用于自治系统 AS 内部的各种路由选择协议(例如 RIP),都要寻找一条 “最短” 的路径。
- OSPF 是基于链路状态的,而不像 RIP 是基于距离向量的。
- OSPF 基于链路状态并采用最短路径算法计算路由,从算法上保证了不会产生路由环路。
- OSPF 不限制网络规模,更新效率高,收敛速度快。
# OSPF 的基本工作过程
- 链路状态:
- 链路状态(Link State,LS)是指本路由器都和哪些路由器相邻,以及相应链路的 “代价(cost)”。
- “代价” 用来表示费用、距离、时延和带宽等,这些都由网络管理人员来决定。
- 思科路由器中 OSPF 协议计算代价的方法是:100Mb/s 除以链路带宽计算结果小于 1 的值仍记为 1,大于 1 且有小数的,舍去小数
- OSPF 相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。
- 问候(Hello)分组封装在 IP 数据报中,发往组播地址 224.0.0.5。IP 数据报首部中的协议号字段的取值为 89,表明 IP 数据报的数据载荷为 OSPF 分组。
OSPF 分组直接使用网际层的 IP 数据报进行封装,而不像 RIP 报文需要使用运输层用户数据报协议 UDP 封装。从数据包按网络体系结构逐层封装的角度看,OSPF 属于网际层协议,而 RIP 属于应用层协议(但其核心功能是路由选择,属于网际层)。
- 问候(Hello)分组的发送周期为 10 秒。
- 若 40 秒未收到来自邻居路由器的问候(Hello)分组,则认为邻居路由器不可达。
- 每个路由器都会建立一张邻居表
链路状态通告
- 使用 OSPF 的每个路由器都会产生链路状态通告(Link State Advertisement,LSA)
- LSA 中包含以下两类链路状态信息:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
链路状态更新分组
- 链路状态通告 LSA 被封装在链路状态更新(Link State Update,LSU)分组中,采用可靠的洪泛法(Flooding)进行发送。
- 洪泛法的要点是路由器向自己所有的邻居路由器发送链路状态更新分组,收到该分组的各路由器又将该分组转发给自己所有的邻居路由器(但其上游路由器除外),以此类推
- 可靠是指收到链路状态更新分组后要发送确认,收到重复的更新分组无需再次转发,但要发送一次确认。
- 使用 OSPF 的每一个路由器都有一个链路状态数据库(Link State Database,LSDB),用于存储链路状态通告 LSA
- 通过各路由器洪泛发送封装有各自链路状态通告 LSA 的链路状态更新分组 LSU,各路由器的链路状态数据库 LSDB 最终将达到一致。
- 使用 OSPF 的各路由器,基于链路状态数据库 LSDB 进行最短路径优先计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
# OSPF 的五种分组类型
- 问候(Hello): 用来发现和维护邻居路由器的可达性。
- 数据库描述 (Database Description): 用来向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
- 链路状态请求 (Link State Reques): 用来向邻居路由器请求发送某些链路状态项目的详细信息。
- 链路状态更新(Link State Update): 路由器使用链路状态更新分组将其链路状态信息进行洪泛发送,即用洪泛法对整个系统更新链路状态。
- 链路状态确认 (Link State Acknowledgem): 对链路状态更新分组的确认分组。
# 多点接入网络中的 OSPF
# OSPF 划分区域
- 为了使 OSPF 协议能够用于规模很大的网络,OSPF 把一个自治系统 AS 再划分为若干个更小的范围,称为区域(area)。
- 划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域,而不是整个自治系统 AS,这样就减少了整个网络上的通信量
- 自治系统边界路由器(AS Border Router,ASBR): 主干区域内与其他自治系统中交换信息的路由器
- 主干路由器(Backbone Router,BBR): 主干区域内的路由器,显然包含 ASBR
- 区域内路由器(Internal Router,IR): 在非主干区域内的路由
- 区域边界路由器(Area Border Router,ABR): 连接区域和主干区域的路由
-
网络拓扑如左图所示,假设各路由器使用 OSPF 协议进行路由选择且已收敛,各链路的度量
已标注在其旁边,主机 A 给 B 发送一个 IP 数据报,为了让 IP 数据报能够到达主机 B,其首部中的 TTL 字段的取值至少应设置为 -
网络拓扑如下右图所示,假设各路由器使用 RIP 协议进行路由选择且已收敛,主机 A 给 B 发送一个 IP 数据报,其首部中的 TTL 字段的值设置为 32,则当主机 B 正确接收到该 IP 数据报时,其首部中的 TTL 字段的值为
# 边界网关协议
- RIP 和 OSPF 都是自治系统内部网关协议
- 自治系统之间的网关协议为外部网关协议,如 BGP
# BGP 的相关基本概念
- 边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议 EGP 这个类别,用于自治系统 AS 之间的路由选择协议。
- 由于在不同 AS 内度量路由的 “代价”(距离、带宽、费用等)可能不同,因此对于 AS 之间的路由选择,使用统一的 “代价” 作为度量来寻找最佳路由是不行的。
- AS 之间的路由选择还必须考虑相关策略(政治、经济、安全等)。
- BGP 只能是力求寻找一条能够到达目的网络且比较好的路由(即不能兜圈子),而并非要寻找一条最佳路由
- 在配置 BGP 时,每个 AS 的管理员要选择至少一个路由器作为该 AS 的 “BGP 发言人”。
- 使用 TCP 连接交换路由信息的两个 BGP 发言人,彼此称为对方的邻站(neighbor)或对等站(peer)。
- BGP 发言人除了运行 BGP 协议外,还必须运行自己所在 AS 所使用的内部网关协议 IGP,例如 RIP 或 OSPF。
- 一般来说,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言人往往就是 BGP 边界路由器。
- BGP 发言人交换网络可达性的信息,也就是要到达某个网络所要经过的一系列自治系统。
- BGP 发言人交换网络可达性的信息,也就是要到达某个网络所要经过的一系列自治系统。
- 当 BGP 发言人相互交换了网络可达性的信息后,各 BGP 发言人就根据所采用的策略,从收到的路由信息中找出到达各自治系统的较好的路由,也就是构造出树形结构且不存在环路的自治系统连通图。
# BGP-4 的四种报文
- BGP-4 是目前使用得最多的版本,在 [RFC 4271] 中规定了 BGP-4 的四种报文:
- 打开 OPEN: 用来与相邻的另一个 BGP 发言人建立关系,使通信初始化。
- 更新 UPDATE: 用来通告某一条路由的信息,以及列出要撤销的多条路由。
- 保活 KEEPALIVE: 用来周期性地证实邻站的连通性
- 通知 NOTIFICATION: 用来发送检测到的差错
# 路由器的基本工作原理
- 路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组。
- 若是路由报文,交给路由选择处理机
- 路由表一般仅包含从目的网络到下一跳的映射
- 路由表需要对网络拓扑变化的计算最优化
- 转发表是从路由表得出的
- 转发表的结构应当使查找过程最优化
- 实现交换结构的三种基本方式是:通过存储器、通过总线以及通过互连网络。这三种交换结构可实现的路由器转发速率依次提高
# 网际控制报文协议
# 网际控制报文协议 ICMP 概述
- 为了更有效地转发 IP 数据报以及提高 IP 数据报交付成功的机会,TCP/IP 体系结构的网际层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)[RFC 792]。
- 主机或路由器使用 ICMP 来发送差错报告报文和询问报文。
- ICMP 报文被封装在 IP 数据报中发送
# ICMP 报文种类
ICMP 报文分为以下两大类:
- 差错报告报文:用来向主机或路由器告差错情况。
- 终点不可达:当路由器或主机不能交付 IP 数据报时,就向源点发送终点不可达报文。具体可再根据 ICMP 的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等 13 种
- 源点抑制:当路由器或主机由于拥塞而丢弃 IP 数据报时,就向发送该 IP 数据报的源点发送源点抑制报文,使源点知道应当把 IP 数据报的发送速率放慢
- 时间超过(超时): 当路由器收到一个目的 IP 地址不是自己的 IP 数据报时,会将其首部中生存时间 TTL 字段的值减 1。若结果不为 0,则路由器将该数据报转发出去;若结果为 0,路由器不但要丢弃该数据报,还要向发送该 IP 数据报的源点发送时间超过(超时)报文。另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文
- 参数问题:当路由器或目的主机收到 IP 数据报后,根据其首部中的检验和字段的值发现首部在传送过程中出现了误码,就丢弃该数据报,并向发送该数据报的源点发送参数问题报文
- 改变路由(重定向): 路由器把改变路由报文发送给主机,让主机知道下次应将 IP 数据报发送给另外的路由器,这样可以通过更好的路由到达目的主机。
- 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
- 对第一个分片的 IP 数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
- 对具有多播地址的 IP 数据报都不发送 ICMP 差错报告报文。
- 对具有特殊地址(例如 127.0.0.0 或 0.0.0.0)的 IP 数据报不发送 ICMP 差错报告报文。
- 若路由器 R 因为拥塞丢弃 IP 分组,则此时 R 可向发出该 IP 分组的源主机发送的 ICMP 报文类型是
- 询问报文:用来向主机或路由器询问况
- 回送请求和回答:由主机或路由器向一个特定的目的主机或路由器发出。收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送 ICMP 回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
- 时间戳请求和回答:用来请求某个主机或路由器回答当前的日期和时间。在 ICMP 时间戳回答报文中有一个 32 比特的字段,其中写入的整数代表从 1900 年 1 月 1 日起到当前时刻一共有多少秒。这种询问报文用来进行时钟同步和测量时间
# ICMP 的典型应用
- 分组网间探测(Packet InterNet Groper,PING)
- 跟踪路由(traceroute)
# 分组网间探测
- 分组网间探测 PING 用来测试主机或路由器之间的连通性。
- PING 是 TCP/IP 体系结构的应用层直接使用网际层 ICMP 的一个例子,它并不使用运输层的 TCP 或 UDP。
- PING 应用所使用的 ICMP 报文类型为回送请求和回答
# 跟踪路由
- 跟踪路由应用 traceroute,用于探测 IP 数据报从源主机到达目的主机要经过哪些路由器。
- 在不同操作系统中,traceroute 应用的命令和实现机制有所不同:
- 在 UNIX 版本中,具体命令为 “traceroute”,其在运输层使用 UDP 协议,在网络层使用 ICMP 报文类型只有差错报告报文。
- 在 Windows 版本中,具体命令为 “tracert”,其应用层直接使用网际层的 ICMP 协议,所使用的 ICMP 报文类型有回送请求和回答报文以及差错报告报文。
- windows 中,发送 TTL=1 的 ICMP 回送请求,第一个路由器 TTL-1 后丢弃,发回 ICMP 差错报告报文 (超时)
- 再发 TTL=2,TTL=3…
# 虚拟专用网络和网络地址转换
# 虚拟专用网
-
虚拟专用网 (Virtual Private Network,VPN): 利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的网络又称为虚拟专用网。
-
出于安全考虑,专用网内的各主机并不应该直接 “暴露” 于公用的因特网上。因此,给专用网内各主机配置的 IP 地址应使各主机在专用网内可以相互通信,而不能直接与公用的因特网通信
-
给专用网内各主机配置的 IP 地址应该是该专用网所在机构可以自行分配的 IP 地址,这类 IP 地址仅在机构内部有效,称为专用地址(Private Address),不需要向因特网的管理机构申请。
-
[RFC 1918] 规定了以下三个 CIDR 地址块中的地址作为专用地址:
- 10.0.0.0~10.255.255.255(CIDR 地址块 10/8)
- 172.16.0.0~172.31.255.255(CIDR 地址块 172.16/12)
- 192.168.0.0~192.168.255.255(CIDR 地址块 192.168/16)
-
很显然,全世界可能有很多不同机构的专用网具有相同的专用 IP 地址,但这并不会引起麻烦,因为这些专用地址仅在机构内部使用
-
在因特网中的所有路由器,对目的地址是专用地址的 IP 数据报一律不进行转发,这需要由因特网服务提供者 ISP 对其拥有的因特网路由器进行设置来实现。
-
路由器会对内部 IP 数据报进行加密,转发到目的路由器中再解密
-
虽然两个专用网内的主机间发送的数据报是通过公用的因特网传送的,但从效果上就好像是本机构的专用网上传送一样,这也是虚拟专用网中 “虚拟” 的含义。
-
IP 数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,路由器 R1 和 R2 之间好像是一条直通的点对点链路,因此也被称为 IP 隧道技术。
- 同一机构内不同部门的内部网络所构成 VPN,又称为内联网 VPN。
- 一个机构的虚拟专用网 VPN 需要某些外部机构(通常是合作伙伴)参加进来,这样的 VPN 就称为外联网 VPN。
- 在外地工作的员工需要访问公司内部的专用网时,只要在任何地点接入因特网,运行驻留在员工 PC 中的 VPN 软件,在员工的 PC 和公司的主机之间建立 VPN 隧道,就可以访问专用网中的资源,这种虚拟专用网又称为远程接入 VPN。
# 网络地址转换
- 网络地址转换(Network Address Translation,NAT)技术于 1994 年被提出,用来缓解 IPv4 地址空间即将耗尽的问题。
- NAT 能使大量使用内部专用地址的专用网络用户共享少量外部全球地址来访问因特网上的主机和资源。
- 这种方法需要在专用网络连接到因特网的路由器上安装 NAT 软件。装有 NAT 软件的路由器称为 NAT 路由器,它至少要有一个有效的外部全球地址 IPG。这样,所有使用内部专用地址的主机在和外部因特网通信时,都要在 NAT 路由器上将其内部专用地址转换成 IPG
-
由于目前绝大多数基于 TCP/IP 协议栈的网络应用,都使用运输层的传输控制协议 TCP 或用户数据报协议 UDP,为了更加有效地利用 NAT 路由器中的全球 IP 地址,现在常将 NAT 转换和运输层端口号结合使用。
- 这样就可以使内部专用网中使用专用地址的大量主机,共用 NAT 路由器上的 1 个全球 IP 地址,因而可以同时与因特网中的不同主机进行通信。
-
将 NAT 和运输层端口号结合使用,称为网络地址与端口号转换(Network Address and Port Translation,NAPT)
- 现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、台式电脑、物联网设备等)接入因特网,这种路由器实际上就是一个 NAPT 路由器,但往往并不运行路由选择协议。
- 现在很多家用路由器将家中各种智能设备(手机、平板、笔记本电脑、台式电脑、物联网设备等)接入因特网,这种路由器实际上就是一个 NAPT 路由器,但往往并不运行路由选择协议。
-
尽管 NAT(和 NAPT)的出现在很大程度上缓解了 IPv4 地址资源紧张的局面,但 NAT(和 NAPT)对网络应用并不完全透明,会对某些网络应用产生影响。
-
NAT(和 NAPT)的一个重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网中的服务器。
-
对于目前 P2P 这类需要外网主机主动与内网主机进行通信的网络应用,在通过 NAT 时会遇到问题,需要网络应用自身使用一些特殊的 NAT 穿透技术来解决
# IP 多播
# IP 多播技术的相关基本概念
- 多播(Multicast,也称为组播)是一种实现 “一对多” 通信的技术,与传统单播 “一对一” 通信相比,多播可以极大地节省网络资源。
- 在因特网上进行的多播,称为 IP 多播
- 路由器连接有多个路由器时,会复制节目副本发送给每个路由器
- 路由器下的主机们是一个局域网,局域网本身也支持硬件多播
- 当多播组的成员数量很大时,采用多播方式可以显著地减少网络中各种资源的消耗
# IP 多播地址和多播组
- 在 IPv4 中,D 类地址被作为多播地址。
- 多播地址只能用作目的地址,而不能用作源地址。
- 224.0.0.0~239.255.255.255,228 个
- 用每一个 D 类地址来标识一个多播组,使用同一个 IP 多播地址接收 IP 多播数据报的所有主机就构成了一个多播组
- 用每一个 D 类地址来标识一个多播组,使用同一个 IP 多播地址接收 IP 多播数据报的所有主机就构成了一个多播组。
- 每个多播组的成员是可以随时变动的,一台主机可以随时加入或离开多播组。
- 多播组成员的数量和所在的地理位置也不受限制,一台主机可以属于几个多播组
- 非多播组成员也可以向多播组发送 IP 多播数据报。
- 与 IP 数据报相同,IP 多播数据报也是 “尽最大努力交付”,不保证一定能够交付给多播组内的所有成员。
- IPv4 多播地址又可分为预留的多播地址(永久多播地址)、全球范围可用的多播地址以及本地管理的多播地址 [RFC 3330]
- IP 多播可以分为以下两种:
- 只在本局域网上进行的硬件多播。
- 在因特网上进行的多播。
- 目前大部分主机都是通过局域网接入因特网的。因此,在因特网上进行多播的最后阶段,还是要把 IP 多播数据报在局域网上用硬件多播交付给多播组的所有成员
# 在局域网上进行硬件多播
- 由于 MAC 地址(也称为硬件地址)有多播 MAC 地址这种类型,因此只要把 IPv4 多播地址映射成多播 MAC 地址,即可将 IP 多播数据报封装在局域网的 MAC 帧中,而 MAC 帧首部中的目的 MAC 地址字段的值,就设置为由 IPv4 多播地址映射成的多播 MAC 地址。这样,可以很方便地利用硬件多播来实现局域网内的 IP 多播。
- 当给某个多播组的成员主机配置其所属多播组的 IP 多播地址时,系统就会根据映射规则从该 IP 多播地址生成相应的局域网多播 MAC 地址
- 因特网号码指派管理局 IANA,将自己从 IEEE 注册管理机构申请到的以太网 MAC 地址块中从 01-00-5E-00-00-00 到 01-00-5E-7F-FF-FF 的多播 MAC 地址,用于映射 IPv4 多播地址。
- 这些多播 MAC 地址的左起前 25 个比特都是相同的,剩余 23 个比特可以任意变化,因此共有 223 个
# 在因特网上进行 IP 多播需要的两种协议
- 要在因特网上进行 IP 多播,就必须要考虑 IP 多播数据报经过多个多播路由器进行转发的问题。
- 多播路由器必须根据 IP 多播数据报首部中的 IP 多播地址,将其转发到有该多播组成员的局域网。
- 网际组管理协议(Internet Group Management Protocol,IGMP)是 TCP/IP 体系结构网际层中的协议,其作用是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(实际上是主机中的某个进程)加入或退出了某个多播组。
- IGMP 仅在本网络有效,使用 IGMP 并不能知道多播组所包含的成员数量,也不能知道多播组的成员都分布在哪些网络中
仅使用 IGMP 并不能在因特网上进行 IP 多播。连接在局域网上的多播路由器还必须和因特网上的其他多播路由器协同工作,以便把 IP 多播数据报用最小的代价传送给所有的多播组成员,这就需要使用多播路由选择协议。
- 多播路由选择协议的主要任务是:在多播路由器之间为每个多播组建立一个多播转发树。
- 多播转发树连接多播源和所有拥有该多播组成员的路由器。
- IP 多播数据报只要沿着多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器。
- 之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播,将 IP 多播数据报发送给该多播组的所有成员。
- 针对不同的多播组需要维护不同的多播转发树,而且必须动态地适应多播组成员的变化,但此时网络拓扑并不一定发生变化,因此多播路由选择协议要比单播路由选择协议(例如 RIP、OSPF 等)复杂得多。
- 即使某个主机不是任何多播组的成员,它也可以向任何多播组发送多播数据报。
- 为了覆盖多播组的所有成员,多播转发树可能要经过一些没有多播组成员的路由器(例如下图中的 R2)。
# 网际组管理协议
# 网际组管理协议 IGMP 的三种报文类型
# 网际组管理协议 IGMP 的基本工作原理
此例子中 AB 在 IP 和 MAC 层面属于同一个网络,显然是在同一局域网,当 AB 都想加入同一个多播组时,有一个发即可
IGMP 成员查询报文中内容为 0.0.0.0 代表全部多播地址
IP 多播数据报的目的地址 224.0.0.1: 本网络中所有参加多播的主机和路由器都会接受该数据报
每个多播组只要有一个成员响应即可,组成员接收到其他成员报文则取消响应
退出多播组后,路由器长时间收不到该多播组成员的响应,则将其从多播组列表中删除
-
同一网络中的多播路由器可能不止一个,但 没有必要每个多播路由器都周期性地发送
IGMP 成员查询报文。 -
只要在这些多播路由器中选择一个作为查询路由器,由查询路由器发送 IGMP 成员查询报
文,而其他的多播路由器仅被动接收响应并更新自己的多播组列表即可。 -
选择查询路由器的方法:
- 每个多播路由器若监听到源 IP 地址比自己的 IP 地址小的 IGMP 成员查询报文则退出选举。
- 最后,网络中只有 IP 地址最小的多播路由器成为查询路由器。
-
IGMPv2 在 IGMPv1 的基础上增加了一个可选项:当主机要退出某个多播组时,可主动发送一个离开组报文而不必等待多播路由器的查询。这样可使多播路由器能够更快地发现某个组有成员离开。
注意!mac 不匹配依然接受了
# 多播路由选择协议
- 多播路由选择协议的主要任务是:在多播路由器之间为每个多播组建立一个多播转发树。
- 多播转发树连接多播源和所拥有该多播组成员的路由器。
- 目前有以下两种方法来构建多播转发树:
- 基于源树(Source-Base Tree)多播路由选择
- 组共享树(Group-Shared Tree)多播路由选择
# 基于源树(Source-Base Tree)多播路由选择
- 基于源树的多播路由选择的最典型算法是反向路径多播(Reverse Path Multicasting,RPM)算法。
- RPM 算法包含以下两个步骤:
- 利用反向路径广播(Reverse Path Broadcasting,RPB)算法建立一个广播转发树。
- 利用剪枝(Pruning)算法,剪除广播转发树中的下游非成员路由器,获得一个多播转发树。
- 要建立广播转发树,可以使用洪泛(Flooding)法。(有环路会兜圈)
- 利用反向路径广播 RPB 算法生成的广播转发树,不会存在环路,因此可以避免广播分组在环路中兜圈。
- RPB 算法的要点是:每一台路由器在收到一个广播分组时,先检查该广播分组是否是从源点经最短路径传送来的。
- 若是,本路由器就从自己除刚才接收该广播分组的接口的所有其他接口转发该广播分组。
- 否则,丢弃该广播分组。
- 如果本路由器有好几个邻居路由器都处在到源点的最短路径上,也就是存在好几条同样长度的最短路径,那么只能选取一条最短路径。选取的规则是这几条最短路径中的邻居路由器的 IP 地址最小的那条最短路径。
- RPB 中 “反向路径” 的意思是:在计算最短路径时把源点当作终点。
- 没有多播组成员(使用 IGMP 来探测)、并且也没有下游路由器的叶节点应从广播转发树上剪除就可实现多播转发树,向上游发剪枝报文
# 组共享树(Group-Shared Tree)多播路由选择
- 组共享树多播路由选择采用基于核心的分布式生成树算法来建立共享树。
- 该方法在每个多播组中指定一个核心(core)路由器,以该路由器为根,建立一棵连接多播组的所有成员路由器的生成树,作为多播转发树。
- 每个多播组中除了核心路由器,其他所有成员路由器都会向自己多播组中的核心路由器单播加入报文。
- 加入报文通过单播朝着核心路由器转发,直到它到达已经属于该多播生成树的某个节点或者直接到达该核心路由器。
- 加入报文所经过的路径,就确定了一条从单播该报文的边缘节点到核心路由器之间的分支,而这个新分支就被嫁接到现有的多播转发树上
- 若有路由器要进行多播,需要将多播分组封装成单播发给核心路由,交给核心路由进行洪泛转发
- 目前还没有在整个因特网范围使用的多播路由选择协议。下面是一些建议使用的多播路由选择协议:
- 距离向量多播路由选择协议(Distance Vector Multicast Routing Protocol,DVMRP)[RFC 1075]。
- 开放最短路径优先的多播扩展(Multicast Extensions to OSPF,MOSPF)[RFC 1585]。
- 协议无关多播 - 稀疏方式(Protocol Independent Multicast-Sparse Mode,PIM-SM)[RFC 2362]。
- 协议无关多播 - 密集方式(Protocol Independent Multicast-Dense Mode,PIM-DM)[RFC 3973]。
- 基于核心的转发树(Core Based Tree,CBT)[RFC 2189,RFC 2201]。
- 尽管因特网工程任务组 IETF 努力推动着因特网上的全球多播主干网(Multicast Backbone On the Internet,MBONE)的建设,但至今在因特网上的 IP 多播还没有得到大规模的应用。
- 主要原因是:改变一个已成功运行且广泛部署的网络层协议是一件及其困难的事情。
- 目前 IP 多播主要应用在一些局部的园区网络、专用网络或者虚拟专用网中。
- 另外,P2P 技术的广泛应用推动了应用层多播技术的发展,许多视频流公司和内容分发公司,通过构建自己的应用层多播覆盖网络来分发它们的内容。但上述多播路由选择协议的算法思想在应用层多播中依然适用。
# 移动 IP 技术
# 移动性对因特网应用的影响
- 快速移动导致主机切换不同网络不停地改变 IP
# 移动 IP 技术的相关基本概念
-
移动 IP(Mobile IP)是因特网工程任务组 IETF 开发的一种技术 [RFC 3344],该技术使得移动主机在各网络之间漫游时,仍然能够保持其原来的 IP 地址不变。
-
移动 IP 技术还为因特网中的非移动主机提供了相应机制,使得它们能够将 IP 数据报正确发送到移动主机
-
归属网络:每个移动主机都有一个默认连接的网络或初始申请接入的网络,称为归属网络(Home Network)。
-
归属地址:移动主机在归属网络中的 IP 地址在其整个移动通信过程中是始终不变的,因此称为永久地址(Permanent Address)或归属地址(Home Address)。
-
归属代理:在归属网络中,代表移动主机执行移动管理功能的实体称为归属代理(HomeAgent)。归属代理通常就是连接在归属网络上的路由器,然而它作为代理的特定功能则是在网络层完成的。
-
外地网络:移动主机当前漫游所在的网络称为外地网络(Foreign Network)或被访网络(VisitedNetwork)。
-
外地代理:在外地网络中,帮助移动主机执行移动管理功能的实体称为外地代理(ForeignAgent)。
-
转交地址:外地代理通常就是连接在外地网络上的路由器。外地代理会为移动主机提供一个临时使用的属于外地网络的转交地址(Care-of Address)。
# 移动 IP 技术的基本工作原理
- 当移动主机不在归属网络时,归属代理会以自己的 MAC 地址应答所有对该移动主机的 ARP 请求,即归属代理采用 ARP 代理技术。
- 为了使归属网络中其他各主机和路由器能够尽快更新各自的 ARP 高速缓存,归属代理还会主动发送 ARP 广播,并声称自己是该移动主机。这样,所有发送给该移动主机的 IP 数据报都会发送给归属代理
- 当外地代理和移动主机不是同一台设备时,转交地址实际上是外地代理的地址而不是移动主机的地址,转交地址既不会作为移动主机发送 IP 数据报的源地址,也不会作为移动主机所接收的 IP 数据报的目的地址。
- 转交地址仅仅是归属代理到外地代理的 IP 隧道的出口地址。
- 所有使用同一外地代理的移动主机都可以共享同一个转交地址。
- 当外地代理从 IP 隧道中收到并解封出原 IP 数据报时,会在自己的代理注册表中查找移动主机的永久地址所对应的 MAC 地址,并将该数据报封装到目的地址为该 MAC 地址的帧中发送给移动主机。
- 这与 IP 数据报的正常转发流程是不同的,否则会造成该数据报又被发回移动主机的归属网络。
移动主机向固定主机发送 IP 数据报:
- 移动主机向固定主机发送 IP 数据报,IP 数据报被移动主机 A 按照正常的发送流程发送出去即可。由于 IP 路由器并不关心 IP 数据报的源地址,因此该 IP 数据报被直接路由到固定主机 B,而无须再通过归属代理进行转发。
- 为此,移动主机可以将外地代理作为自己的默认路由器,也可以通过代理发现协议从外地代理获取外地网络中其他路由器的地址,并将其设置为自己的默认路由器。
同址转交地址方式:
- 外地代理也可以直接运行在移动主机上
- 移动主机需要运行额外的外地代理软件。外地网络也需要提供相应机制,使移动主机能够自动获取一个外地网络中的地址作为自己的 IP 地址和外地代理的地址,被称为同址转交地址(Co-Located Care-of Address)。
三角形路由问题:
- 即使在固定主机与移动主机之间存在一条更有效的路径,发往移动主机的 IP 数据报也要先发送给归属代理,造成 IP 数据报转发的低效。
- 解决三角形路由问题的一种方法:
- 给固定主机配置一个通信代理,固定主机发送给移动主机的 IP 数据报,都要通过该通信代理转发。
- 通信代理先从归属代理获取移动主机的转交地址,之后所有发送给移动主机的 IP 数据报,都利用转交地址直接通过 IP 隧道发送给移动主机的外地代理,而无须再通过移动主机的归属代理进行转发。
- 这种方法以增加复杂性为代价,并要求固定主机也要配置通信代理,也就是对固定主机不再透明。
# 下一代网际协议 IPv6
- 如果没有网络地址转换 NAT 技术的广泛应用,IPv4 早已停止发展。
- 然而,NAT 仅仅是为了延长 IPv4 使用寿命而采取的权宜之计,解决 IPv4 地址耗尽的根本措施就是采用具有更大地址空间(IP 地址的长度为 128 比特)的新版本 IP,即 IPv6。
- 因特网工程任务组 IETF 早在 1992 年 6 月就提出要制定下一代的 IP,即 IPng(IP Next Generation)。IPng 现在正式称为 IPv6。
- 直接将因特网的核心协议从 IPv4 更换成 IPv6 是不可行的。
- 世界上许多团体都从因特网的发展中看到了机遇,因此在 IPv6 标准的制定过程中出于自身经济利益而产生了激烈的争论。
- 到目前为止,IPv6 还只是草案标准阶段 [RFC 2460,RFC 4862,RFC 4443]
- 尽早开始过渡到 IPv6 有以下好处:
- 有更多时间来平滑过渡
- 有更多时间来培养 IPv6 的专门人才
- 及早提供 IPv6 服务比较便宜
# IPv6 数据报的首部
- 所有的扩展首部并不属于 IPv6 数据报的首部,它们与其后面的数据部分合起来构成有效载荷(payload,也称为净负荷)
- IPv6 将 IPv4 数据报首部中不必要的功能取消了,这使得 IPv6 数据报基本首部中的字段数量减少到只有 8 个。
- 但由于 IPv6 地址的长度扩展到了 128 比特,因此使得 IPv6 数据报基本首部的长度反而增大到了 40 字节,比 IPv4 数据报首部固定部分的长度(20 字节)增大了 20 字节
- IPv6 取消了首部长度字段,因为 IPv6 数据报的首部长度是固定的 40 字节
- 取消了区分服务(服务类型)字段,因为 IPv6 数据报首部中的通信量类和流标号字段实现了区分服务字段的功能
- 取消了总长度字段,改用有效载荷长度字段。这是因为 IPv6 数据报的首部长度是固定的 40 字节,只有其后面的有效载荷长度是可变的。
- 取消了标识、标志和片偏移字段,因为这些功能已包含在 IPv6 数据报的分片扩展首部中。
- 把生存时间 TTL 字段改称为跳数限制字段,这样名称与作用更加一致。
- 取消了协议字段,改用下一个首部字段。
- 取消了首部检验和字段,这样可以加快路由器处理 IPv6 数据报的速度
- 取消了选项字段,改用扩展首部来实现选项功能。
- 版本字段:长度为 4 比特,用来表示 IP 协议的版本。对于 IPv6 该字段的值是 6。
- 通信量类字段:长度为 8 比特,该字段用来区分不同的 IPv6 数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。
- 流标号字段:长度为 20 比特。
- IPv6 提出了流的抽象概念。
- “流” 就是因特网上从特定源点到特定终点(单播或多播)的一系列 IPv6 数据报(如实时音视频数据的传送),而在这个 “流” 所经过的路径上的所有路由器都保证指明的服务质量。
- 所有属于同一个流的 IPv6 数据报都具有同样的流标号。换句话说,流标号用于资源分配。
- 流标号对于实时音视频数据的传送特别有用,但对于传统的非实时数据,流标号则没有用处,把流标号字段的值置为 0 即可。
- 有效载荷长度字段:长度为 16 比特,它指明 IPv6 数据报基本首部后面的有效载荷(包括扩展首部和数据部分)的字节数量。
- 该字段以字节为单位,最大取值为 65535,因此 IPv6 数据报基本首部后面的有效载荷的最大长度为 65535 字节。
- 下一个首部字段:长度为 8 比特。该字段相当于 IPv4 数据报首部中的协议字段或可选字段。
- 当 IPv6 数据报没有扩展首部时,该字段的作用与 IPv4 的协议字段一样,它的值指出了 IPv6 数据报基本首部后面的数据是何种协议数据单元 PDU。
- 当 IPv6 数据报基本首部后面带有扩展首部时,该字段的值就标识后面第一个扩展首部的类型。
- 拓展首部 1= 下一个首部 + 首部长度 +…, 下一个首部中也会标出拓展首部 2 的类型
- 跳数限制字段:长度为 8 比特。该字段用来防止 IPv6 数据报在因特网中永久兜圈。
- 源点在每个 IPv6 数据报发出时即设定某个跳数限制(最大 255 跳)。
- 每个路由器在转发 IPv6 数据报时,要先把跳数限制字段中的值减 1。当跳数限制的值为 0 时,就把这个 IPv6 数据报丢弃(即不转发)。
- 该字段的作用与 IPv4 数据报首部中的生存时间 TTL 字段完全一样。IPv6 将名称改为跳数限制后,可使名称与作用更加一致
- 源地址字段和目的地址字段:长度都为 128 比特。分别用来填写 IPv6 数据报的发送端的 IPv6 地址和接收端的 IPv6 地址。
# IPv6 数据报的扩展首部
- IPv4 数据报如果在其首部中使用了选项字段,则在数据报的整个传送路径中的全部路由器,都要对选项字段进行检查,这就降低了路由器处理数据报的速度。
- 实际上,在路径中的路由器对很多选项是不需要检查的。因此,为了提高路由器对数据包的处理效率,IPv6 把原来 IPv4 首部中的选项字段都放在了扩展首部中,由路径两端的源点和终点的主机来处理,而数据报传送路径中的所有路由器都不处理这些扩展首部(除逐跳选项扩展首部)。
- 在 [RFC 2460] 中定义了以下六种扩展首部:
- 逐跳选项
- 路由选择
- 分片
- 鉴别
- 封装安全有效载荷
- 目的站选项
- 每一个扩展首部都由若干个字段组成,它们的长度也各不相同。
- 所有扩展首部中的第一个字段都是 8 比特的下一个首部字段。该字段的值指出在该扩展首部后面是何种扩展首部。
- 当使用多个扩展首部时,应按以上的先后顺序出现
# IPv6 地址
- 在 IPv6 中,每个地址占 128 个比特。,2128 个
- 每 16bit 为一组,共 8 组,冒号十六进制记法 2001:0db8:4004:0010:0000:0000:6543:0ffd, 不区分大小写
- 在 IPv6 地址的冒号十六进制记法的基础上,再使用 “左侧零” 省略和 “连续零” 压缩,可使 IPv6 地址的表
示更加简洁。- “左侧零” 省略是指两个冒号间的十六进制数中最前面的一串 0 可以省略不写。
- “连续零” 压缩是指一连串连续的 0 可以用一对冒号取代 (4 个 0,8 个 0 都算一个冒号)
- 在一个 IPv6 地址中只能使用一次 ==“连续零”== 压缩,否则会导致歧义 (因为不知道压缩了几组 0)
- 冒号十六进制记法还可结合点分十进制的后缀。这在 IPv4 向 IPv6 过渡阶段非常有用。0:0:0:0:0:ffff:192.168.1.1->::ffff:192.168.1.1
- CIDR 的斜线表示法在 IPv6 中仍然可用。
# IPv6 地址的分类
IPv6 数据报的目的地址有三种基本类型:
- 单 播(unicast): 传统的点对点通信
- 多 播(multicast): 一点对多点的通信。数据报发送到一组计算机中的每一个。IPv6 没有采用广播的术语,而将广播看作多播的一个特例。
- 任 播(anycast): 这是 IPv6 新增的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是按照路由算法得出的距离最近的一个。
[RFC 4291] 对 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 向 IPv6 过渡
- 因特网上使用 IPv4 的路由器的数量太大,要让所有路由器都改用 IPv6 并不能一蹴而就。因此,从 IPv4 转变
到 IPv6 只能采用逐步演进的办法。 - 另外,新部署的 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 地址
# 使用隧道技术
- 隧道技术(Tunneling)的核心思想是:
- 当 IPv6 数据报要进入 IPv4 网络时,将 IPv6 数据报重新封装成 IPv4 数据报,即整个 IPv6 数据报成为 IPv4 数据报的数据载荷。
- 封装有 IPv6 数据报的 IPv4 数据报在 IPv4 网络中传输。
- 当 IPv4 数据报要离开 IPv4 网络时,再将其数据载荷(即原来的 IPv6 数据报)取出并转发到 IPv6 网络。
- 要使双协议栈路由器 R4 知道 IPv4 数据报的数据载荷是 IPv6 数据报,则 IPv4 数据报首部中协议字段的值必须设置为 41。
# 网际控制报文协议 ICMPv6
- 由于 IPv6 与 IPv4 一样,都不确保数据报的可靠交付,因此 IPv6 也需要使用网际控制报文协议 ICMP 来向发送 IPv6 数据报的源主机反馈一些差错信息,相应的 ICMP 版为 ICMPv6。
- ICMPv6 比 ICMPv4 要复杂得多,它合并了原来的地址解析协议 ARP 和网际组管理协议 IGMP 的功能。因此与 IPv6 配套使用的网际层协议就只有 ICMPv6 这一个协议。
- IPv6 某一首部的 [下一个首部字段] 值为 58, 代表下一个首部是 ICMPv6 报文
- ICMPv6 报文可被用来报告差错、获取信息、探测邻站或管理多播通信。
- 在对 ICMPv6 报文进行分类时,不同的 RFC 文档使用了不同的策略:
在 [RFC 2463] 中定义了六种类型的 ICMPv6 报文
在 [RFC 2461] 中定义了五种类型的 ICMPv6 报文
在 [RFC 2710] 中定义了三种类型的 ICMPv6 报文
# 软件定义网络
-
软件定义网络(Software Defined Network,SDN)的概念最早由斯坦福大学的 Nick McKeown 教授于 2009 年提出。
-
SDN 最初只是学术界讨论的一种新型网络体系结构。
-
路由器的功能
- 为主机间的通信提供转发服务
- 路由选择
-
路由器之间传送的信息
- 主机间的分组
- 路由信息
-
在 SDN 体系结构中,路由器中的路由软件都不存在了。因此,路由器之间不再交换路由信息。
-
在控制层面中,有一个在逻辑上集中的远程控制器。
-
逻辑上集中的远程控制器在物理上可由不同地点的多个服务器组成
-
远程控制器掌握各主机和整个网络的状态。
-
远程控制器能够为每一个分组计算出最佳的路由。
-
远程控制器为每一个路由器生成其正确的转发表。
-
SDN 这种新型网络体系结构的核心思想:把网络的控制层面和数据层面分离,而让控制层面利用软件来控制数据层面中的许多设备。
# OpenFlow 协议
- OpenFlow 协议可被看成是 SDN 体系结构中控制层面与数据层面之间的通信接口。
- OpenFlow 协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制。
- OpenFlow 协议使得控制层面的控制器可以对数据层面中的物理设备进行直接访问和控制
- OpenFlow 协议的技术规范由非营利性的产业联盟开放网络基金会(Open Networking Foundation,ONF)负责制定。
- ONF 的任务是致力于 SDN 的发展和标准化。
- SDN 并未规定必须使用 OpenFlow,只不过大部分 SDN 产品采用了 OpenFlow 作为其控制层面与数据层面的通信接口。
- OpenFlow 从 2009 年底发表的 1.0 版开始,每年都被更新,历经 12 次更新,到 2015 年 3 月发布了 1.5.1 版,目前较为成熟的是 1.3 版本。
# 传统意义上的数据层面的任务
- 传统意义上的数据层面的任务:根据转发表转发分组
- 转发分组分为以下两个步骤:
- 进行 “匹配”:查找转发表中的网络前缀,进行最长前缀匹配。
- 执行 “动作”:把分组从匹配结果指明的接口转发出去
- SDN 的广义转发分为以下两个步骤:
- 进行 “匹配”:能够对网络体系结构中各层(数据链路层、网络层、运输层)首部中的字段进行匹配。
- 执行 “动作”:不仅转发分组,还可以负载均衡、重写 IP 首部(类似 NAT 路由器中的地址转换)、人为地阻挡或丢弃一些分组(类似防火墙一样)
# OpenFlow 交换机和流表
-
在 SDN 的广义转发中,完成 “匹配 + 动作” 的设备并不局限在网络层工作,因此不再称为路由器,而称 “OpenFlow 交换机” 或 “分组交换机”,或更简单地称为 “交换机”。
-
相应的,在 SDN 中取代传统路由器中转发表的是 “流表(Flow Table)”。一个流就是穿过网络的一种分组序列,而在此序列中的每个分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源 IP 地址和目的 IP 地址的一连串分组。
-
OpenFlow 交换机中的流表是由 SDN 远程控制器来管理的。SDN 远程控制器通过一个安全信道,使用 OpenFlow 协议来管理 OpenFlow 交换机中的流表。
-
每个 OpenFlow 交换机必须有一个或多个流表。
-
每一个流表可以包含多个流表项。
-
每个流表项包含三个字段:首部字段值(或称匹配字段)、计数器、动作
-
首部字段值字段包含有一组字段,用来使入分组(Incoming Packet)的对应首部与之匹配,因此又称为匹配字段。匹配不上的分组就被丢弃,或被发送到 SDN 远程控制器做更多的处理。
-
在 OpenFlow 交换机中,既可以处理数据链路层的帧,也可以处理网际层的 IP 数据报,还可以处理运输层的 TCP 或 UDP 报文。
-
计数器字段是一组计数器:
- 记录已经与该流表项匹配的分组数量的计数器;
- 记录该流表项上次更新到现在经历时间的计数器。
-
动作字段是一组动作,当分组匹配某个流表项时,执行该流表项中动作字段指明的以下某个或多个动作:
- 把分组转发到指明的端口
- 丢弃分组
- 把分组进行复制后再从多个端口转发出去
- 重写分组的首部字段(包括数据链路层、网际层以及运输层的首部)
# SDN 体系结构
- SDN 体系结构及其四个关键特征
- 基于流的转发
- 数据层面与控制层面分离
- 位于数据层面分组交换机之外的网络控制功能
- 可编程的网络