《计算机网络自顶向下方法》笔记 (3) 网络层

网络层

因特网的网络层负责将名为数据报(datagram) 的网络层分组从一台主机移动到另一台主机。

网络层有两种重要的功能:

  • 转发。当一个分组到达路由器的一条输入链路时,路由器必须根据将该分组移动到适当的输出链路。

  • 路由选择。当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。

转发是指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。路由选择是指网络范围的过程,以决定分组从源到目的地所采取的端到端路径。

4.2 虚电路和数据报网络

虚电路网络

虚电路网络在网络层使用名为虚电路(VC)的连接。一条虚电路需要的资源有:源和目的主机之间的路径(即一系列链路和路由器)、沿着该路径的每段链路的一个 VC 号、沿着该路径的每台路由器中的转发表表项。

属于一条虚电路的分组将在它的首部携带一个 VC 号。一条虚电路在每条链路上可能具有不同的 VC 号,原因是逐链路替换能够减少 VC 号字段的长度,并能够简化虚电路的建立(避免了大量的协商报文)。因此,每台路由器必须根据它的转发表为正在转发的分组替换其首部中的 VC 号。

在虚电路网络中,该网络的路由器必须为进行中的连接维持连接状态信息。特别是,每当跨越一台路由器创建一个新连接,必须在该路由器的转发表中增加一个新的连接项;每当释放一个连接,必须从该表中删除该项。值得注意的是,即使没有 VC 号转换,仍有必要维持连接状态信息,该信息将 VC 号与输出接口号联系起来。因此,对于一个虚电路网络,沿两个端系统之间路径上的路由器都要参与虚电路的建立,且每台路由器都完全知道经过它的所有虚电路。

数据报网络

数据报网络不维护任何连接。

在数据报网络中,每台路由器有一个将目的地址映射到链路接口的转发表。当分组到达路由器时,路由器使用该分组的目的地址与转发表各表项进行最长前缀匹配,然后将该分组向匹配项中的输出链路接口转发。

因为在数据报网络中路由器的转发表随时可能修改,从一个端系统到另一个端系统发送的一系列分组,也就可能在通过网络时走不同的路径,并可能无序到达。

4.3 路由器工作原理

在这里插入图片描述

路由转发平面:路由器的输入端口、输出端口和交换结构通过硬件实现了转发功能。

路由控制平面:路由选择算法(运行在路由选择处理器上)通过软件实现了路由选择功能。

输入端口

输入端口接收分组,需要依次承担物理层功能(将路由器与物理链路相连接)、链路层功能(与位于入链路远端的数据链路层交互)和网络层功能(查找转发表为分组选择相应的输出端口)。

每个输入端口拥有转发表的一份影子副本,避免了集中式处理的瓶颈。

交换结构

交换结构将输入端口与输出端口相连。有三种交换方式:

  • 经内存交换。交换以 I/O 的形式在 CPU 的控制下进行。因为经过共享系统总线一次仅能执行一个内存读/写,所以不能同时转发两个分组,即使它们有不同的端口号。如果内存带宽为每秒可写进内存或从内存读出 B 个分组,则总的转发吞吐量必然小于 B/2。
  • 经总线交换。分组经一根共享总线直接到达输出端口,一次只有一个分组能够跨越总线。
  • 经互联网络交换。纵横式网络由 2N 条总线互联而成,能够并行转发多个分组(最多 N 个)。然而,如果来自两个不同输入端口的两个分组其目的地为相同的输出端口,则一个分组必须在输入端等待,因为在某个时刻经给定总线仅有一个分组能够发送。

在这里插入图片描述

何处出现排队

在输入端口和输出端口处都能形成分组队列,随着队列的增长,路由器的缓存空间最终将会耗尽,并且当无内存可用于存储到达的分组时将会出现丢包

4.4 网络协议:因特网中的转发和编址

IPv4 数据报格式

在这里插入图片描述

  • 首部长度:4 比特,IPv4 数据报是可变长的(通过包含选项),需要指示数据部分实际从哪里开始。通常,数据报不包含选项,所以,数据报首部的典型值是 20 字节。
  • 服务类型:8 比特,用来指示不同的服务类型。
  • 数据报长度:16 比特,数据报的总长度(首部 + 数据)。数据报长度理论最大值为 65535 字节,但实际一般不超过 1500 字节。
  • 标识、标志、片偏移:共 32 比特,与 IP 分片有关,讨论见后。
  • 寿命(TTL):8 比特,每经过一台路由器,该字段的值便减一,以确保数据报不会永远在网络中循环(当遇到路由环路时)。
  • 协议:8 比特,用来指示目的主机该将该数据报交由哪个运输层协议,其中 6 代表 TCP,17 代表 UDP。协议号是将网络层与运输层绑定到一起的粘合剂,类似的,端口号是将运输层和应用层绑定到一起的粘合剂。
  • 首部检验和:16 比特,用于首部的差错检测,计算方式与 UDP 一致。路由器一般会丢弃检测出错误的数据报。注意到由于 TTL 字段的存在以及可能的选项字段的改变,每台路由器上必须重新计算检验和并再次存放到原处。为什么 TCP/IP 在运输层与网络层都执行差错检测?首先,IP 只对 IP 首部计算检验和,而 TCP/UDP 对整个报文段计算;其次,TCP/UDP 与 IP 不一定都必须属于同一个协议栈。
IP 数据报分片

一个链路层帧能承载的最大数据量称为最大传送单元(MTU),典型值为 1500 字节。发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的 MTU。MTU 限制了 IP 数据报的长度,因此,在必要的时候,路由器需要将数据分成两个或多个较小的 IP 数据报,以适应较小的 MTU,这些经分片而成的较小的数据报称为片。需要注意的是,每个片都有自己的报头(前面说了,通常为 20 字节),所以,实际能够承载的数据是 MTU-20 字节。

为坚持网络内核保持简单的原则,重新组装片的任务被安排到了端系统中。接收方利用标识、标志和片偏移字段来判断一个数据报是否是片,以及片是否收集齐。

  • 标识号:16 比特,用来标识一个数据报,发送方通常将为它发送的每个数据报的标识号加 1(不同于 TCP 的字节流序号)。于是,接收方检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。
  • 片偏移:13 比特,片有可能丢失,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片),使用偏移字段指定该片应放在初始 IP 数据报的哪个位置。偏移字段的单位是 8 字节。
  • 标志:为了让目的主机相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为 0,而其他片的标志比特被设为 1。

在这里插入图片描述

分片是有开销的,它使路由器和端系统更为复杂,同时,能够被用于生成致命的 DoS 攻击。

IPv4 编址

IP 地址长度为 32 比特(4 字节),采用点分十进制记法书写,即每个字节用它的十进制形式书写,各字节间以点隔开,如 11000001 00100000 11011000 00001001 的点分十进制记法为 193.32.216.9。

一个 IP 地址技术上是与一个接口相关联的,而不是与包括该接口的主机或路由器相关联的。

子网

IP 地址可以分为网络号(高位比特)和主机号(低位比特)。具有相同网络号的(一般情况下),且不跨越路由器(第三层及以上网络设备)可以彼此互联的设备接口,构成了一个子网

IP 地址本身并不提供子网的信息,要指示一个子网的网络号,就需要用到子网掩码。子网掩码是这样一类虚拟 IP 地址,对应的子网的网络号的位在子网掩码上就取 1;主机号的位,就取 0。如一个子网的网络号为高 8 位,那么它的子网掩码就为 255.0.0.0。

子网掩码不能单独存在,它与对应的 IP 地址成对出现。通过将 IP 地址与子网掩码按位与,能够提取出该 IP 地址的子网地址。进一步的,将另一个 IP 地址与当前 IP 地址的子网掩码按位与,就能判断出这个 IP 地址是否与当前 IP 地址处于同一个子网中。

网络号用来标识网络(子网),主机号用来标识该网络中的设备接口。其中,子网内有一些特殊的 IP 地址,用于特殊的用途,不能被分配给设备接口:

  • 主机号全 0 的 IP 地址,是子网地址,代表该子网的网段。
  • 主机号全 1 的 IP 地址,是广播地址,指向该子网内所有的主机。

因此,记主机号长度为 h,一个子网内的地址数为 2 h 2^h ,可用的地址数为 2 h 2 2^h-2 。如

子网地址 172.32.0.0,子网掩码 255.255.254.0

其地址范围为 172.32.0.0 ~ 172.32.1.255

可分配的地址范围为 172.32.0.1 ~ 172.32.1.254

广播地址为 172.32.1.255

编码方案:分类编址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编码方案:CIDR

无类别域间路由选择(CIDR)不同于分类编址,对于网络号长度,没有特定的限制。CIDR 编址的形式为 a.b.c.d/x,其中 x 指示了该地址网络号(或说前缀)的比特数,剩余的 32-x 比特是主机号。同时,x 也指示了该网络的子网掩码,即高 x 位均为 1,剩余 32-x 位均为 0。

有了 CIDR,就可以使用路由聚合:将多个网络的最长公共前缀作为转发表中的项。如,有三个子网:200.23.16.0/23、200.23.20.0/23、200.23.30.0/23,将它们聚合,就是 200.23.16.0/20,因为它们的最长公共前缀为 200.23.16.0,且该前缀的长度为 20。由于路由器在转发表中查找匹配项时采用的是最长公共前缀算法,目的地址是这三个子网中的任意一个时,都能通过聚合后的地址转发到正确的输出端口,然后经过下一级路由更精细地转发。这样,就能利用单个网络前缀通告多个网络,减小转发表的规模,缩短路由查找的时间。

获取主机地址:DHCP

子网划分完毕后,在一个网络内,各个接口如何获得地址?一种方案是硬编码,通过手动静态配置,但缺陷可想而知。更常用的方案是使用**动态主机配置协议(DHCP)**通过网络动态获取一个临时的 IP 地址,以及相应的子网掩码、第一跳路由器地址(默认网关)与本地 DNS 服务器地址。通过动态分配 IP 地址,可以达成地址的重用。

DHCP 包括四个步骤:

  1. DHCP 服务器发现。首先,主机需要发送一个 DHCP 发现报文(由 UDP 承载,端口号为 67),来发现能够使其获得 IP 地址的 DHCP 服务器。此时,由于主机尚未拥有 IP 地址,发送的报文中携带的源地址就使用代表 ”本主机“ 的源地址 0.0.0.0;由于尚未知道 DHCP 服务器的地址,目的地址就使用广播目的地址 255.255.255.255。
  2. DHCP 服务器提供。当该网络内的 DHCP 服务器收到一个 DHCP 发现报文时,响应以 DHCP 提供报文。该报文仍使用广播(实践中,也会有使用单播的情况),携带有向客户推荐的 IP 地址、子网掩码和地址租借期等。
  3. DHCP 请求。网络内可能存在多个 DHCP 服务器,主机就在收到的 DHCP 提供报文中选择一个地址,然后响应以 DHCP 请求报文,这个报文仍是广播。
  4. DHCP 确认。被选中的地址提供服务器响应以 DHCP ACK 报文,该报文采用广播(实践中,也会有使用单播的情况)。
网络地址转换:NAT

私有网络地址空间 10.0.0.0/24 专用于家庭网络等本地网络,仅对特定网络内的设备有意义。一旦数据报需要离开本地网络,它就需要一个因特网地址。这时,就需要用到网络地址转换(NAT),NAT 使能路由器将所有离开本地网络的数据报的源目的地址置换为相同的 NAT IP 地址以及不同的端口号。

实现 NAT,需要使用在 NAT 路由器上的 NAT 转换表,表项中记录了(NAT IP 地址,NAT 端口号,本地 IP 地址,本地端口号)四元组。每当有外出数据报需要转发,NAT 路由器替换其源 IP 地址和源端口号,并记录下表项。NAT 路由器通过 NAT 端口号来区分不同的(本地 IP 地址,本地端口号),由于端口号长度为 16 比特,所以可以支持超过 60000 个并行连接。

NAT 的优点在于:

  • 扩充能够联网的主机数,解决 IP 短缺的问题
  • 本地网络设备 IP 地址的变更,无需通告外界网络
  • 变更 ISP 时,无需修改内部网络设备编址
  • 内部网络设备对外界网络不可见,提高安全性

NAT 的争议在于:

  • 端口号应当用于进程编址,而不是主机编址

  • 路由器应当最高只处理第三层的分组

  • 违反端到端原则

  • 地址短缺应由 IPv6 解决

  • 妨碍 P2P 应用程序

因特网控制报文协议:ICMP

ICMP 被主机和路由器用来彼此沟通网络层的信息,典型用途是差错报告。ICMP 报文由 IP 数据报承载,它有一个类型字段和一个编码字段,并且包含引起该 ICMP 报文首次生成的 IP 数据报的首部和前 8 字节内容(以便发送方能确定引发该差错的数据报)。

  • ping 的实现

ping 程序向指定主机发送一个 ICMP 回显请求(类型 8 编码 0)报文,目的主机将会发回一个 ICMP 回显回答(类型 0 编码 0)。

  • tracert 的实现

要实现一个 Tracert 工具,核心思想就是 TTL 的设置和 ICMP 协议。Tracert 向目的主机发送一系列的 数据报,第一个的 TTL 为 1,第二个的为2,第三个的为 3…以此类推,并为每个数据报计时,计算 RTT。这样,第 n 个数据报到达路由路径的第 n 个路由器时,就刚好会过期,那么此时,路由器就会丢 弃该数据报,并向源主机发送一个 ICMP 报文,这个报文里包含了路由器的名字和 IP 地址。Tracert 一 旦收到 ICMP 报文,就可以记录路由器信息和 RTT 了。Tracert 一值发送数据报,直到数据报的 TTL 足 够刚好到达目的主机。这时,由于这些数据报携带 UDP 报文段,并且其目的端口是 UDP 不可达的,那 么,当目的主机收到该数据报时,发现其端口不可达,就向源主机发送一个 ICMP 报文。源主机的 Tracert 程序一旦收到目的主机发送来的 ICMP 报文,就停止发送分组了,此时得到的 RTT 就是到目标 主机的往返时延。

IPv6

IPv6 的变化主要有:扩大的地址容量、简化高效的 40 字节首部以及流标签与优先级。同时,IPv6 不允许中间路由器进行分片与重组,只能在端到端执行。

4.5 路由选择算法

与主节直接相连的路由器称为该主机的默认路由器(或第一跳路由器),默认路由器的地址就是该主机的默认网关。路由选择的工作是,在源路由器到目的路由器选择合适的路径(路由),这可以转化为图论的最短路问题。

在这里插入图片描述

对路由选择的算法的分类,主要是以全局式分散式来区分。全局式路由选择算法用完整的、全局性的网络知识计算出从源到目的地之间的最低费用路径,如链路状态(LS)算法。分散式路由选择算法以迭代、分布式的方式计算出最低费用路径,如距离向量(DV)算法。

链路状态路由选择算法(LS)

在链路状态算法中,网络拓扑和所有的链路费用都是已知的,也就是说可以用作 LS 算法的输入。实践中,每个节点向网络中所有其他结点,使用链路状态广播算法广播链路状态分组,分组中包含它所连接的链路的特征和费用。结点广播的结果是所有结点具有了该网络的等同的、完整的视图。于是每个结点都能够像其他结点一样,运行 LS 算法并计算出相同的最低费用路径集合。

LS 算法可以采用 Dijkstra 算法,非常简单。

在这里插入图片描述

用上面的网络作为例子就是

在这里插入图片描述

于是,可以得到关于点 u 到其他各点的最短路径以及位于点 u 的路由器的转发表

在这里插入图片描述

上述的 LS 算法的图模型是一个非常简单的无向图,当链路费用等于链路上承载的负载时,这意味着要运用这个图模型要保证链路费用是对称的(即 c(u, v)=c(v, u)),然而现实常常并非如此,这就要求我们采用有向图模型。问题在于,一旦使用有向图模型,LS 算法就可能出现路由振荡:路由器以为自己找到了更好的路径,其实只是在固定的几条道路上辗转反复。要解决路由震荡,一种不可接受的方案是强制链路费用不依赖于所承载的流量,因为路由选择的目标之一就是要避开高度拥塞的链路。另一种方案是让每台路由器发送链路通告的时间随机化。

距离向量路由选择算法(DV)

DV 算法是分布式的,因为每个结点都要从一个或多个直连邻居接收信息,执行计算,然后将结果分发给邻居;也是迭代的,因为此过程要一直持续到邻居之间无更多信息要交换为止(算法会自我终止);还是异步的,因为它不要求所有结点相互之间步伐一致地操作。

DV 算法根据 Bellman-Ford 方程 d x ( y ) = m i n v { c ( x , v ) + d v ( y ) } d_x(y) = min_v\{c(x, v) + d_v(y)\} 得来,其中,x 是起始点,y 是终点,v 是 x 的邻居。这个方程的正确性很显然。路由器据此得出使得 d x ( y ) d_x(y) 最小的邻居 v v^* ,并将它作为转发表中目的地为 y 的数据报的下一跳地址。

DV 算法的思路是,每个结点 x 估计它自己到 N 中所有其他结点的最短路径,得到一个距离向量 D x = [ D x ( y ) : y N ] D_x = [D_x(y): y \in N] ,然后与它的邻居交换彼此的向量,并将交换得到的向量带入 Bellman-Ford 方程中,试图更新自己的距离向量。如果从邻居获得的距离向量使得自己的距离向量得到更新,或直连链路费用发生变化导致自己的距离向量得到更新,那么结点 x 会向每个邻居发送更新后的距离向量。重复执行直到收敛。

因此,每个结点 x 维护下列路由选择信息:

  • 结点 x 到每个邻居 v 的费用 c(x, v)
  • 结点 x 的距离向量,包含了 x 到N 中所有目的地 y 的费用的估计值
  • 结点 x 的每个邻居的距离向量,即对 x 的每个邻居 v,有 D v = [ D v ( y ) : y N ] D_v = [D_v(y): y \in N]

在这里插入图片描述

总的来说,只要每个结点的距离向量发生变化,就向邻居发送自己的向量,并用从邻居接收到的向量更新自己的向量。重复这个过程,所有结点的向量就会趋向收敛。最终所有结点都不再发送自己的向量,算法自我终止。

在这里插入图片描述

DV 算法同样有缺陷。假设链路费用改变,若是由高费用转为低费用,那么结点很容易更新它自己的距离向量,并分发给邻居,邻居很快也能更新自己的向量,找到最低费用。若是由低费用转为高费用,事情就不一样了。

在这里插入图片描述

以上图为例,假设我们只关注 y 与 z 到达目的地 x 的情况,初始时, d y ( x ) = 4 , d y ( z ) = 1 , d z ( x ) = 1 , d z ( x ) = 5 d_y(x)=4, d_y(z)=1, d_z(x)=1, d_z(x)=5 ,此为已收敛的状态。某一时刻,y 到 x 的链路费用由 4 变为 60,y 探测到了该变化,并用此更新自己的向量。此时,y 的向量告诉它,经过 z 能以 5 费用到达 x,加上 y 到达 z 的费用 1,那么 y 经过 z 到达 x 的费用为 6。y 将 60 与 6 相比,毫不犹豫地选择了 6,也就是选择了下一跳为 z,并将更新告知 z。但这显然是错误的,因为 z 到达 x 费用为 5 的前提是,z 经过 y 到达 x,并且是以 y 到 x 的链路费用为 4,即未发生变化。然而, 变化已经发生。接下来,z 收到 y 的向量,得知 y 到达 x 的费用更新了,变成了 6。z 将 z 到 y 的费用与 y 到 x 的费用相加得到 7,与 50 相比,选择了 7,也就是选择了下一跳为 y。

就这样,产生了路由环路。y 与 z 反复相互选择,费用以每次更新加 1 的速度增长,直到 z 发现经过 y 到达 x 所需的费用超过了 z 直连 x 的费用。于是,z 选择直连,也就是选择了以费用 50 到达 x。此时,y 和 z 的向量都不再更新,而费用更新的次数高达 50-4=46 次。可以看出,当链路费用增长时,要收敛到正确的最低费用,需要的时间是非常漫长的。甚至,当出现特定的费用改变(如 c(y, x) 变为 10000,c(z, x) 变为 9999),还会产生无穷计数问题。

要解决这个特定的路由环路问题,可以采用毒性逆转,即如果 z 选择通过 y 到达目的地 x,则 z 将通告 y,z 到 x 的距离是无穷大,这样 y 和 z 就不会相互选择了。需要注意的是,毒性逆转只能解决上述特定的问题,对涉及三个或更多的结点的环路无能为力。

LS 与 DV 的比较
  • 报文复杂性。LS 要求每个结点都知道网络中每条链路的费用,所以共需发送 O ( N E ) O(NE) 个报文;DV 只有在结点自身的距离向量发生改变后才会发送报文。
  • 收敛速度。LS 的 Dijkstra 版本复杂度为 O ( n 2 ) O(n^2) ,经优化后可达到 O ( n log n ) O(n\log n) ;DV 收敛速度较慢,还有路由环路、无穷计数问题。
  • 健壮性。LS 的每个结点都相对独立地计算自己的转发表,部分路由器故障不会导致整个系统失效,具有一定的健壮性;DV 的每个结点都要与邻居交互,所以一旦一个路由器发生故障,就会将出错的数据传播到整个网络中,导致网络瘫痪。

4.6 因特网中的路由选择

层次路由选择

随着路由器的数目增多,在大规模范围内执行 LS 算法变得不切实际。同时,各个组织希望能够对各自的路由器实现管理自治。基于以上理由,出现了自治系统(AS),即一组处在相同管理控制下的路由器。在一个 AS 内运行的路由选择算法称为自治系统内部路由选择协议(如 RIP、OSPF),在 AS 间运行的使得相邻 AS 能够交换可达性信息的路由选择算法称为自治系统间路由选择协议(如 BGP4)。

因特网中自治系统内部的路由选择:RIP

路由选择信息协议(RIP)是一种距离向量协议,使用跳数作为其费用测度,即每条链路的费用为 1。与通常的跳概念不一样,RIP 中的一跳意味着一个子网到另一个子网,而非一台路由器到另一台路由器。一条路径的最大跳数被限制为 15,限定了 RIP 只能使用在网络直径不超过 15 跳的 AS 中。

在这里插入图片描述

RIP 中的路由器维护一张路由选择表,使用 RIP 响应报文(或称为 RIP 通告)来交换彼此到达 AS 内各子网的最短路径的估计值,以更新各自的路由选择表,大约每 30 秒交换一次。一台路由器一旦超过 180 秒没有从邻居收到报文,则该邻居被认为是不可达的。然后,路由器修改本地路由选择表,并向其他邻居通告该信息。路由器也可通过 RIP 请求报文,请求其邻居到指定目的地的费用,该报文使用 UDP 承载,端口号为 520。

因特网中自治系统内部的路由选择:OSPF

开放最短路优先(OSPF)的核心是一个使用洪泛链路状态信息的链路状态协议和一个 Dijkstra 最短路算法。也就是说,每个路由器构造了一棵以自身为根结点到所有子网的最短路径树。OSPF 的链路费用是由网络管理员配置的,因此,可以选择不同的机制。

OSPF 中的路由器在感知到链路状态变化时(如费用变化或连接状态变化),便会向所有其他路由器广播路由选择信息。即使链路状态未发生变化,它也要周期性(至少每隔 30 分钟一次)广播链路状态,以提高健壮性。OSPF 通告包含在 OSPF 报文中,直接由 IP 承载,对上层协议的值为 89。

OSPF 还能够在单个 AS 内组织起层次结构,划分的每个区域都执行自己的 OSPF 算法。在一个区域内,一台或多台区域边界路由器负责为流向该区域以外的分组提供路由选择,这些区域边界路由器(有时包括一些非边界路由器)组成了唯一的 OSPF 主干区域,为 AS 内其他区域之间的流量提供路由选择。于是,一个 AS 内跨 OSPF 区域的分组需要首先被路由到区域边界路由器,通过主干区域路由到目的区域的区域边界路由器,最终到达目的地。

OSPF 更为安全,能为每台路由器配置相同的口令(明文的或 MD5 加密的),以鉴别分组是否来自 AS 内部。

自治系统间的路由选择:BGP

边界网关协议(BGP)是当今因特网域间路由选择协议的标准。BGP 主要的工作有

  • eBGP 会话:从相邻 AS 处获得子网可达性信息
  • iBGP 会话:向本 AS 内部的所有路由器传播这些可达性信息
  • 基于可达性信息和 AS 策略,决定到达子网的 “好” 路由

在 BGP 中,路由器对通过使用 179 端口的半永久 TCP 连接来交换路由选择信息,在 AS 内部构成一个完全图,在 AS 间由网关路由器将不同 AS 相连。

BGP 使得每个 AS 知道经过其相邻 AS 可达哪些目的地,这些目的地并非主机,而是 CDIR 化的前缀,也就是子网或子网的集合(路由聚合的结果)。这个过程通过不同 AS 的网关路由器间的 eBGP 会话完成。接下来,这个学习到的前缀会通过 iBGP 会话传播给 AS 内部的其他路由器。于是,路由器可以在转发表为之创建一个表项。

BGP 会话所通告的路由,除了前缀还包括一些属性,较为重要的是 AS-PATH 和 NEXT-HOP。

  • AS-PATH:记录该通告已经通过的 AS 所构成的路径(AS 由自治系统号 ASN 标识)。每当通告传播到一个新的 AS,AS 就将自己的 ASN 加入到 AS-PATH 中,以预防循环通告。
  • NEXT-HOP:记录通告 AS 到被通告 AS 的网关路由器的接口的 IP。(说实话,我觉得本书写作/翻译最烂的部分就是 NEXT-HOP 的讲解,巨烂无比)

路由器添加转发表项时,可能面临多条到达相同目的地的路由通告,这时,就需要依次选择:

  1. 本地偏好值高的路由

  2. AS-PATH 路径短的路由

  3. NEXT-HOP 最近的路由

4.7 广播和多播路由选择

广播

广播即是从源点向网络中所有其他节点发送分组的服务。要实现广播,最 naïve 的想法就是用 N 次单播,但它除了简单以外一无是处:效率低(冗余副本)、预设发送方全知(所有接收方地址)。要得到可靠的实现方案,我们需要再次诉诸图论。

  1. 无控制洪泛

第二 naïve 的想法就是洪泛,即源结点和接收到广播分组的结点向其所有邻居发送分组的副本。它看起来简单优雅,实际暗藏杀机:它既容易导致路由环路,也容易导致无休无止的广播风暴。

  1. 受控洪泛

洪泛需要受到控制,网络才能不受其反噬。

序号控制洪泛中,地址和广播序号被填入广播分组,并且每个结点维护它已收到的、复制的和转发的分组源地址及其广播序号。当收到一个广播分组时,结点仅转发未被记录的分组,而丢弃已被记录的分组。简单来说,就是结点仅转发它没转发过的广播分组。

反向路径转发(RPF)中,当收到一个广播分组时,结点仅转发从自身到源结点的最短路径上来的分组,而丢弃其他路径上来的分组。思想很简单。于是,每个结点需要知道它到源结点的单播最短路上的下一个邻居结点,以此来决定分组的转发或丢弃。

在这里插入图片描述

  1. 生成树广播

虽然受控洪泛避免了广播风暴,但仍不能完全避免冗余分组。要解决冗余分组的问题,理想情况下,每个结点应当仅接收广播分组的一个副本。这很容易让我们想到最小生成树:一棵最小生成树拥有连通一个图的最少的边(如果我们把边权视为相同的话)。

于是,为网络对应的图构造一棵最小生成树,当有结点想要广播分组时,只向所有与自身相连的、属于生成树的链路发送分组(当然,不会向分组副本的发送方回送)。生成树不仅消除了冗余分组,还能够为整个网络所应用。

要构造一棵最小生成树,一种简单方法是基于中心的方法:首先定义一个中心结点(属于生成树的第一个结点),其他结点向中心结点单播加入树报文,当已经被纳入生成树的结点接收到一个加入树报文时,该加入树报文所经过的结点一并加入该生成树中,直到所有属于该网络的结点都已加入生成树。

多播

不搞了。

猜你喜欢

转载自blog.csdn.net/HNUCSEE_LJK/article/details/106444966