计算机网络自顶向下方法::网络层::数据平面
网络层概述
- 路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报;控制平面的主要作用是协调这些本地的每路由器转发动作,使得数据报沿着源和目的地主机之间的路由器路径最终进行端到端传送。
- 转发和路由选择:数据平面和控制平面
- 转发:当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路
- 路由选择:当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。计算这些路径的算法被称为路由选择算法
- 每台网络路由器中有一个关键元素是它的转发表(fonvarding table)。路由器检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。这些值对应存储在转发表项中的值,指出了该分组将被转发的路由器的输出链路接口。
- 控制平面:传统的方法
- 路由选择算法运行在每台路由器中,并且在每台路由器中都包含转发和路由选择两种功能。在一台路由器中的路由选择算法与在其他路由器中的路由选择算法通信,以计算出它的转发表的值。
- 控制平面:SDN 方法
- SDN 方法显示了从路由器物理上分离的另一种方法,远程控制器计算和分发转发表以供每台路由器所使用,路由选择设备仅执行转发。远程控制器可能实现在具有高可靠性和冗余的远程数据中心中,并可能由 ISP 或某些第三方管理。路由器和远程控制器通过交换包含转发表和其他路由选择信息的报文实现通信。
- 控制平面:传统的方法
- 网络服务模型
- 网络层能提供的某些可能的服务
- 确保交付。该服务确保分组将最终到达目的地。
- 具有时延上界的确保交付。该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内(例如在 1OOms 内)交付 。
- 有序分组交付。该服务确保分组以它们发送的顺序到达目的地。
- 确保最小带宽。这种网络层服务模仿在发送和接收主机之间一条特定比特率(例如 1Mbps) 的传输链路的行为。只要发送主机以低于特定比特率的速率传输比特(作为分组的组成部分),则所有分组最终会交付到目的主机。
- 安全性。网络层能够在源加密所有数据报并在目的地解密这些分组,从而对所有运输层报文段提供机密性。
- 因特网的网络层提供了单一的服务,称为尽力而为服务,使用尽力而为服务,传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽。尽力而为服务看起来是根本无服务的一种委婉说法,即一个没有向目的地交付分组的网络也符合尽力而为交付服务的定义
- 网络层能提供的某些可能的服务
路由器工作原理
- 通用路由器结构
- 输入端口
- 它在路由器中执行终结入物理链路的物理层功能
- 与位于入链路远端的数据链路层交互来执行数据链路层功能
- 执行查找功能,通过查询转发表决定路由器的输出端口,到达的分组通过路由器的交换结构转发到输出端口
- 交换结构
- 交换结构将路由器的输入端口连接到它的输出端口
- 输出端口
- 输出端口存储从交换结构接收的分组,并通过执行必要的链路层和物理层功能在输出链路上传输这些分组
- 路由选择处理器
- 路由选择处理器执行控制平面功能
- 在传统的路由器中,它执行路由选择协议,维护路由选择表与关联链路状态信息,并为该路由器计算转发表
- 在 SDN 路由器中,路由选择处理器负责与远程控制器通信,目的是接收由远程控制器计算的转发表项,并在该路由器的输入端口安装这些表项
- 输入端口
- 输入端口处理和基于目的地转发
- 输入端口的线路端接功能与链路层处理实现了用于各个输入链路的物理层和链路层。在输入端口中执行的查找对于路由器运行是至关重要的。正是在这个地方,路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到该输出端口。
- 转发表是由路由选择处理器计算和更新的,或者转发表接收来自远程 SDN 控制器的内容
- 最长前缀匹配规则
- 路由器用分组目的地址的前缀(prefix)与该表中的表项进行匹配;如果存在一个匹配项,则路由器向与该匹配项相关联的链路转发分组,当有多个匹配时,在该表中寻找最长的匹配项,并向与最长前缀匹配相关联的链路接口转发分组。
- 执行转发表匹配不仅必须要用硬件执行查找,而且需要对大型转发表使用超出简单线性搜索的技术
- 一旦通过查找确定了某分组的输出端口,则该分组就能够发送进入交换结构。在某些设计中,如果来自其他输入端口的分组当前正在使用该交换结构,一个分组可能会在进入交换结构时被暂时阻塞。因此,一个被阻塞的分组必须要在输入端口处排队,并等待稍后被及时调度以通过交换结构。
- 其他需要执行的动作
- 必须出现物理层和链路层处理
- 必须检查分组的版本号、检验和以及寿命字段,并且重写后两个字段
- 必须更新用于网络管理的计数器
- 可选防火墙过滤分组
- 可选 NAT 重写端口号
- 交换
- 交换结构位于一台路由器的核心部位,因为正是通过这种交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口中。交换可以用许多方式完成。
- 经内存交换。最简单、最早的路由器是传统的计算机,在输入端口与输出端口之间的交换是在 CPU (路由选择处理器)的直接控制下完成的。输入与输出端口的功能就像在传统操作系统中的 I/O 设备一样。一个分组到达一个输入端口时。该端口会先通过中断方式向路由选择处理器发出信号。于是,该分组从输入端口处被复制到处理器内存中。路由选择处理器则从其首部中提取目的地址,在转发表中找出适当的输出端口,并将该分组复制到输出端口的缓存中。
- 经总线交换。在这种方法中、输入端口经一根共享总线将分组直接传送到输出端口。不需要路由选择处理器的干预。
- 经互联网络交换。克服单一、共享式总线带宽限制的一种方法是,使用一个更复杂的互联网络,例如过去在多处理器计算机体系结构中用来互联多个处理器的网络。纵横交换机是非阻塞的。更为复杂的互联网络使用多级交换元素,以使来自不同输入端口的分组通过交换结构同时朝着相同的输出端口前行。
- 输出端口处理
- 输出端口处理取出已经存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。
- 何时出现排队
- 输入排队
- 如果交换结构不能快得(相对于输入线路速度而言)使所有到达分组无时延地通过它传送,在这种情况下,在输入端口也将出现分组排队,因为到达的分组必须加入输入端口队列中,以等待通过交换结构传送到输出端口。
- 队头阻塞
- 一个输入队列中的排队分组必须等待通过交换结构发送,因为它被位于线路前部的另一个分组所阻塞,即使这个分组所前往的端口是空闲的。
- 输出排队
- 端口的发送速率小于交换机交换分组的速率,排队的分组耗尽了端口的可用内存,将会采取一定策略丢弃排队的分组
- 弃尾策略,丢弃刚到达排队的分组
- 删除一个或多个巳排队的分组为新来的分组腾出空间
- 端口的发送速率小于交换机交换分组的速率,排队的分组耗尽了端口的可用内存,将会采取一定策略丢弃排队的分组
- 输入排队
- 分组调度
- 先进先出
- 调度规则按照分组到达输出链路队列的相同次序来选择分组在链路上传输,如果没有足够的缓存空间来容纳到达的分组,队列的分组丢弃策略则确定该分组是否将被队列中去除其他分组以便为到达的分组腾出空间,
- 优先权排队
- 到达输出链路的分组被分类放人输出队列中的优先权类,实践中,网络操作员可以配置一个队列,这样携带网络管理信息的分组获得超过用户流量的优先权,非抢占式优先权排队规则下,一旦分组开始传输,就不能打断。
- 循环和加权公平排队
- 其中,到达的分组被分类并在合适的每个类的等待区域排队。于是用循环调度一样,WFQ 调度器也以循环的方式为各个类提供服务,即首先服务第一类,然后第二类,接着第三类,然后重复这种服务模式。
- 先进先出
- 交换结构位于一台路由器的核心部位,因为正是通过这种交换结构,分组才能实际地从一个输入端口交换(即转发)到一个输出端口中。交换可以用许多方式完成。
网际协议:IPv4、寻址、 IPv6 及其他
- IPv4 数据报格式
- 版本(号)。这 4 比特规定了数据报的 IP 协议版本。通过查看版本号,路由器能够确定如何解释 IP 数据报的剩余部分 。不同的 IP 版本使用不同的数据报格式。
- 首部长度。因为一个 IPv4 数据报可包含一些可变数量的选项,故需要用这 4 比特来确定 IP 数据报中载荷实际开始的地方。大多数 IP 数据报不包含选项,所以一般的 IP 数据报具有 20 字节的首部。
- 服务类型。服务类型(TOS)比特包含在 IPv4 首部中,以便使不同类型的 IP 数据报能相互区别开来
- 数据报长度。这是 IP 数据报的总长度(首部加上数据),以字节计。因为该字段长为 16 比特,所以 IP 数据报的理论最大长度为 65535 字节。
- 标识、标志、片偏移。这个字段与所谓 IP 分片有关。
- 寿命。寿命字段用来确保数据报不会永远(如由于长时间的路由选择环路)在网络中循环。每当一台路由器处理数据报时,该字段 的值减 1。若 TTL 字段减为 0, 则该数据报必须丢弃。
- 协议。该字段通常仅当一个 IP 数据报到达其最终目的地时才会有用。该字段值指示了 IP 数据报的数据部分应交给哪个特定的运输层协议。
- 首部检验和,首部检验和用于帮助路由器检测收到的 IP 数据报中的比特错误
- 源和目的 IP 地址。当某源生成一个数据报时,它在源 IP 字段中插入它的 IP 地址,在目的 IP 地址字段中插入其最终目的地的地址。
- 选项。选项字段允许 IP 首部被扩展。
- 数据(有效栽荷)。IP 数据报中的数据字段包含要交付给目的地的运输层报文段 ( TCP 或 UDP)。然而,该数据字段也可承载其他类型的数据,如 ICMP 报文。
- IPv4 数据报分片
- 一个链路层帧能承载的最大数据量叫作最大传送单元(Maximum Transmission Unit, MTU),不同的链路有不同的 MTU
- 片在其到达目的地运输层以前需要重新组装。
- 当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。发送主机通常将它发送的每个数据报的标识号加 1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,它能够检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为 0、而所有其他片的标志比特被设为 1。为了让目的主机确定是否丢失了一个片(且能按正础的顺序重新组装片),使用偏移字段指定该片应放在初始 IP 数据报的哪个位置。
- IPv4 编址
- 一台主机通常只有一条链路连接到网络;当主机中的 IP 想发送一个数据报时,它就在该链路上发送。主机与物理链路之间的边界叫作接口(interface)。
- 因为路由器的任务是从链路上接收数据报并从某些其他链路转发出去,路由器必须拥有两条或更多条链路与它连接。路由器与它的任意一条链路之间的边界也叫作接口。一台路由器因此有多个接口.每个接口有其链路。因为每台主机与路由器都能发送和接收 IP 数据报,IP 要求每台主机和路由器接口拥有自己的 IP 地址。因此、从技术上讲,一个 IP 地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。
- 每个 IP 地址长度为 32 比特(等价为 4 字节),因此总共有 2^32 大约 40 亿个可能的 IP 地址 。
- 在全球因特网中的每台主机和路由器上的每个接口,都必须有一个全球唯一的 IP 地址,这些地址不能随意地自由选择。一个接口的 IP 地址的一部分需要由其连接的子网来决定。
- IP 编址为这个子网分配一个地址 223.1.1.0/24, 其中的 /24 记法,有时称为子网掩码。指示 32 比特中的最左侧 24 比特定义了子网地址。任何其他要连到 223.1.1.0/24 网络的主机都要求其地址具有 223.1.1.xxx 的形式。
- 因特网的地址分配策略被称为无类别域间路由选择(Classless Interdon1ain Routing,CIDR),在这种情况下,该组织内部的设备的 IP 地址将共享共同的前缀。因特网的 BGP 路由选择协议时。将看到该组织网络外部的路由器仅考虑前面的前缀比特 x。这就是说,当该组织外部的一台路由器转发一个数据报,且该数据报的目的地址位于该组织的内部时,仅需要考虑该地址的前面 x 比特,这相当大地减少了在这些路由器中转发表的长度,因为形式为 a.b.c.d/x 的单一表项足以将数据报转发到该组织内的任何目的地。这种使用单个网络前缀通告多个网络的能力通常称为地址聚合(address aggregation), 也称为路由聚合(route-aggregation) 或路由摘要(route summarization)。
- 在 CIDR 被采用之前,IP 地址的网络部分被限制为长度为 8、16 或 24 比特,这是一种称为分类编址 (classful addressing) 的编址方案,这是因为具有 8、16 和 24 比特子网地址的子网分别被称为 A、B 和 C 类网络。
- 获取一块地址
- 为了获取一块 IP 地址用于一个组织的子网内,某网络管理员也许首先会与他的 ISP 联系,该 ISP 可能会从已分给它的更大地址块中提供一些地址。例如,该 ISP 也许自己已被分配了地址块 200.23.16.0/20。该 ISP 可以依次将该地址块分成 8 个长度相等的连续地址块,为本 ISP 支持的最多达 8 个组织中的一个分配这些地址块中的一块。
- ISP 的地址来源于 ICANN 组织,它还负责 管理 DNS 根服务器。
- 获取主机地址:动态主机配置协议
- 主机地址也能手动配置,但是这项任务目前更多的是使用动态主机配置协议。DHCP 允许主机自动获取(被分配)一个 IP 地址。网络管理员能够配置 DHCP, 以使某给定主机每次与网络连接时能得到一个相同的 IP 地址,或者某主机将被分配一个临时的 IP 地址(temporary IP address), 每次与网络连接时该地址也许是不同的。除了主机 IP 地址分配外,DHCP 还允许一台主机得知其他信息,例如它的子网掩码、它的第一跳路由器地址(常称为默认网关)与它的本地 DNS 服务器的地址。由于 DHCP 具有将主机连接进一个网络的网络相关方面的自动能力,故它又常被称为即插即用协议(plug-and-play protocol) 或零配置(zeroconf)协议。
- DHCP 是一个客户-服务器协议
- 主机加入子网的过程
- DHCP 服务器发现:一台新到达的主机的首要任务是发现一个要与其交互的 DHCP 服务器这可通过使用 DHCP 发现报文 (DHCP discover tnessage) 来完成,DHCP 客户生成包含 DHCP 发现报文的 IP 数据报,其中使用广播目的地址 255.255.255.255 并且使用“本主机”源 IP 地址 0.0.0.0,DHCP 客户将该 IP 数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的节点。
- DHCP 服务器提供:DHCP 服务楛收到 一个 DHCP 发现报文时,用 DHCP 提供报文 (DHCP offer message) 向客户做出响应,该报文向该子网的所有节点广播,仍然使用 IP 广播地址 255.255.255.255。因为在子网中可能存在几个 DHCP 服务器,该客户也许会发现它处于能在几个提供者之间进行选择的优越位置。每台服务器提供的报文包含有收到的发现报文的事务 ID 、向客户推荐的 IP 地址、网络掩码以及 IP 地址租用期, 即 IP 地址有效的时间量。服务器租用期通常设置为几小时或几天。
- DHCP 请求。新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用 DHCP 请求报文 (DHCP request message) 进行响应,回显配置的参数。
- DHCP ACK。服务器用 DHCP ACK 报文进行响应,证实所要求的参数。
- 从移动性角度看,DHCP 确实有非常严重的缺陷。因为每当节点连到一个新子网,要从 DHCP 得到一个新的 IP 地址,当 一个移动节点在子网之间移动时,就不能维持与远程应用之间的 TCP 连接
- 网络地址转换
- NAT 使能路由器对于外部世界来说甚至不像一台路由器。相反 NAT 路由器对外界的行为就如同一个具有单一 IP 地址的单一设备。
- 通过使用 NAT 路由器上的一张 NAT 转换表(NAT translation table)、并且在表项中包含了端口号及其 IP 地址,该路由器怎样知道它应将某个分组转发给哪个内部主机
- 当生成一个新的源端口号时,NAT 路由器可选择任意一个当前未在 NAT 转换表中的源端口号。
- IPv6
- IPv6 数据报格式
- 扩大的地址容量。IPv6 将 IP 地址 长度从 32 比特增加到 128 比特。这就确保全世界将不会用尽 IP 地址。
- 简化高效的 40 宇节首部。40 字节定长首部允许路由器更快地处理 IP 数据报 3 一种新的选项编码允许进行更灵活的选项处理。
- 流标签。这些特殊流是发送方要求进行特殊处理的流,如一种非默认服务质量或需要实时服务的流。
- 版本。该 4 比特字段用于标识 IP 版本号。毫不奇怪,IPv6 将该字段值设为 6。
- 流量类型。该 8 比特字段与我们在 IPv4 中看到的 TOS 字段的含义相似。
- 有效载荷度该 16 比特值作为一个无符号整数,给出了 IPv6 数据报中跟在定长的 40 字节数据报首部后面的字节数量。
- 下一个首部。该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如 TCP 或 UDP)。该字段使用与 IPv4 首部中协议字段相同的值。
- 跳限制。转发数据报的每台路由楛将对该字段的内容减 1。如果跳限制计数达到 0, 则该数据报将被丢弃。
- 源地址和目的地址 。IPv6 128 比特地址的各种格式在 RFC 4291 中进行了描述。
- 数据。这是 IPv6 数据报的有效载荷部分当数据报到达目的地时,该有效载荷就从 IP 数据报中移出,井交给在下一个首部字段中指定的协议处理。
- 从 IPv4 到 IPv6 的迁移
- 在实践中已经得到广泛采用的 IPv4 到 IPv6 迁移的方法包括建隧道。建隧道依据的基本思想如下:假定两个 IPv6 节点,使用 IPv6 数据报进行交互,但它们是经由中间 IPv4 路由器互联的。我们将两台 IPv6 路巾器之间的中间 IPv4 路由器的集合称为一个隧道 (tunnel)
- IPv6 数据报格式
通用转发和 SDN
- 在通用转发中,一张匹配加动作表将基于目的地的转发表一般化了。因为能够使用网络层和/或链路层源和目的地址做出转发决定,所以显示转发设备更为准确地描述为“分组交换机”而不是第三层“路由器”或第二层“交换机”。
- 匹配加动作转发表在 OpenFlow 中称为流表 (flow table), 它的每个表项包括:
- 首部宇段值的集合,入分组将与之匹配 。 与基于目的地转发的情况一样,基于硬件 匹配在 TCAM 内存中执行得最为迅速。匹配不上流表项的分组将被丢弃或发送到远程控制器做更多处 理 。 在实践中,为了性能或成本原因, 一 个流表可以由多个流表实现,但我们这里只关注单一流表的抽象
- 计数器集合(当分组与流表项匹配时更新计数器)。这些计数器可以包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间
- 当分组匹配流表项时所采取的动作集合。这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输出端口,和/或重写所选的首部字段。
- 匹配
- OpenFlow 的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配
- 流表项也可以有通配符
- 最后,并非一个 IP 首部中的所有字段都能被匹配
- 动作
- 转发。一个入分组可以转发到一个特定的物理输出端口,广播到所有端口,或通过所选的端口集合进行多播。该分组可能被封装并发送到用于该设备的远程控制器。该控制器则可能对该分组采取某些动作,包括安装新的流表项,以及可能将该分组返回给该设备以在更新的流表规则集合下进行转发 。
- 丢弃。没有动作的流表项表明某个匹配的分组应当被丢弃。
- 修改字段。在分组被转发到所选的输出端口之前,分组首部 10 个字段中的值可以重写 。
- 匹配加动作操作的 openFlow 例子
- 简单转发
- 负载均衡
- 充当防防火墙