Network - 03.Network Layer-02
路由算法 (Routing Algorithms)
- 核心目标: 在网络中找到从源到目的地的最低成本路径。
- 抽象模型: 使用图论 来建模网络,其中 是路由器, 是链路, 是链路成本。
- 分类:
- 按信息范围:
- 全局 (LS): 所有路由器拥有完整的拓扑和成本信息(如 OSPF)。使用 Dijkstra 算法。
- 分散 (DV): 路由器只知道邻居信息,通过迭代交换信息(如 RIP)。使用 Bellman-Ford 方程。
- 按更新时机: 静态(变化慢)与动态(变化快)。
- 按信息范围:
链路状态 (LS) 路由
- 算法: Dijkstra 算法,计算从一个源到所有节点的最低成本路径。
- 特点: 需要全网广播链路状态信息。
- 问题: 可能发生路由震荡,尤其是在成本与流量相关时。
距离向量 (DV) 路由
- 算法: 基于 Bellman-Ford 方程的迭代、异步、分布式算法。
- 特点: 节点只维护到所有目的地的成本估计(距离向量),并与邻居交换。
- 问题: 坏消息传得慢,可能导致路由环路(计数到无穷)。解决方案包括毒性逆转。
互联网中的路由
- 分层结构: 由于互联网规模巨大且管理自治,采用分层路由,将路由器组织成自治系统 (AS)。
- AS 内部路由 (IGP): 在同一个 AS 内部运行,目标是找到最优路径。
- RIP: 简单的 DV 协议,基于跳数,每 30 秒广播。
- OSPF: 开放的 LS 协议,使用 Dijkstra,直接承载在 IP 上,支持分层(区域)。
- AS 间路由 (EGP): 在不同 AS 之间运行,目标是找到可达且符合策略的路径。
- BGP: 事实上的标准,基于路径向量,通过 TCP 会话(eBGP/iBGP)交换可达信息,并根据策略进行路由选择。
软件定义网络 (SDN)
- 核心思想: 控制平面与数据平面分离。控制平面是逻辑上集中的远程控制器 (软件),数据平面是简单的交换机硬件。
- 优势: 易于管理、开放性、灵活的流量工程。
- 架构:
- 应用层: 实现网络功能(路由、防火墙等)。
- 控制器层: 维护网络状态,提供北向和南向 API。
- 基础设施层: 数据平面交换机,根据流表转发。
- OpenFlow: 事实上的标准南向接口协议。核心是基于流表的广义转发(匹配+动作),统一了路由器、交换机、防火墙等设备的功能。
- 本质: 通过软件定义和可编程性,解耦软硬件,实现网络的深度可编程。
4.5 路由算法 (Routing Algorithms)
-
图抽象 (Graph Abstraction)
- 路由问题可以抽象为图论问题。
- 图 (Graph):
- N = 节点/路由器 (Nodes/Routers): 集合
- E = 链路 (Edges/Links): 路由器之间的连接,例如
- 链路成本 (Link Cost):
- 可以是 1(即计算跳数),也可以与带宽 (bandwidth) 或拥塞 (congestion) 程度成反比。
- 路径成本 (Path Cost): 路径上所有链路成本的总和。
- 路由算法 (Routing Algorithm): 找到源和目标之间的最低成本路径 (least-cost path)。
-
路由算法分类 (Classification)
按信息范围:- 全局 (Global) 算法 (又称: 链路状态 LS):
- 所有路由器拥有完整的拓扑 (topology) 和链路成本信息。
- 例如:链路状态 (Link State, LS) 算法。
- 分散 (Decentralized) 算法 (又称: 距离向量 DV):
- 路由器只知道其物理连接的邻居和到邻居的链路成本。
- 通过迭代计算和与邻居交换信息来工作。
- 例如:距离向量 (Distance Vector, DV) 算法。
按更新时机:
- 静态 (Static): 路由变化缓慢。
- 动态 (Dynamic): 路由变化迅速,可能是周期性更新或在链路成本变化时触发。
- 全局 (Global) 算法 (又称: 链路状态 LS):
4.5.1 链路状态 (Link State, LS) 路由算法
链路状态算法是一种全局性 (Global) 路由算法,要求网络中的每个节点在计算路径前,都必须掌握完整的网络拓扑结构和所有链路的成本 (Link Cost)。
1. 狄克斯特拉算法 (Dijkstra’s Algorithm)
这是 LS 路由最核心的算法,用于计算从一个源节点 (Source Node) 到网络中所有其他节点的最低成本路径 (Least-cost Path)。
算法符号定义:
- :从节点 到节点 的直接链路成本;如果不直接相连,则成本为 。
- :从源节点到目的节点 的当前路径成本。
- :从源到 的当前最低成本路径中, 的前驱节点 (Predecessor)。
- :当前已确定最低成本路径的节点集合。
算法执行步骤:
- 初始化 (Initialization):
- ( 为源节点)。
- 对于所有节点 :
- 如果 是 的邻居,则 。
- 否则,。
- 循环 (Loop):
- 在所有不在 中的节点中,找到一个具有最小当前成本 的节点 。
- 将 加入集合 。
- 更新 (Update):对于 的所有不在 中的邻居 ,更新其成本:
。- 含义:新成本是原到 的成本与“经过 到达 的成本”之间的最小值。
- 终止:当所有节点都已加入 时,算法结束。
2. 算法复杂度与特性
- 计算复杂度 (Computational Complexity):
- 对于拥有 个节点的网络,算法需要进行 次迭代。
- 每一轮迭代都需要搜索不在 中的节点以寻找最小值。
- 总搜索次数为 ,即算法复杂度为 ;若使用高效实现(如堆排序),可优化至 。
- 报文复杂度 (Message Complexity):
- 每个节点必须通过链路状态广播 (Link State Broadcast) 向全网所有其他节点发送其链路信息。
- 发送的消息数量级通常与节点数 和链路数 相关。
3. LS 算法的问题:路由震荡 (Oscillations)
如果链路成本是基于流量负载 (Load-sensitive) 定义的,LS 算法可能会导致路由震荡 (Oscillations)。
震荡过程示例:
- 假设路径 A 流量较轻,成本低,所有路由器计算后将流量全部切向 A。
- 由于所有流量都涌向 A,导致路径 A 变得极度拥塞,成本大幅上升。
- 在下一次算法计算中,路由器发现路径 B 的成本相对变低,于是所有流量又同时切向 B。
- 这种在不同路径间集体“跳跃”的行为即为震荡。
解决方案:
如果所有路由器都在同一时间间隔(例如每 30 秒)同步运行 Dijkstra 算法,它们会看到完全相同的“低成本”路径,并做出完全相同的决定。这种一致性的行为导致了流量的剧烈波动。
为了打破这种“集体行动”,通常采用以下策略:
- 计算时间随机化 (Randomize Algorithms Execution):
- 这是最实用的方案。通过让每个路由器运行 Dijkstra 算法的时间点随机错开,可以保证每次只有一部分路由器在改变路由决策。这样,流量会逐步、零散地向更优路径迁移,网络更有可能达到一个稳定的平衡点,而不是在两个极端间震荡。
- 平滑成本权重: 避免链路成本对流量变化过于敏感。例如,不直接使用瞬时负载,而是使用长期平均负载来计算成本,从而过滤掉短期波动对路由的影响。
4.5.2 距离向量 (Distance Vector, DV) 路由
距离向量算法是一种迭代的 (Iterative)、分布式的 (Distributed) 且异步的 (Asynchronous) 算法。与链路状态 (LS) 算法不同,它不需要节点了解全局网络拓扑,节点只需与邻居交换信息即可。
1. 贝尔曼-福特方程 (Bellman-Ford Equation)
这是 DV 算法的数学核心,利用了动态规划的思想。
方程表达式:
符号含义:
- :从源节点 到目的节点 的最低路径成本估计。
- : 的所有直连邻居。
- :从 到邻居 的直接链路成本。
- :从邻居 到目的节点 的最低路径成本估计。
逻辑: 节点 遍历所有邻居 ,计算“到邻居 的成本”与“从 到 的剩余成本”之和,取其中的最小值。
2. 路由器的内部存储结构:距离向量表
- 在 DV 算法中,每个节点 实际上维护的是一个二维矩阵(或多个向量的集合)。
- 自己的距离向量 ():这是一个一维数组,存储着节点 认为到网络中所有目的地 的当前最小成本。这是节点 对外通告的内容。
- 邻居的距离向量库 ():节点 会为每一个直接相连的邻居 开辟一块空间,专门记录邻居 上一次发过来的距离向量。
- 注意:这反映了“邻居认为它到目的地的距离”。
- 本地链路成本 ():节点 知道自己到所有直接邻居 的物理链路成本。
3. 详细的维护流程:三阶段迭代
- 第一阶段:等待 (Wait)
- 路由器大部分时间处于“休眠”状态,直到以下两种事件之一发生:
- 本地链路成本变化:节点 发现到某个邻居 的物理链路变快了、变慢了或断开了。
- 收到邻居的更新报文:邻居 发送了它最新的距离向量 过来。
- 路由器大部分时间处于“休眠”状态,直到以下两种事件之一发生:
- 第二阶段:重新计算 (Recompute) —— 执行Bellman-Ford方程
- 这是最核心的维护步骤。每当上述事件发生,节点 就会重新计算它到所有目的地 的最小成本 。
- 计算逻辑如下:
- 对于每一个目的地 ,节点 会扫描它所有的邻居 ,并计算:$$d_x(y) = \min_{v} { c(x,v) + d_v(y) }$$
- 是我到邻居的距离(本地已知)。
- 是邻居上次告诉我的,它到目的地的距离(从缓存中取)。
- 结果:节点 选出那个能让总和最小的邻居 ,作为通往 的下一跳 (Next Hop),并更新自己的 。
- 第三阶段:通知 (Notify) —— 增量传播
- 触发条件:只有当节点 重新计算后的 发生了变化(即发现了一条更优路径或原路径变差了),它才需要行动。
- 动作:将更新后的 向量(包含到所有目的地的最新估计)打包发送给所有直接相邻的邻居。
- 结果:邻居收到后,又会进入它们自己的“第二阶段”,从而形成连锁反应。
4. DV 维护的关键特性
- 异步性 (Asynchronous)
- 节点之间不需要“对表”。A 节点可以现在计算,B 节点可以 10 秒后收到后再计算。信息是在网络中像波浪一样传播的。
- 分布式 (Distributed)
- 每个节点只根据:本地已知的链路成本 ,邻居传来的二向信息
- 进行计算。它永远不知道完整的网络长什么样(例如它不知道邻居后面还连了谁,它只相信邻居给的数字)。
- 迭代收敛
- 只要网络拓扑不再发生变化,这些节点就会不断地互相交换向量。每一次交换,节点都会获得更远的路径信息。
- 第一次迭代:获得 1 跳范围内的路径。
- 第二次迭代:获得 2 跳范围内的路径。
- 以此类推,直到所有节点的路由表都不再变化(达到不动点),此时网络达到收敛 (Convergence) 状态。
- 只要网络拓扑不再发生变化,这些节点就会不断地互相交换向量。每一次交换,节点都会获得更远的路径信息。
5. 路由环路与“计数到无穷”问题
DV 算法存在一个显著缺陷,即信息的传播是非对称的。
- 好消息传得快 (Good news travels fast):
- 当某条链路成本降低时,这种“好消息”会迅速通过邻居间的更新在全网收敛。
- 坏消息传得慢 (Bad news travels slow):
- 当链路成本大幅增加或失效时,可能会产生路由环路 (Routing Loop)。
- 当路径变差或中断时,节点会倾向于寻找“替代路径”。由于它们没有全局视角,往往会误把原本就经过自己的路径当成替代路径,从而陷入互相欺骗的死循环。
“计数到无穷 (Count-to-Infinity)”示例:
- 假设路径 ,原本 通过直接链路到 的成本为 , 通过 到 的成本为 。
- 若 变为 。 更新时,会看到 曾通告过“我到 的成本是 ”。
- 误以为可以通过 到达 ,于是计算 。
- 随后 发现 的成本变了,又更新自己的 。
- 这种错误的更新会在 和 之间往复,直到成本值增加到定义的“无穷大”(如 RIP 协议中规定的 16 跳)为止。如果 和 每 30 秒交换一次数据,从 5 数到 16 需要好几分钟。在这几分钟里,去往 的数据包会在 和 之间不停地打转(环路),直到丢包。这就是所谓的收敛极慢。
6. 解决方案:毒性逆转 (Poisoned Reverse)
为了解决这种两个节点间的路由环路,引入了“毒性逆转”规则:
- 核心思想:如果节点 经过邻居 到达目的地 ,那么 向 通告路径信息时,会谎称其到 的距离为无穷大 ()。
- 效果:这样 在链路成本增加时,就不会试图通过 去寻找通往 的路径,从而打破了 和 之间的循环依赖。
- 局限性:毒性逆转只能解决涉及两个直接相邻节点的环路,无法完全消除涉及三个或更多节点的复杂环路。
7. LS 与 DV 算法对比
| 特性 | 链路状态 (LS) | 距离向量 (DV) |
|---|---|---|
| 拓扑知识 | 全局 (获取全网地图) | 局部 (仅知邻居) |
| 消息传递 | 泛洪广播 (对全网发送) | 仅与邻居交换信息 |
| 收敛速度 | 快 | 慢 (且可能产生环路) |
| 鲁棒性 | 节点可能广播错误的链路成本 | 节点可能广播错误的路径成本 (错误会扩散) |
4.5.3 分层路由 (Hierarchical Routing)
-
动机: 在理想的小型实验网络中,我们可以用 Dijkstra 或 Bellman-Ford 算法算出所有路径。但在现实的互联网中,有两个无法逾越的障碍:
- 规模 (Scale): 互联网的规模巨大,单个路由器无法存储所有目的地的路由表。路由算法的计算开销也会爆炸。每当一个偏远地区的链路断开,全球所有路由器都要重新计算,这会造成网络带宽被路由更新信息占满。
- 管理自治 (Administrative Autonomy): 互联网是“网络的网络”,每个网络(公司、大学)希望有权决定自己内部使用什么协议,并且不希望外界知道自己内部详细的网络拓扑。
-
解决方案: 将路由器组织成自治系统 (Autonomous Systems, AS)。
-
AS (自治系统): 一个 AS 通常是由某个管理机构(如一个 ISP 或一个大型企业)控制的一组路由器。
- 每个全球可达的 AS 都有一个唯一的编号(AS Number)。
- 内部路由被隐藏在 AS 内部。外界只看到这个 AS,而看不到 AS 里面的具体路由器。
-
AS 内部路由 (Intra-AS Routing / IGP):
- 也称为内部网关协议 (Interior Gateway Protocols, IGP)。
- 在同一个 AS 内部运行,所有路由器运行相同的协议。管理员可以随意更换协议,不影响外界。
- 目标: 在 AS 内部找到最优路径。追求性能最大化。
- 协议: RIP, OSPF, IGRP (Cisco 专用)。
-
AS 间路由 (Inter-AS Routing / EGP):
- 也称为外部网关协议 (Exterior Gateway Protocols, EGP)。
- 在不同 AS 之间运行。
- 目标: 在 AS 之间找到可达的、符合策略的路径。
- 协议: BGP(Border Gateway Protocol)。GP 负责把分散的 AS 粘合成一个整体的互联网。
-
网关路由器 (Gateway Router): 位于 AS 边缘,它一方面通过 IGP 知道 AS 内部的所有路径,另一方面通过 EGP 与其他 AS 的网关交流,了解如何到达全球其他地方。
-
热土豆路由 (Hot potato routing): 当一个 AS 决定如何将数据包发往 AS 外部时,它会将数据包转发给(AS 内部)路径成本最低的那个网关路由器,尽快将数据包“扔”出自己的网络。
4.6 互联网中的路由 (Routing in the Internet)
AS 内部路由协议 (IGP)
4.6.1 RIP (Routing Information Protocol)
RIP 是互联网中最古老的内部网关协议 (IGP) 之一。它是一种典型的基于距离向量 (Distance Vector, DV) 算法的路由协议,设计目标是简单、易于实现,适用于小型、自治的网络环境。
- 核心度量标准:跳数 (Hop Count)
- 在 RIP 中,路径的“成本”仅由跳数 (Hops) 决定。
- 定义:从源到目的地经过的路由器数量。
- 计算:直连网络的跳数为 0,每经过一个路由器,跳数加 1。
- 局限性:由于只看跳数,不考虑链路的带宽、延迟或拥塞情况。例如,一条经过 2 个路由器的 10M 链路在 RIP 看来,优于经过 3 个路由器的 1000M 链路。
- 在 RIP 中,路径的“成本”仅由跳数 (Hops) 决定。
- 最大跳数与“无穷大”
- 为了解决距离向量 DV 算法中“计数到无穷”问题,RIP 引入了硬性的规模限制:
- 最大有效跳数:15 跳。
- 不可达标识:16 跳被定义为无穷大 (),表示目的地不可达。
- 设计意图:这限制了 RIP 只能在小型局域网或企业网中使用(直径不能超过 15 个路由器)。
- 路由通告 (Advertisements) 机制
- RIP 路由器通过定期交换信息来同步路由表。
- 周期性更新:大约每 30 秒,路由器会向邻居发送其完整的路由表副本。
- 通告内容:被称为 RIP 响应报文 (Response Message) 或 RIP 广告 (Advertisement),包含了一组 (目的地, 跳数) 的列表。
- 传输协议:RIP 报文封装在 UDP 数据报中,使用 520 端口。虽然它运行在应用层,但其目的是为了配置网络层的转发表。
- 链路失效与容错
- RIP 通过超时机制来判断邻居是否发生故障:
- 180 秒超时:如果一个路由器在连续 180 秒(即 6 个更新周期)内没有收到来自某个邻居的通告,则认为该邻居已失效。
- 应对措施(在一次播报中):
- 路由毒化:路由器会将经过该邻居的所有路径成本设为 16(不可达),是发现故障后的紧急广播。
- 随后触发毒性逆转 (Poisoned Reverse) 机制,防止产生环路。这是一条专门针对“下一跳”邻居的规则。如果路由器 A 经过邻居 B 到达目的地 X,那么当 A 向 B 通告路由时,A 会告诉 B:“我到 X 的距离是 16(无穷大)”。
- 协议的实现:routed 进程
- RIP 通常不是直接硬编码在路由器的内核硬件中,而是作为一个软件进程运行。
- 实现形式:在 Unix/Linux 系统中,该进程通常被称为
routed(Route Daemon)。 - 工作逻辑:
routed进程在应用层维护路由信息。- 它监听 UDP 520 端口的更新消息。
- 根据收到的信息计算出最优路径后,通过系统调用更新操作系统内核中的 IP 转发表 (Forwarding Table)。
- RIP 的优缺点总结
| 优点 | 缺点 |
|---|---|
| 配置极其简单:几乎不需要手动干预。 | 收敛速度慢:遇到故障时需要“计数到 16”,反应迟钝。 |
| 资源消耗低:对 CPU 和内存的要求很小。 | 规模受限:无法支持超过 15 跳的大型网络。 |
| 易于理解:基于简单的跳数逻辑。 | 路由选择不合理:忽略了链路带宽等关键性能指标。 |
虽然 DV 算法理论上提倡“有变化才更新”,但 RIP 协议作为工业实现,必须结合 定期更新(每 30 秒一次)和 触发更新 (Triggered Update) 来确保系统的稳定性,其核心原因如下:
容错机制 (Fault Tolerance): > RIP 报文封装在 UDP 数据报中。由于 UDP 是不可靠传输,如果仅依赖一次性的“触发更新”且该报文在网络中丢包,接收方将永远无法获知路径变化。定期更新提供了强制同步的“兜底”机制。
存活检测 (Heartbeat / 活性检测): > RIP 协议没有专门的
Hello报文(心跳包)。路由器通过是否能按时收到邻居的定期路由通告来判断其存活状态。若连续 180 秒(即 6 个周期)未收到信息,则判定邻居失效并进入容错处理。防止静默状态 (Preventing Silence): > 在分布式系统中,定期通告能确保全网始终处于活跃的同步状态,避免因长时间无消息而无法区分“网络稳定”与“节点死机”。
总结: RIP 通过“触发更新”追求响应速度,通过“定期更新”解决 UDP 丢包及邻居状态监测的现实问题,二者相辅相成。
4.6.2 OSPF (Open Shortest Path First)
OSPF 是目前互联网中最广泛使用的内部网关协议 (IGP)。它克服了 RIP 的许多限制,适用于大型、复杂的企业级网络。
1. 基本特性
- 算法类型:基于链路状态 (Link State, LS) 路由算法,核心是 Dijkstra 算法。
- “开放” (Open):表示该协议是公开发布的 IETF 标准(RFC 2328),任何厂商的路由器都可以实现并互相通信,而不像 Cisco 的 IGRP 是私有的。
- 收敛速度:由于每个路由器都掌握全网拓扑,一旦链路状态发生变化,收敛速度远快于 RIP,且不会产生环路。
2. 链路状态通告 (LSA) 与泛洪 (Flooding)
- 工作机制:当链路状态(如开启、断开、成本变化)发生改变时,路由器会产生 LSA (Link State Advertisement)。
- 泛洪 (Flooding):LSA 会被发送给 AS 内的所有其他路由器。这意味着 AS 内的每一个路由器都拥有一张完全相同的、完整的全网地图(链路状态数据库)。
- 更新触发:除了定时刷新外,一旦状态变化立即触发更新,保证了信息的一致性。
3. 协议栈位置:直接承载于 IP
- 传输方式:与 RIP 使用 UDP 不同,OSPF 报文直接承载在 IP 数据报中。
- 协议号:IP 首部的协议字段值为 89。
- 设计意图:不使用 TCP 或 UDP 是为了减少开销,并确保在传输层协议尚不可用或不稳定的情况下,路由信息仍能高效传递。
4. 高级特性
- 安全性 (Security):OSPF 支持认证机制。路由器之间交换的报文可以经过 MD5 等算法加密,防止恶意攻击者伪造路由信息。
- 多倍路径允许 (ECMP):如果到目的地有多条成本相同的路径,OSPF 允许流量在这几条路径上进行负载均衡,而 RIP 只能选一条。
- 服务质量 (QoS):支持针对不同的 TOS (服务类型) 计算不同的链路成本。
5. 分层 OSPF (Hierarchical OSPF)
为了在大规模自治系统 (AS) 中限制泛洪带来的开销(避免成千上万台路由器同时泛洪造成网络瘫痪),OSPF 引入了区域化管理:
- 区域 (Areas):将一个大的 AS 划分为多个小的逻辑块。
- 泛洪限制:链路状态的详细信息只在区域内部泛洪。
- 路由汇总:区域内部的拓扑对外部不可见,只向外通告汇总后的路径。
- 骨干区域 (Backbone Area / Area 0):
- 它是分层结构的核心,所有非骨干区域必须物理上或逻辑上连接到骨干区域。
- 作用:负责在不同非骨干区域之间中转路由信息。
- 区域边界路由器 (Area Border Routers, ABR):
- 位于区域边缘的“外交官”,同时连接骨干区域和其他区域。
- 职责:将本区域的路由信息汇总后发给骨干区域,或者将其他区域的信息带回本区域。
- AS 边界路由器 (ASBR):
- 负责连接当前的 OSPF AS 与其他的 AS(如运行 BGP 的网络)。
6. OSPF 与 RIP 的对比总结
| 特性 | RIP | OSPF |
|---|---|---|
| 算法 | 距离向量 (DV) | 链路状态 (LS) |
| 度量标准 | 跳数 (最大15) | 成本 (通常基于带宽) |
| 收敛速度 | 慢 (可能环路) | 快 |
| 分层支持 | 不支持 | 支持 (Area 分层) |
| 协议承载 | UDP (端口 520) | IP (协议号 89) |
AS 间路由协议 (EGP)
4.6.3 BGP (边界网关协议)
BGP 是互联网中唯一的 AS 间 (Inter-AS) 路由协议,负责将全球数万个自治系统“粘合”在一起。
1. 核心定位
- 目标:不仅寻找路径,更重要的是根据策略 (Policy) 实现子网的可达性 (Reachability)。
- 连接方式:基于 TCP (端口 179) 的半永久连接,称为 BGP 会话。
2. 两种会话类型
- eBGP (External BGP):用于不同 AS 之间,从邻居 AS 获取路由信息。
- iBGP (Internal BGP):用于同一 AS 内部,将从外部学到的路由信息分发给 AS 内的所有路由器。
3. 关键路径属性 (Attributes)
- AS-PATH:记录路由经过的所有 AS 编号。
- 作用:检测环路(若看到自己 AS 编号则拒绝);选择较短路径。
- NEXT-HOP:指向通往目的地的下一个具体 IP 地址(通常是相邻 AS 的网关接口)。
4. 路由选择标准 (优先级排序)
BGP 并不简单看跳数或带宽,而是按以下顺序选择:
- 本地偏好 (Local Preference):由管理员设置,基于政策或经济协议(最高优先级)。
- 最短 AS-PATH:经过的自治系统数量最少。
- 热土豆路由 (Hot Potato Routing):选择距离本 AS 内部出口最近(IGP 成本最低)的网关。
- 其他准则(如 BGP 标识符 ID 等)。
5. 总结:IGP vs BGP
- IGP (OSPF/RIP):在 AS 内部运行,关注性能(快)。
- BGP:在 AS 之间运行,关注策略(商业/安全/可达性)。
软件定义网络 (Software Defined Networking, SDN)
1. 传统路由 vs. SDN
- 传统路由 (Per-router control plane):
- 控制平面 (Control Plane)(运行路由算法如 OSPF, BGP)和数据平面 (Data Plane)(根据转发表转发数据包)被紧密耦合在同一台路由器中。
- 路由器是“整体式”的、封闭的、专有的(如 Cisco IOS)。
- SDN (Logically centralized control plane):
- 控制平面与数据平面分离 (Separation)。
- 数据平面: 由简单的、“哑”的交换机硬件组成。
- 控制平面: 是一个逻辑上集中 (logically centralized) 的远程控制器 (Remote Controller),它是一个软件程序。
- 控制器负责计算转发表,然后将转发表分发到数据平面的交换机上。
2. 为什么需要 SDN?
- 易于网络管理: 集中式编程比在每台路由器上配置分布式算法更容易,可以避免配置错误。
- 开放性 (Open): 打破了传统路由器厂商的“垂直集成”和“封闭”系统(类比大型机 vs. PC)。
- 灵活的流量工程 (Traffic Engineering):
- 传统路由(LS, DV)很难实现精细的流量控制(例如,将 u-z 的流量一半走 uvwz,一半走 uxyz)。
- 使用 SDN,控制器可以显式地编程任何它想要的路径。
3. SDN 架构
- 网络控制应用 (Control Applications):
- SDN 的“大脑”,实现路由、负载均衡、防火墙等逻辑。
- SDN 控制器 (SDN Controller / Network OS):
- 维护网络状态(拓扑、交换机信息、流表)。
- 为上层应用提供 北向接口 (Northbound API)。
- 通过 南向接口 (Southbound API) 与交换机通信。
- 数据平面交换机 (Data-plane Switches):
- 根据控制器下发的流表 (Flow tables) 进行转发。
4. OpenFlow (南向接口)
- OpenFlow 是 SDN 中事实上的标准南向接口协议。
- 核心思想: 基于流 (flow-based) 的广义转发 (generalized forwarding)。
- 流表 (Flow Table):
- 匹配 (Pattern): 匹配数据包头部的多个字段(L2 MAC, L3 IP, L4 Port 等)。
- 动作 (Actions): 转发 (forward)、丢弃 (drop)、修改 (modify) 或发送到控制器 (send to controller)。
- OpenFlow 统一了多种设备:
- 路由器: 匹配目的 IP -> 动作:转发。
- 交换机: 匹配目的 MAC -> 动作:转发/泛洪。
- 防火墙: 匹配 IP/Port -> 动作:允许/拒绝。
- NAT: 匹配 IP/Port -> 动作:重写地址/端口。
- OpenFlow 协议消息:
- 控制器 -> 交换机:
Modify-state(添加/删除流表项),Packet-out(将一个特定数据包从指定端口发出)。 - 交换机 -> 控制器:
Packet-in(收到一个无法匹配流表的包,请求控制器指示),Port-status(报告端口/链路故障)。
- 控制器 -> 交换机:
5. “软件定义” (Software Defined) 的本质
- 定义: 用软件去定义系统的功能,用软件给硬件赋能。
- 本质: “深度”可编程。将原来硬件中“写死”的功能,以软件可编程的方式来实现。
- API: 解除了软硬件之间的耦合关系。
- 类比: 操作系统、虚拟机 (VM)、容器 (Containers)、智能手机(相对于功能机)都是“软件定义”思想的体现。