MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

网络层路由协议与路由选择算法

2021-10-105.1k 阅读

网络层路由协议概述

在计算机网络中,网络层的主要功能之一是将分组从源节点通过网络转发到目的节点。路由协议在这个过程中起着关键作用,它负责确定分组从源到目的的最佳路径。路由协议通过在网络节点(路由器等)之间交换路由信息,使得每个节点都能够了解网络的拓扑结构,进而计算出到达各个目的网络的最佳路径。

路由协议主要分为两大类:内部网关协议(IGP)和外部网关协议(EGP)。IGP用于在一个自治系统(AS)内部交换路由信息,常见的IGP包括路由信息协议(RIP)、开放最短路径优先(OSPF)协议等。EGP则用于在不同的自治系统之间交换路由信息,边界网关协议(BGP)是目前互联网中广泛使用的EGP。

自治系统(AS)

自治系统是指在一个共同的技术管理下的一组网络和路由器,这些网络和路由器在内部使用相同的IGP,对外使用相同的EGP。一个自治系统有自己独立的路由策略和管理,不同自治系统之间通过EGP进行路由信息的交换。例如,一个大型企业的内部网络可以看作一个自治系统,该企业通过BGP与其他自治系统(如互联网服务提供商的网络)进行连接和路由信息交互。

路由选择算法

路由选择算法是路由协议的核心,它决定了如何根据网络拓扑和链路状态等信息计算出最佳路径。常见的路由选择算法主要有距离 - 向量算法和链路 - 状态算法。

距离 - 向量算法

距离 - 向量算法基于每个节点维护一个距离向量,该向量记录了到其他各个目的节点的距离(通常以跳数、带宽、延迟等作为度量)。每个节点定期向邻居节点发送自己的距离向量,邻居节点根据收到的距离向量更新自己的距离向量。

  1. 工作原理:假设网络中有节点A、B、C。节点A维护一个距离向量表,记录到节点B和C的距离。当节点A收到节点B发送的距离向量表,其中包含B到C的距离,A就可以计算出通过B到达C的距离。如果这个距离比自己当前记录的到C的距离更短,A就更新自己到C的距离和下一跳(即B)。
  2. 示例代码(以Python模拟简单距离 - 向量算法)
import copy


# 初始化网络拓扑和距离向量
network = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2},
    'C': {'A': 4, 'B': 2}
}

distance_vectors = {
    'A': {'A': 0, 'B': 1, 'C': 4},
    'B': {'A': 1, 'B': 0, 'C': 2},
    'C': {'A': 4, 'B': 2, 'C': 0}
}


def update_distance_vector(node, network, distance_vectors):
    new_distance_vector = copy.deepcopy(distance_vectors[node])
    for neighbor, cost in network[node].items():
        neighbor_distance_vector = distance_vectors[neighbor]
        for destination, neighbor_cost in neighbor_distance_vector.items():
            total_cost = cost + neighbor_cost
            if destination not in new_distance_vector or total_cost < new_distance_vector[destination]:
                new_distance_vector[destination] = total_cost
    return new_distance_vector


# 模拟多次距离向量更新
for _ in range(3):
    for node in network.keys():
        distance_vectors[node] = update_distance_vector(node, network, distance_vectors)
    print("After update:")
    for node, dv in distance_vectors.items():
        print(f"{node}: {dv}")
  1. 优缺点
    • 优点:算法简单,易于实现和理解,适用于小型网络。
    • 缺点:收敛速度慢,在网络拓扑变化时,可能会产生路由环路问题。例如,在网络拓扑变化后,节点可能会相互通告错误的距离信息,导致分组在网络中循环转发,浪费网络资源。

链路 - 状态算法

链路 - 状态算法要求每个节点都掌握整个网络的拓扑结构信息。每个节点通过向其他节点发送链路状态通告(LSA)来广播自己与邻居节点的连接状态。

  1. 工作原理
    • 发现邻居:节点首先发现自己的邻居节点,并获取到与邻居节点之间的链路状态(如带宽、延迟等)。
    • 泛洪LSA:节点将自己的链路状态信息封装成LSA,然后通过泛洪的方式发送给网络中的其他所有节点。泛洪是指节点将LSA发送给所有邻居,邻居再转发给它们的邻居,直到所有节点都收到该LSA。
    • 构建拓扑图:每个节点根据收到的LSA构建整个网络的拓扑图。
    • 计算最佳路径:节点使用Dijkstra算法等在自己构建的拓扑图上计算到其他各个目的节点的最短路径。
  2. 示例代码(以Python实现简单链路 - 状态算法中的Dijkstra部分)
import heapq


def dijkstra(graph, start):
    distances = {node: float('inf') for node in graph}
    distances[start] = 0
    pq = [(0, start)]

    while pq:
        current_distance, current_node = heapq.heappop(pq)
        if current_distance > distances[current_node]:
            continue
        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(pq, (distance, neighbor))
    return distances


# 示例网络拓扑
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2},
    'C': {'A': 4, 'B': 2}
}

start_node = 'A'
result = dijkstra(graph, start_node)
print(f"Shortest distances from {start_node}: {result}")
  1. 优缺点
    • 优点:收敛速度快,能够快速适应网络拓扑的变化,并且不会产生路由环路。因为每个节点都有完整的网络拓扑信息,在计算路径时是全局最优的。
    • 缺点:算法复杂度较高,需要占用较多的内存和CPU资源来维护网络拓扑信息和进行路径计算。同时,泛洪LSA可能会在网络中产生较大的流量开销,特别是在大型网络中。

内部网关协议(IGP)

路由信息协议(RIP)

RIP是一种基于距离 - 向量算法的内部网关协议,它以跳数作为度量来衡量到达目的网络的距离。

  1. RIP的工作过程
    • 初始化:路由器启动时,将自己到直连网络的距离设为0,并向邻居路由器广播自己的路由表。
    • 路由更新:路由器定期(通常为30秒)向邻居路由器发送自己的路由表。邻居路由器收到路由表后,根据距离 - 向量算法更新自己的路由表。如果某个路由在180秒内没有收到更新,则将该路由标记为无效(距离设为16,RIP中16表示不可达)。
    • 拓扑变化处理:当路由器检测到网络拓扑变化(如链路故障)时,会立即更新自己的路由表,并向邻居路由器发送更新信息。
  2. RIP的配置示例(以Cisco路由器为例)
router rip
version 2
network 192.168.1.0
network 192.168.2.0

上述配置表示在路由器上启用RIP版本2,并宣告192.168.1.0和192.168.2.0两个网络参与RIP路由进程。 3. RIP的局限性

  • 最大跳数限制:RIP规定最大跳数为15,这意味着RIP只能适用于小型网络。如果网络的直径超过15跳,目的网络将被视为不可达。
  • 收敛速度慢:由于RIP基于距离 - 向量算法,在网络拓扑变化时收敛速度较慢,容易产生路由环路。
  • 度量单一:仅以跳数作为度量,没有考虑链路带宽、延迟等其他重要因素,可能导致选择的路径并非最优。

开放最短路径优先(OSPF)协议

OSPF是一种基于链路 - 状态算法的内部网关协议,它能够快速适应网络拓扑的变化,并且支持大规模网络。

  1. OSPF的区域划分:为了管理大型网络,OSPF将一个自治系统划分为多个区域。区域是一组相连的网络和路由器的集合。其中有一个骨干区域(Area 0),其他区域必须与骨干区域相连。区域的划分减少了LSA的泛洪范围,降低了路由器的负担。
  2. OSPF的工作过程
    • 邻居发现:路由器通过发送Hello报文来发现邻居路由器。Hello报文中包含路由器的ID、子网掩码、Hello间隔等信息。如果两台路由器的Hello报文中的相关参数匹配,则它们可以建立邻居关系。
    • 链路状态信息交换:邻居路由器之间通过交换数据库描述(DBD)报文来了解对方的链路状态数据库(LSDB)。然后,路由器根据DBD报文请求缺失的LSA,通过链路状态请求(LSR)报文和链路状态更新(LSU)报文来获取和更新自己的LSDB。
    • 路由计算:路由器使用Dijkstra算法在自己的LSDB上计算到各个目的网络的最短路径,并将这些路径添加到路由表中。
  3. OSPF的配置示例(以Cisco路由器为例)
router ospf 1
router - id 1.1.1.1
network 192.168.1.0 0.0.0.255 area 0
network 192.168.2.0 0.0.0.255 area 1

上述配置表示在路由器上启用OSPF进程1,设置路由器ID为1.1.1.1,并宣告192.168.1.0网络属于Area 0,192.168.2.0网络属于Area 1。 4. OSPF的优点

  • 快速收敛:基于链路 - 状态算法,能够快速感知网络拓扑变化并重新计算路由,收敛速度快。
  • 支持大规模网络:通过区域划分,有效地减少了LSA的泛洪范围,适用于大规模网络。
  • 灵活的度量:可以根据链路带宽、延迟等多种因素自定义度量值,选择更优的路径。

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

BGP是目前互联网上使用最广泛的外部网关协议,用于在不同的自治系统之间交换路由信息。BGP的主要目的是确保不同自治系统之间的可达性,并选择最佳的路径来转发跨自治系统的流量。

  1. BGP的基本概念
    • BGP邻居:运行BGP的路由器之间建立TCP连接(端口号179),并交换路由信息,这些路由器相互称为BGP邻居。BGP邻居可以分为内部BGP(iBGP)邻居和外部BGP(eBGP)邻居。iBGP邻居位于同一个自治系统内,eBGP邻居位于不同的自治系统。
    • BGP路径属性:BGP使用路径属性来描述路由的特性,例如起源(Origin)属性表示路由的起源方式,AS路径(AS - Path)属性记录了路由经过的自治系统序列等。这些路径属性用于BGP选择最佳路径。
  2. BGP的工作过程
    • 邻居建立:BGP路由器首先通过TCP连接与其他BGP路由器建立邻居关系。在建立连接过程中,路由器交换Open报文,协商BGP版本、自治系统号等参数。如果参数匹配,邻居关系建立成功。
    • 路由交换:邻居关系建立后,路由器通过Update报文交换路由信息。Update报文包含可达路由信息(Network Layer Reachability Information,NLRI)和相关的路径属性。
    • 路由选择:BGP路由器根据一系列规则(如AS路径最短、本地优先级高、MED值低等)从多条到达同一目的网络的路由中选择最佳路径,并将其加入到BGP路由表中。然后,BGP路由器将最佳路径通告给其他BGP邻居。
  3. BGP的配置示例(以Cisco路由器为例)
router bgp 65001
neighbor 192.168.1.2 remote - as 65002
network 10.0.0.0 mask 255.0.0.0

上述配置表示在路由器上启用BGP进程,自治系统号为65001,与192.168.1.2建立eBGP邻居关系(对方自治系统号为65002),并宣告10.0.0.0/8网络。 4. BGP的特点

  • 策略性路由:BGP允许自治系统根据自己的策略对路由进行过滤、修改路径属性等操作,从而灵活地控制网络流量。例如,一个自治系统可以根据与其他自治系统的商业关系,选择特定的路径来转发流量。
  • 支持大规模网络:BGP能够处理大量的路由信息,适合互联网这样的大规模网络环境。通过AS路径等属性,BGP可以避免路由环路的产生。

动态路由协议与静态路由的比较

  1. 动态路由协议的优点
    • 自动适应网络变化:能够自动感知网络拓扑的变化,如链路故障、新链路加入等,并及时更新路由表,确保网络的连通性。例如,当一条链路出现故障时,RIP或OSPF等动态路由协议能够快速找到替代路径。
    • 减少管理开销:对于大型网络,手动配置静态路由工作量巨大且容易出错。动态路由协议可以自动学习和更新路由,减少了网络管理员的配置工作。
  2. 动态路由协议的缺点
    • 占用网络资源:动态路由协议需要在网络中交换路由信息,会占用一定的带宽资源。例如,RIP的定期路由更新报文会在网络中产生额外的流量。同时,动态路由算法的计算也会占用路由器的CPU和内存资源。
    • 安全性问题:动态路由协议的路由信息交换可能存在安全风险,如恶意节点伪造路由信息,导致网络出现路由环路或流量被劫持等问题。
  3. 静态路由的优点
    • 安全性高:由于静态路由是手动配置的,不容易受到外部攻击。在对安全性要求较高的网络环境中,如军事网络,静态路由可以提供更高的安全性保障。
    • 不占用网络资源:静态路由不需要在网络中交换路由信息,不会产生额外的网络流量,也不会占用路由器过多的计算资源。
  4. 静态路由的缺点
    • 不适应网络变化:当网络拓扑发生变化时,需要手动重新配置静态路由。如果网络规模较大,拓扑变化频繁,这种方式很难及时响应,可能导致网络中断。
    • 配置复杂:对于大型网络,静态路由的配置工作量巨大,而且容易出错。每个路由器都需要详细配置到各个目的网络的路由,管理和维护成本较高。

在实际网络环境中,通常会根据网络的规模、安全性要求、拓扑变化频率等因素综合考虑使用动态路由协议和静态路由。例如,在企业网络的核心层,可能会使用动态路由协议(如OSPF)来快速适应网络变化;而在企业网络的边缘,连接一些相对稳定的外部网络时,可能会使用静态路由来提高安全性和减少资源消耗。