目录
[1. 网络传输流程简述](#1. 网络传输流程简述)
[2. 转发和路由选择](#2. 转发和路由选择)
[3. 控制平面:SDN 方法](#3. 控制平面:SDN 方法)
[1. 概述](#1. 概述)
[2. 输入端口处理和基于目的地转发](#2. 输入端口处理和基于目的地转发)
[3. 交换](#3. 交换)
[4. 输出端口处理](#4. 输出端口处理)
[1. IPv4 数据报分片](#1. IPv4 数据报分片)
[2. IPv4编址](#2. IPv4编址)
[3. DHCP(动态主机配置协议)](#3. DHCP(动态主机配置协议))
[(1)DHCP 服务器发现](#(1)DHCP 服务器发现)
[(2)DHCP 服务器提供](#(2)DHCP 服务器提供)
[(3)DHCP 请求](#(3)DHCP 请求)
[(4)DHCP ACK](#(4)DHCP ACK)
[4. NAT(网络地址转换)](#4. NAT(网络地址转换))
[5. 从IPv4 到IPV6 的迁移](#5. 从IPv4 到IPV6 的迁移)
[6. 通用转发和 SDN](#6. 通用转发和 SDN)
[① 转发](#① 转发)
[② 丢弃](#② 丢弃)
[③ 修改宇段](#③ 修改宇段)
一、网络层
1. 网络传输流程简述
上图显示了 一个 简单网络,其中有 H1 和 H2 两台主机,在 H1 与 H2 之间的路径上 有 几台路由器。假设 H1 正在向 H2 发送信息,考虑 这些主机 与 中间路由器的 网络层 所起的作用。
H1 中的 网络层 取得来自于 H1 运输层的 报文段,将 每个报文段 封装成一个 数据报,然后 向相邻 路由器 R1 发送该 数据报。在接收方主机 H2,网络层 接收来自 相邻路由器 R2 的 数据报,提取出 运输层报文段,并将 其向 上交付给 H2 的 运输层。
每台 路由器的 数据平面的 主要作用是 从其 输入链路 向其 输出链路 转发 数据报;控制 平面的主要作用是 协调 这些本地的 每路由器 转发动作,使得 数据报 沿着源 和 目的地 主机之间的 路由器 路径最终 进行端到端 传送。
2. 转发和路由选择
网络层的作用 从表面上看 极为简单,即将 分组 从一台发送主机 移动到 一台 接收主机。为此,需要 使用两种 重要的 网络层功能:++转发 和 路由选择。++
转发(forwarding) 是指 将分组从一个 输人链路接口 转移到 适当的 输出链路接口的 路由器本地动作。转发 发生的时间 尺度很短(通常为 几纳秒),因此 通常++用 硬件来实现++ 。路由选择(routing) 是指 确定 分组从源 到目的地 所采取的 端到端路径的 网络范围 处理过程。路由 选择发生的 时间 尺度长得多(通常为几秒),因此 通常++用 软件来实现++。
用 驾驶的例子 进行类比,假设 旅行者 历经 从宾夕法尼亚州 到 佛罗里达州的 行程。
在这个行程中,驾驶员 在到 佛罗里达州的 途中经过了 许多立交桥。我们 能够 认为转发就 像通过 单个立交桥的 过程:一辆 汽车 从其道路上 进人立交桥的 一个入口,并且 决定应当 走哪条路来 离开该立交桥。
我们 可以把 路由选择 看作是 规划 从宾夕法尼亚州 到 佛罗里达州行程的 过程:在 着手行程之前,驾驶员 已经查阅了 地图 并在许多可能的 路径中 选择一条,其中 每条路径 都由一 系列经立交桥连接的 路段组成。
每台 网络路由器中 有一个关键元素 是它的 转发表(forwarding table)。路由器 检查 到达分组首部的一个 或 多个 字段值,进而 使用这些 首部值 在其转发表中 索引,通过 这种方法来 转发分组。这些 值对应存储在 转发表项中的 值,指出了 该分组 将被转发的 路由器的 输出链 路接口。
如下图中,一个 首部字段值为 0111 的分组 到达路由器。该 路由器 在它的 转发表中 索引,并 确定该分组的 输出链路接口是 接口 2。该路由器 则在 内部将该分组 转发到 接口 2。
3. 控制平面:SDN 方法
上图中 显示的 实现路由选择 功能的 方法,是 路由选择 厂商在 其产品中 采用的 传统方法。使用 该方法,每台路由器 都有一个 与其他 路由器的 路由选择组件 通信的 路由选择组件。然而,对 人类能够 手动配置 转发表的 观察启发 我们,对于 控制平面功能 来说,也许 存在其他方式 来确定 数据平面 转发表的 内容。
下图显示了 从路由器物理上分离的 另一种方法,远程控制器 计算 和 分发转发表 以供 每台路由器 所使用。两种方法 数据平面组件是 相同的。而在下图中,控制平面 路由 选择功能 与 物理的路由器是 分离的,即 **路由选择设备 仅执行 转发,而 远程控制器计算 并分发 转发表。**远程 控制器 可能实 现在具有高可靠性 和 冗余的远程数据 中心中,并可能由 ISP 或 某些 第三方管理。
路由器和远程控制器是如何通信的呢?
通过 交换包含转发表 和 其他路由选择 信息的 报文。 显示 在下图中的 控制平面 方法 是 **软件定义网络(Soft-ware-Defined Networking,SDN)**的本质,因为 计算转发表 并与路由器 交互的 控制器 是用 软件实现的,故网络是 " 软件定义 " 的。
这些软件实现也 越来越 开放,换言之类似于 Linux 操作系统 代码,这些 代码 可为 公众所用,允许 ISP(以及网络研究者 和学生)去创新 并对控制网络层功能 的软件 提出 更改建议。
二、路由器工作原理
1. 概述
上图显示了一个 通用路由器 体系结构的 总体视图,其中 标识了一台 路由器的 4 个组件。
(1)输入端口
输入端口(input port)执行几项 重要功能。它在 路由器中执行 终结 入物理链路的 物理层功能,这显示在图中 输入端口部分 最左侧的方框 与 输出端口部分 最右侧的方 框中。
它还要 与位于 入链路远端的 数据链路层 交互来 执行 数据链路层 功能,这显示在 输入与输出端口部分 中间的 方框中。
更为 重要的是,在 输入端口 还要执行 查找功能,这显示在 输入端口 最右侧的 方框中。在这里,通过 查询转发表 决定路由器的 输出端口,到达的分组 通过路由器的 交换结构转发 到 输出端口。
控制分组(如 携带路由选择协议 信息的 分组)从 输入端口 转发到 路由选择处理器。注意这里的 "端口" 一词,指的是 路由器的 物理输入 和 输出接口,完全不同于 与 网络应用程序 和 套接字相关联的 软件端口。
在实践中,一台路由器所支持的端口数量范围较大,从企业路由器具有数量相对少的端口,到位于某ISP边缘的路由器具有数以百计 10Gbps 端口(其中人线路的数量趋于最大)。
(2)交换结构
交换结构 将路由器的 输入端口 连接到它的 输出端口。这种 交换结构 完全包含在 路由器之中,即 它是一个 网络路由器中的 网络。
(3)输出端口
输出端口 存储 从交换结构 接收的 分组,并通过 执行必要的 链路层 和 物理层功能 在输出链路上 传输这些分组。当一条链路 是双向的时(即 承载两个方向的 流量),输出端口 通常 与 该链路的输入端口 成对出现在 同一线路卡 上。
(4)路由选择处理器
路由选择处理器 执行控制平面 功能。在 传统的路由器中,它 执行路由选择协议,维护 路由选择表 与 关联链路 状态信息,并为 该路由器计算转发表。
路由器的 输入端口、输出端口 和 交换结构 几乎总是 用硬件实现。为何需要用硬件实现?
考虑具有10Gbps 输人链路 和 64 字节的 IP 数据报,其 输人端口 在另一个 数据报 到达前仅有 51.2ns 来 处理数据报。如果 N 个端口 结合在一块 线路卡上(因为 实践中 常常 这样做),数据报 处理流水线必须以 N 倍 速率 运行,这 远快过软件实现的 速率。
转发硬件 既能够 使用路由器厂商 自己的硬件 设计来 实现,也 能够使用购买 的 商用 硅片的 硬件设计 来实现。
当数据平面 以 纳秒时间 尺度 运行时,路由器 的控制功能 以毫秒或秒 时间尺度 运行,这些 控制功能 包括执行路由 选择协议、对上线 或 下线的 连接链路 进行响应、与 远程 控制器通信(在 SDN 场合)和 执行管理功能。因而 这些 控制平面(control plane)的功能 通常用 软件实现 并在路由选择处理器(通常是 一种传统的 CPU)上 执行。
2. 输入端口处理和基于目的地转发
下图显示了一个更详细的 输入处理的视图。
输入端口的 线路端接功能 与 链路层处理 实现了 用于 各个输入链路的 物理层 和 链路层。
在输入端口中 执行的 查找 对于路由器运行是 至关重要的。正是 在这个地方,路由器 使用 转发表来 查找 输出端口,使得 到达的分组 能经过交换结构 转发到该 输出端口。
转发表 是由 路由选择处理器 计算和更新的(使用 路由选择协议 与 其他网络路由器中的 路由选择处理器 进行交互),或者 转发表接收 来自远程 SDN 控制器的 内容。
转发表从 路由选择处理器 经过 独立总线(例如一个 PCI 总线)复制到 线路卡,在 上图中 该总线 由从路由选择 处理器 到 输入线路卡的虚线 所指示。++使用 在 每个输入端口的 影子副本,转发决策 能在每个 输入端口 本地 做出,无须 基于每个分组 调用集中式 路由选择处理器,因此 避免了 集中式处理的 瓶颈。++
现在来考虑 "最简单" 的情况,一个 入分组 基于 该分组的目的地址 交换 到输出端口。在 32 比特 IP 地址的情况下,转发表的蛮力 实现 将针对 每个目的地址 有一个表项。因为 有超过 40 亿个可能的 地址,选择 这种方法总体上 是 不可行的。
举个 处理规模的 例子。假设一台路由器 具有 4 条 链路,编号 0 到 3,分组以 如下方式 转发到 链路接口:
显然,对于 这个例子,在 路由器的转发表中 没有必要有 40 亿个表项。例如,我们 能够 有一个如下仅包括 4 个表项的 转发表:
上图 这种风格的 转发表,路由器用 分组目的地址的 前缀(prefix)与 该表中的 表项 进行匹配;如果存在一个 匹配项,则 路由器向 与 该匹配项相关联的 链路 转发分组。
例如,假设 分组的 目的地址是 11001000 00010111 00010110 10100001,因为 该地址 的 21 比特前缀 匹配该表的 第一项,所以 路由器 向链路接口 转发该分组。如果 一个前缀 不匹配 前 3 项中的 任何一项,则 路由器向链路 接口 3 转发 该分组。
当有多个匹配时,例如 地址 11001000 00010111 00011000 10101010 的 前 24 比特 与 表中的 第二项匹配,而 该地址的 前 21 比特 与 表中的 第三项匹配,该 路由器 使用 最长前缀匹配规则(longestprefix matching rule), 即 ++在该表中 寻找最长的 匹配项,并 向与 最长前缀匹配 相关联的 链路接口 转发分组。++
假定 转发表 已经存在,从 概念上讲 表查找是 简单的,硬件逻辑 只是 搜索转发表 查找最长前缀 匹配。但在 吉比特速率 下,这种 查找必须在 纳秒级 执行。因此,不仅 必须 要用硬件 执行查找,而且 需要 对大型转发表 使用超出简单线性搜索的 技术。
一旦 通过查找确定了 某分组的 输出端口,则 该分组就 能够发送 进人 交换结构。在 某些设计中,如果 来自其他输入端口 的分组 当前正在 使用 该交换结构,一个 分组 可能会在 进入 交换结构时 被暂时阻塞。因此,++一个 被阻塞的分组 必须要在 输入端口处 排队,并 等待稍后 被 及时调度 以通过 交换结构。++
尽管 "查找" 在输入端口处理中 可认为是 最为重要的 动作,但 必须采取 许多其他动作:
① 必须出现物理层 和 链路层处理。
② 必须 检查 分组的 版本号、检验 和 以及寿命字段,并且 重写后 两个字段。
③ 必须 更新用于 网络管理的 计数器(如 接收到的 IP 数据报的 数目)。
注意:
输入端口 查找 目的 IP 地址("匹配"),然后 发送该分组 进入 交换结构("动作")的 步骤是一种 更为一般的 "匹配加动作" 抽象的 特定情况,这种 抽象 在许多网络设备中 执行,而不仅 在路由器中。
3. 交换
交换结构 位于一台路由器的 核心部位,因为 正是通过这种 交换结构,分组 才能 实际地 从一个 输入端口 交换(即转发)到一个 输出端口 中。交换 可以用 许多方式 完成,如下图。
(1)经内存交换
最简单、最早的路由器是 传统的 计算机,在 输入端口 与 输出端口之间的 交换是在 CPU(路由选择处理器)的 直接控制下 完成的。输入与输出端口的功能 就像在 传统操作系统中的 I/O 设备一样。
一个 分组 到达一个 输入端口 时,该 端口会 先通过 中断方式 向路由 选择处理器 发出信号。于是,该分组 从输入端口处 被复制到 处理器内存 中。
路由选择处理器 则 从其首部中提取 目的地址,在 转发表中 找出适当的 输出端口,并将 该分组复制到 输出端口的 缓存中。
在这种情况下,如果 内存带宽为 每秒 可写进内存 或 从内存 读出最多 B 个 分组,则 总的 转发吞吐量(分组从 输入端口 被传送 到输出端口的 总速率)必然 小于 B/2。(这里 不能同时 转发两个 分组,即使 它们有不同的 目的端口,因为 经过 共享系统总线 一次仅能 执行一个 内存 读/写。)
许多 现代路由器 通过 内存进行 交换。然而,与 早期 路由器的一个 主要差别是,目的地址的查找 和 将分组存储(交换)进适当的 内存存储位置 是由 输入线路卡 来处理的。
在某些方面,经 内存交换的 路由器 看起来 很像共享内存的 多处理器,用一个 线路卡上的 处理将 分组交换(写)进适当的 输出端口的 内存中。
(2)经总线交换
在这种方法中,输入端口 经一根 共享总线 将分组 直接传送到 输出端口,不需要 路由选择 处理器的 干预。通常 按以下方式 完成该任务:
让 输入端口 为分组 预先计划 一个交换机 内部标签(首部),指示 本地输出端口,使 分组 在总线上 传送和传输 到输出端口。该分组 能由 所有输出端口 收到,但 只有 与该标签匹配的端口 才能 保存该分组。然后 标签在 输出端口 被去除,因为 其仅用于交换机内部 来跨越 总线。
如果 多个分组 同时到达 路由器,每个 位于不同的 输出端口,除了 一个分组 外 所有其他 分组必须等待,因为 一次只有一个分组 能够跨越 总线。
每个 分组必须 跨过单一 总线,故 路由器的 交换带宽受 总线速率的 限制;在 环状交叉路的类比中,这 相当于 环状交叉路 一次仅 包含一辆 汽车。
(3)经互联网络交换
克服 单一、共享式 总线带宽限制的一种方法是,使用一个 更复杂的 互联网络。
纵横式交换机 就是一种由 2w 条总线组成的 互联网络,它连接 N 个 输入端口 与 N 个 输出端口。每条垂直的 总线 在交叉点 与 每条水平的 总线交叉,交叉点 通过 交换结构控制器(其逻辑是交换结构 自身的一部分)能够 在任何时候 开启和闭合。
由上图,当 某分组 到达 端口 A,需要 转发到 端口 Y 时,交换机控制器 闭合 总线 A 和 Y 交叉部位的 交叉点,然后 端口 A 在其 总线上 发送 该分组,该 分组仅由 总线 Y 接收。
注意到 来自 端口 B 的一个分组 在同一时间 能够 转发到 端口 X,因为 A 到 Y 和 B 到义的分组 使用不同的 输入和输出 总线。因此,与 前面两种交换方法 不同,纵横式网络 能够并行 转发多个分组。纵横式交换机是 非阻塞的(non-blocking) ,即 只要没有 其他分组 当前被转发到 该 输出端口,转发 到输出端口的 分组 将不会被 到达输出端口的 分组阻塞。
然而,如果 来自两个不同输入端口 的两个分组 其目的地为 相同的 输出端口,则 一个分组 必须在 输入端 等待,因为 在某个时刻 经给定总线 仅能够 发送一个 分组。
4. 输出端口处理
**输出端口 处理 取出 已经存放在 输出端口内存 中的 分组并 将其 发送到输出链路 上。**这 包括选择 和 取出排队的 分组 进行传输,执行 所需的链路层 和 物理层 传输功能。
三、网际协议:IPv4、寻址、IPv6
1. IPv4 数据报分片
并不是 所有链路层协议 都能承载 相同长度的 网络层分组。有的 协议能承载 大数据报,而有的协议只能承载 小分组。例如,以太网帧 能够承载 不超过 1500 字节 的数据,而某 些广域 网链路的帧 可承载不超过 576 字节 的数据。
一个 链路层帧能承载的 最大数据量 叫作 最大传送单元 ( Maximum Transmission Unit, MTU) 。因为 每个 IP 数据报 封裝在链路层帧 中从一台路由器 传输到 下一台路由器,故 链路层协议的 MTU 严格地限制着 IP 数据报的 长度。
对 IP 数据报长度 具有严格限制 并不是 主要问题。问题在于 在发送方 与 目的地路径上的 每段链路 可能使用 不同的链路层 协议,且 每种协议 可能具有 不同的 MTU。
想象自己 是一台 互联几条链路的 路由器,且 每条链路运行 具有不同 MTU 的 链路层协议。假定你 从某条链路 收到一个 IP 数据报,通过 检查转发表 确定出 链路,并且 该条出 链路的 MTU 比该 IP 数据报的 长度要小。
此时你 会感到 慌乱,如何 将这个过大 的 IP 分组 挤进链路层帧的 有效载荷 字段呢?解决 该问题的方法是 ++将 IP 数据报中的 数据分片成 两个或更多个较小 的 IP 数据报,用 单独的 链路层 帧封装 这些较小的 IP 数据报,然后 通过输出链路 发送这些 帧。++
每个这些 较小的 数据报 都称为 片(fragment)。片在其 到达目的 地运输层 以前需要 重新组装。
IPv4 的设计者感到在 路由器中 重新组装数据报 会给协议 带来相当大 的 复杂性并且 影响路由器的 性能。为 坚持网络 内核保持 简单的原则,IPv4 的设计者 决定将数据报的 重新组装工作 放到端系统中,而不是放到 网络路由器中。
当一台 目的主机从 相同源收到 一系列数据报 时,它需要 确定这些数据报中的 某些 是否是一些原来 较大的 数据报的片。如果 某些数据报是 这些片的话,则它必须 进一步确定 何时 收到了最后一片,并且 如何将这些 接收到的 片拼接到一起以 形成初始的 数据报。
为了 让目的主机执行 这些重新 组装任务,IPv4 的设计者将 标识、标志和片偏移字段 放在 IP 数据报 首部中。
当生成一个 数据报时,发送主机 在为该数据报设置源 和 目的地址的 同时贴上 标识号。发送主机 通常将它 发送的每个数据报的 标识号 加 1。当 某路由器 需要对 一个数据报分片 时,形成的每个数据报(即片)具有 初始数据报的源地址、目的地址与标识号。
当 目的地从 同一发送主机 收到一系列数据报 时,它 能够检查数据报的 标识号 以确定 哪些数据报 实际上是 同一较大数据报的 片。
由于 IP 是一种 不可靠的服务,一个或多个片 可能永远 到达不了 目的地。因为 这种 原因,++为了 让目的主机 绝对地相信它 已收到了 初始数据报的 最后一个片,最后一个片 的标志比特被 设为 0,而所有 其他片的标志 比特被 设为 1。++
另外,为了 让目的主机 确定是否 丢失了一个片(且能按 正确的顺序 重新组装 片),使++用 偏移字段 指定该片 应放在初始 IP 数据报的 哪个位置++。
上图中,一个 4000 字节的 数据报(20 字节 IP 首部加上 3980 字节 IP 有效载荷)到达一台路由器,且 必须被转发 到一条 MTU 为1500 字节的 链路上。这就 意味着 初始数据报中 3980 字节数据 必须被分配 为 3 个独立的片(其中的 每个片 也是一个 IP 数据报),到达 目的主机后 再进行重组。
2. IPv4编址
一台主机通常 只有一条 链路连接到 网络;当主机中的 IP 想发送一个 数据报时,它就在 该链路上 发送。主机 与 物理链路之间的 边界叫作 接口(interface)。
现在 考虑一台 路由器 及其 接口。因为 路由器的 任务是 从链路上 接收数据报 并从某些 其他链路转发 出去,路由器 必须拥有 两条或 更多条链路 与 它连接。路由器 与 它的任意一条 链路之间的边界也叫作 接口。一台 路由器因此 有多个接口,每个 接口有其 链路。
因为 每台主机 与 路由器都能 发送和接收 IP 数据报,IP 要求 每 台主机 和 路由器接口 拥有自己的 IP 地址。因此,从技术上讲,++一个 IP 地址与一个接口 相关联,而 不是与包括 该接口的 主机 或 路由器 相关联++。
每个 IP 地址长度为 32 比特(等价为 4 字节),因此总共有 2^32 个(或大约 40 亿个)可能的 IP 地址。这些地址通常按所谓 点分十进制记法 (dotled-decimal notation) 书写,即 地址中的 每个字节用它的 十进制形式 书写,各字节间 以句点 隔开。例如,考虑 IP 地址193.32.216.9,193 是该地址的 第一个 8 比特 的 十进制等价数,32 是该地址的 第二个 8 比特的 十进制 等价数,依次类推。因此,地址 193.32.216.9 的二进制记法是:
在 全球因特网中的 每台主机 和 路由器上的 每个接口,都必须 有一个全球 唯一的 IP 地址(在 NAT 后面的接口 除外)。然而,这些 地址不能 随意地自由选择。
一个接口的 IP 地址的一部分需要 由其连接的 子网来决定。
上图提供了一个 IP 编址与接口的 例子。
在该图中,一台路由器(具有 3 个接口)用于互联 7 台主机。仔细观察 分配给 主机和路由器接口的 IP 地址,有 几点需要注意。图中 左上侧的 3 台主机 以及它们 连接的 路由器接口,都有一个形如 223.1.1.xxx 的 IP 地址。这就是说,在它们的 IP 地址中,最左侧的 24 比特是 相同的。
这 4 个接口也 通过一个 并不包含 路由器 的网络 互联起来。该 网络可能 由一个 以太网 LAN 互联,在此情况下,这些 接口将通过一台 以太网交换机 互联,或者 通过一个 无线接入点 互联。我们 此时将这种 无路由器 连接这些主机的 网络 表示为一朵云。
用 IP 的术语来说,互联这 3 个主机接口与 1 个路由器接口 的网络 形成一个 子网(sub-net) 。IP 编址为这个 子网 分配一个地址 223.1.1.0/24,其中的 /24 记法,有时称为 子网掩码(network mask) ,指示 32 比特中的 最左侧 24 比特定义 了子网地址。因此子网 223.1.1.0/24 由 3 个主机接口(223.1.1.1、223.1.1.2和 223.1.1.3)和 1 个路由器接口(223.1.1.4)组成。
任何其他要连到 223.1.1.0/24 网络的 主机都 要求其地址 具有 223.1.1.xxx 的形式。
上图中显示了另外两个网络:223.1.2.0/24 网络与 223.1.3.0/24 子网。**一个子网的 IP 定义并不局限于 连接多台主机 到一个路由器接口的 以太网段。**为了搞清其中的道理,可考虑下图,图中显示了 3 台 通过点 对点链路 彼此互联的 路由器。
上图中,每台路由器有 3 个接口,每条 点对点链路 使用一个,一个 用于直接 将路由器 连接到一对 主机的 广播链路。这里出现了 3 个子网 223.1.1.0/24、223.1.2.0/24 和 223.1.3.0/24 。
注意:
在本例中还有其他 3 个子网:一个子网是 223.1.9.0/24,用于连接路由器 R1 与 R2 的接口;另外一个子网是 223.1.8.0/24,用于连接路由器 R2 与 R3 的接口;第三个子网是 223.1.7.0/24,用于连接路由器 R3 与R1 的接口。
对于一个 路由器和主机 的通用 互联系统,我们 能够使用 下列有效方法 定义系统中的子网:
为了确定 子网,分开主机 和 路由器的 每个接口,产生 几个隔离的 网络岛,使用 接口端接 这些隔离的 网络的端点。这些 隔离的 网络中的每一个 都叫作一个 子网( subnet)。
从上述可以 看出,一个具有 多个以太网段 和 点对点链路的 组织(如一个公司 或 学术机构)将具有 多个子网,在 给定子网上的 所有设备都具有 相同的 子网地址。原则上,不同的子网 能够具有 完全不同的 子网地址。然而,在实战中,它们的 子网地址经常 有许多 共同之处。
为了 理解其中的 道理,我们来 关注在全球因特网 中是 如何处理编址的。因特网的 地址分配策略被称为 无类别域间路由选择(Classless Interdomain Routing,CIDR)。CIDR 将子网寻址的概念一般化了。
当 使用子网寻址时,32 比特的 IP 地址被划分为 两部分,并且也 具有点分 十进制数 形式 a.b.c.d/x,其中 x 指示了 地址的 第一部分中的 比特数。形式为 a.b.c.d/x 的地址的 x 最高比特 构成了 IP 地址的网络部分,并且经常 被称为该地址的 前缀(prefix)(或网络前缀)。
一个组织通常 被分配一块 连续的 地址,即 具有相同前缀的 一段地址。在 这种情况下,该组织内部的设备的 IP 地址 将共享共同的 前缀。这就是说,当 该组织外部的 一台 路由器 转发一个数据报,且 该数据报的 目的地址 位于该组织的 内部时,仅 需要考虑 该地址的前面 x 比特。这 相当大地减少了 在这些路由器中 转发表的长度,因为形式为 a.b.c.d/x 的单一表项 足以 将数据报 转发到该组织 内的 任何目的地。
上图为一个 ISP 将 8 个组织连 接到因特网的 例子,它也很好地说明 了 仔细分配 CIDR 化的地址 有利于 路由选择的 道理。
假设该 ISP(我们称之为 Fly-By-Night-ISP) 向外界通告,它应该发送所有地址的前 20 比特与 200.23.16.0/20 相符的数据报。外界的 其他部分不需要知道在 地址块 200.23.16.0/20 内实际上还存在 8 个其他组织,其中 每个组织有 自己的子网。
这种 使用 单个网络前缀 通告 多个网络的能力 通常称为 地址聚合(address aggregation) ,也称为 路由聚合(route aggregation)或 路由摘要(route summarization)。
当地址按块分给 ISP,然后又由 ISP 分给 客户组织时,地址聚合工作 极为有效。
当一台主 机发出一个 目的地址为 255.255.255.255(IP 广播地址) 的数据报时,该报文会交付给 同一个 网络中的所有主机。路由器 也会有选择地 向邻近的子 网转发该报文(虽然它们通 常不这样做)。
3. DHCP(动态主机配置协议)
某组织一且 获得了一块 地址,它 就可为本组织内的 主机与路由器 接口逐个分配 IP 地址。系统管理员 通常手工配置 路由器中的 IP 地址(常常在 远程通过网络 管理工具进行配置)。主机地址也能 手动配置,但是这项 任务 目前更多的是 使用 动态主机配置协议(Dy-namic Host Configuration, DHCP) 来完成。
DHCP 允许主机 自动获取(被分配)一个 IP 地址。网络管理员能够配置 DHCP,以使某 给定主机 每次 与网络连接时能 得到一个 相同的 IP 地址,或者 某主机将被 分配一个临时的 IP 地址(temporary IP address),每次与 网络连接时该地址 也许是 不同的。
除了 主机 IP 地址分配 外,DHCP 还允许 一台主机 得知 其他信息,例如 它的 子网掩码、它的 第一跳路由器 地址(常称为 默认网关)与它的本地 DNS 服务器的 地址。
由于 DHCP 具有将主机 连接进一个网络的 网络相关方面的 自动能力,故它 又常被称为 即插即用协议(plug-and-play protocol)或 零配置(zerocont)协议。
DHCP 还广泛地用于 住宅因特网 接入网、企业网 与 无线局域网中,其中的 主机频繁地 加入和 离开网络。例如,考虑一个 学生带着便携机 从宿舍到图书馆 再到教室。很有可能 在每个 位置这个学生 将连接到一个 新的子网,因此 在每个位置 都需要一个 新的 IP 地址。DHCP 是 适合这种情形的 理想方法,因为 有许多用户 来来往往,并且 仅在有限的 时间内 需要地址。
DHCP 是一个 客户-服务器协议。客户 通常是新 到达的主机,它要 获得包括 自身使用的 IP 地址 在内的 网络配置信息。在最 简单场合下,每个子网将具 有一台 DHCP 服务器。如果 在某 子网中 没有 服务器,则需要一个 DHCP 中继代理(通常是 一台路由器),这个 代理知道 用于 该网络的 DHCP 服务器的 地址。
下图 显示了 连接到子网 223.1.2/24 的一台 DHCP 服务器,具 有一台提供 中继代理服务 的路由器,它为连接到子网 223.1.1/24 和 223.1.3/24 的到达客户提供 DHCP 服务。
对于一台 新到达的主机 而言,针对 上图所示的 网络设置,DHCP 协议是 一个 4 个步骤的 过程:
(1)DHCP 服务器发现
一台 新到达的 主机的 首要任务是 发现一个要与其交互的 DHCP服务器。这可通过使用 DHCP 发现报文(DHCP discover message) 来完成,客户在UDP 分组中向 端口 67发送该 发现报文。该 UDP 分组封装在一个 IP 数据报中。
主机这个 数据报应发给 谁时。在这种情况 下,DHCP 客户生成 包含 DHCP 发现报文的 IP 数据报,其中 使用广播目的 地址 255.255.255.255 并且使用 "本主机" 源 IP 地址 0.0.0.0。DHCP 客户 将该 IP 数据报传递给 链路层,链路层 然后将该 帧广播到所有 与该 子网连接的节点。
(2)DHCP 服务器提供
DHCP 服务器收到一个 DHCP 发现报文时,用 DHCP 提供报文(DHCP offer message) 向客户 做出响应,该报文 向该子网的 所有节点 广播,仍然使用 IP 广播地址 255.255.255.255。因为 ++在子网中可能 存在几个 DHCP 服务器,该客户 也许会发现 它处于能 在几个 提供者之间 进行选择的 优越位置++。
每台 服务器提供的 报文包含 有收到的 发现报文的事务 ID、向客户推荐的 IP 地址、网络掩码以及 IP 地址租用期(address lease time),即 IP 地址有效的 时间量。服务器 租用期 通常设置 为几小时 或 几天。
(3)DHCP 请求
新到达的 客户从一个 或 多个服务器提供中 选择一个,并向 选中的服务器 提供用 **DHCP 请求报文(DHCP request message)**进行响应,回显 配置的 参数。
(4)DHCP ACK
服务器用 DHCP ACK 报文(DHCP ACK mesage)对 DHCP 请求报文 进行响应,证实 所要求的 参数。
一旦客户收到 DHCP ACK 后,交互便完成了,并且 该客户 能够在 租用期内 使用 DHCP 分配的 IP 地址。因为 客户可能 在该租用期 超时后 还希望使用 这个地址,所以 DHCP 还提供了一种 机制以 允许客户更新 它对一个 IP 地址的 租用。
从 移动性角度看,DHCP 确实有 非常严重的缺陷。因为 每当节点连 到一个新子网,要从 DHCP 得到一个新的 IP 地址,当一个 移动节点在 子网之间移动 时,就 不能维持 与 远程应用 之间的 TCP 连接。
4. NAT(网络地址转换)
每个 IP 使能的设备都 需要一个 IP 地址。随着所谓 小型办公室、家庭办公室(Small Office, HomeOffice, SOHO) 子网的 大量出现,看起来 意味着每当一个 SOHO 想安装一个 LAN 以互联多台机器 时,需要 ISP 分配一组地址 以供该 SOHO 的所有 IP 设备(包括电话、平板电脑、游戏设备、IP TV、打印机等)使用。如果 该 子网变大了,则需要 分配一块 较大的地址。但如果 ISP 已经为 SOHO 网络的 当前地址范围 分配过一块 连续地址该 怎么办呢?并且,家庭 主人一般 要(或应该需要)首先知道的 管理 IP 地址的 典型方法 有哪些呢?幸运的是,有一种 简单的 方法 越来越广泛地 用在这些场合:网络地址转换(Network Address Transla-tion, NAT)。
上图显示了一台 NAT 使能路由器的 运行情况。
位于家中的 NAT 使能的路由器 有一个接口,该接口 是上图 中右侧所示 家庭网络的 一部分。在 家庭网络内的编址 就像我们在 上面 看到的完全一样,其中的所有 4 个接口都具有相同的网络地址 10.0.0/24。地址空闻 10.0.0.0/8 是在 [RFC 1918] 中 保留的三部分 IP 地址空间之一,这些地址用于 上图 中的 家庭网络等专用网络 (private network) 或 具有专用地址的地域( realm with privateaddress) 。具有 专用地址的 地域是指 ++其地址 仅对该网络中 的设备 有意义的 网络++。
考虑有 数十万家庭网络 这样的 事实,许多 使用了相同的 地址空间 10.0.0.0/24。
++在一个 给定家庭网络中的 设备 能够使用 10.0.0.0/24 编址 彼此发送 分组。然而,转发到家庭 网络之外 进入更大的 全球 因特网的分组 显然不能 使用这些 地址++ (或作为 源地址,或作为 目的地址),因为 有数十万的 网络 使用着这块 地址。这就是说,10.0.0.0/24 地址仅在 给定的 网络中才 有意义。
但这当 向或从全球因特网发送 或接收分组时 如何 处理编址问题呢,地址 在何处才 必须是唯一的呢?
答案在于理解 NAT。
NAT 使能路由器 对于 外部世界来说 甚至 不像一台路由器。相反 NAT 路由器 对外界的 行为就如同一个 具有单一 IP 地址的 单一设备。
在上图中,所有 离开家庭路由器 流向 更大因特网的 报文都拥有一个 源 IP 地址 138.76.29.7,且所有 进入家庭的报文都 拥有同一个 目的 IP 地址 138.76.29.7。
从 本质上讲,NAT 使能路由器对 外界隐藏了 家庭网络的 细节。
另外,家庭网络计算机 是从哪儿 得到其 地址,路由器 又是从 哪儿得到 它的 单一 IP 地址的。在 通常的情况下,答案 是 相同的,即 DHCP。路由器从 ISP 的 DHCP 服务器 得到它的 地址,并且 路由器 运行一个 DHCP 服务器,为 位于 NAT-DHCP 路由器 控制的 家庭网络 地址空间中的 计算机 提供地址。
如果从 广域网到达 NAT 路由器的 所有数据报 都有相同的 目的 IP 地址(特别是对 NAT 路由器广域网 一侧的 接口),那么 该路由器怎样 知道它 应将某个分组 转发给 哪个 内部主机呢?技巧就是使用 NAT 路由器上的一张 NAT 转换表(NAT translation table),并且 在表项中 包含了 端口号及其 IP 地址。
假设 一个 用户坐在 家庭网络主机 10.0.0.1 后,请求 IP 地址为 128.119.40.186 的 某台 Web 服务器(端口 80)上的一个 Web 页面。主机 10.0.0.1 为其指派了(任意)源端口号 3345 并 将该数据报 发送到 LAN 中。
NAT 路由器收到 该数据报,为该 数据报生成一个 新的 源端口号 5001,++将源 IP 替代为 其广域网 一侧 接口的 IP 地址 138.76.29.7,且 将 源端口 3345 更换为 新端口 5001++。
当 生成一个 新的源端口号 时,NAT 路由器 可选择任意一个 当前未在 NAT 转换表中 的 源端口号。(注意到因为 端口号 字段为 16 比特长,NAT 协议可 支持 超过 60000 个 并行 使用路由器广域网一侧单个 IP 地址的 连接!)路由器中的 NAT 也在它的 NAT 转换表中增加一表项。
Web 服务器并不知道 刚 到达的 包含 HTTP 请求 的数据报 已被 NAT 路由器 进行了改装,它会 发回一个 响应报文,其 目的地址是 NAT 路由器的 IP 地址,其目的 端口是 5001。当 该 报文到达 NAT 路由器时,路由器使 用 目的 IP 地址 与 目的 端口号从 NAT 转换表中 检索出 家庭网络 浏览器使用的适当 IP 地址(10.0.0.1) 和目的端口号(3345)。于是,路由器重写该数据报的 目的 IP 地址与目的端 口号,并向 家庭网络 转发该 数据报。
5. 从IPv4 到IPV6 的迁移
虽然新型 IPv6 使能系统可做 成向后 兼容,即 能发送、路由 和 接收 IPv4 数据报,但 已部署的具有 IPv4 能力的系统却 不能够处理 IPv6 数据报。可以 采用以下 几种方法。
一种 可选的方法是 宣布一个标志日,即 指定 某个日期和时间,届时 因特网的 所有机器 都关机并从 IPv4 升级到 IPv6。但一个 涉及数 十亿台机器 的标志日 现在更是 不可想象的。
在实践中 已经得到 广泛采用的 IPv4 到 IPv6 迁移的方法包括 建隧道(tunneling)。建隧道依据的 基本思想如下:
假定两个 IPv6 节点 要使用 IPv6 数据报 进行交互,但它们 是经由中间 IPv4 路由器 互联的。我们 将两台 IPv6 路由器 之间的 中间 IPv4 路由器的 集合称为一个 隧道(tunnel)。
借助于隧道,在隧道发送端的 IPv6 节点(如B)可 将整个 IPv6 数据报 放到一个 IPv4 数据报的 数据(有效载荷)字段中 。于是,该 IPv4 数据报 的地址 设为 指向隧道接收端 的 IPv6 节点(在此例中为 E),再 发送给隧道中的 第一个节点(在此例中为 C)。隧道中的 中间 IPv4 路由器在 它们之间为 该数据报提供 路由, ++就像 对待其他 数据报一样,完全 不知道该 IPv4 数据报 自身就含 有一个完整的 IPv6 数据报。++
隧道 接收端的 IPv6 节点 最终收到该 IPv4 数据报(它是该 IPv4 数据报的 目的地),并确定 该 IPv4 数据报含有一个 IPv6 数据报(通过观察在 IPv4 数据报中的 协议号 字段是 41,指示该 IPv4 有效载荷是 IPv6 数据报),从中取出 IPv6 数据报,然后再为该 IPv6 数据报提供 路由,就好像 它是 从一个直接相连的 IPv6 邻居那里 接收到该 IPv6 数据报一样。
6. 通用转发和 SDN
(1)概述
第二层交换机 和 第三层路由器等 中间盒 剧增,而且 每种都有自己 特殊的 硬件、软件 和 管理界面,无疑 给许多网络操作员 带来了十分头疼的 大麻烦。然而,近期 软件定义 网络的 进展 已经预示 并且正在 提出一种统一的 方法,以一种现代、简洁和综合方式,提供 多种网络层功能 以及 某些 链路层功能。
基于 目的地转发的 特征可以 被总结为 两个步骤:查找目的 IP 地址("匹配"),然后 将分组 发送到有 特定输出 端口的 交换结构("动作")。
现在考虑一种 更有意义的通用 "匹配加动作" 范式,其中 能够对协议栈 的多个首部字段 进行"匹配",这些首部 字段是 与不同层次的 不同协议 相关联的。
"动作" 能够包括:将 分组转发 到一个 或 多个输出端口(就像在 基于目的地 转发中一样),跨越 多个通向服务的 离开接口 进行负载 均衡分组(就像在 负载均衡中一样),重写 首部值(就像在 NAT 中一样),有 意识地 阻挡/丢弃 某个分组(就像 在防火墙 中一样),为 进一步 处理和动作 而向某个特定 的服务器 发送一个分组(就像在 DPI 一样),等等。
在 通用转发中,一张 匹配加动作表 将基于目的地的 转发表一般化 了。因为 能够 使用 网络层 和/或 链路层源和 目的地址 做出 转发决定,所以 显示在下图中的 转发设备 更为准确地 描述为"分组交换机〞而不是 第三层 "路由器" 或 第二层 "交换机〞。
分组交换机,这是在 SDN 文献中 被广泛采用的 术语。下图 显示了 位于每台 分组交换机 中的一张 匹配加动作表,该表 由远程控制器计算、安装和更新。我们 注意到虽然 在各台 分组 交换机中的 控制组件 可以相互作用,但实践中 通用匹配加动作 能力是 通过计算、安装 和 更新 这些表的远程控制器 实现的。
OpenFlow 是一个 得到高度认可 和 成功的标准,它 已经成为 匹配加动作 转发抽象、控制器 以及更为一般的 SDN 革命等 概念的 先驱。我们 将主要考虑 OpenFlow 1.0,该标准以 特别清晰 和 简明的方式 引入了关键的 SDN 抽象和功能。OpenFlow 的后继版本 根据实现和 使用获得的经验 引人了 其他能力。
(2)匹配
下图显示了 11 个 分组 首部字段 和 入端口 ID,该 ID 能被 OpenFlow 1.0 中的 匹配加 动作规则 所匹配。到达 一台分组 交换机的 一个链路层(第二层)帧 将包含一个 网络层(第三层)数据报 作为 其有效载荷,该 载荷通常 依次将 包含一个 运输层(第四层)报文段。
第一个观察是,OpenFlow 的匹配抽象 允许 对来自 三个层次的 协议 首部所选择的 字段 进行匹配(它违反了 分层原则)。显示 在下图中的 源和 目的 MAC 地址是 与帧的 发送和 接收 接口相关联的 链路层地址;通过基于 以太网地址 而不是 IP 地址进行转发,我们看到 OpenFlow 使能的设备 能够等价于 路由器(第三层设备)转发数据报 以及 交换机(第二层设备)转发帧。
以 太网类型字段 对应于 较高层协议(例如 IP),利用 该字段 分解该帧的 载荷,并且 VLAN 字段 与 所谓虚拟局域网 相关联。
入端口 是指 分组交换机上 接收分组的 输入端口。运输层源 和 目的端口号 字段 也能匹配。流表 项也 可以有通配符。
例如,在一个流表中 IP 地址 128.119.*.* 将匹配其地址的 前 16 比特为 128.119 的 任何数据报所 对应的 地址字段。每个 流表项也 具有相应的 优先权。如果一个 分组匹配 多个 流表项,选定的匹配 和 对应的动作将 是其中有 最高优先权的 那个。
并非一个 IP 首部中的 所有字段 都能被匹配。例如 OpenFlow 并不允许基于 TTL 字段 或 数据 报长度字段的 匹配。为什么 有些字段允许 匹配,而 有些字段 不允许呢?毫无疑问,与 功能和复杂性 有关。选择 一种抽象的 "艺术" 是提供 足够的 功能来完成 某种任务(在这种 情况下是 实现、配置 和 管理宽泛的 网络层功能,以前 这些一直是 通过各种各样的 网络层 设备来 实现的),不必用 如此 详尽和一般性的 "超负荷" 抽象,这种 抽象已经 变得臃肿和 不可用。
(3)动作
每个流表项都有 零个或 多个动作列表,这些 动作决定了 应用于与流表项 匹配的 分组的 处理。如果 有多个动作,它们 以在表中规定的 次序执行。其中 最为重要的 动作为:
① 转发
一个人分组可以 转发到一个 特定的物理 输出端口,广播 到 所有端口(分组 到达的 端口 除外),或 通过所选的 端口集合 进行多播。该 分组可能被 封裝并 发送到用于该 设备的 远程 控制器。该控制器则 可能(或可能不)对该分 组采取某 些动作,包括 安装新的 流表项,以及 可能 将该 分组返回 给该设备 以在更新的 流表规则集合下 进行转发。
② 丢弃
没有动作 的流表项 表明 某个匹配的分组 应当被丢弃。
③ 修改宇段
在 分组被转发到 所选的输出端口之前,分组 首部 10 个字段(上图中 显示的 除 IP 协议 字段外的 所有 第二、三、四层的字段)中的值 可以重写。