文章目录
- 前言
- [网络层: 控制平面](#网络层: 控制平面)
-
- 路由选择算法
- [因特网中自治系统内部的路由选择: OSPF](#因特网中自治系统内部的路由选择: OSPF)
- [ISP 之间的路由选择: BGP](#ISP 之间的路由选择: BGP)
-
- [BGP 的作用](#BGP 的作用)
- [通告 BGP 路由信息](#通告 BGP 路由信息)
- 确定最好的路由
- [IP 任播](#IP 任播)
- 路由选择策略
- 拼装在一起:在因特网中呈现
- 参考目录
前言
阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
本文是关于《计算机网络:自顶向下方法(第七版)》的学习分享,内容书写顺序也是按照书中的顺序。本文并不会提及书中的所有内容,主要写重点的知识,以及自己感兴趣的内容。会对原文中的内容进行一定的精简,或者加上个人的理解。
网络层: 控制平面
路由选择算法
路由选择算法其目的是从发送方到接收方的过程中确定一条通过路由器网络的好路径。通常, 一条好路径指具有最低开销的路径。我们知道图G = (N, E)是一个N个节点和E条边的集合,其中每条边是取自 N的一对节点。 在网络层路由选择的环境中, 图中的节点表示路由器,这是做出分组转发决定的点;连接这些节点的边表示这些路由器之间的物理链路。如下图举例

一条边还有一个值表示它的开销。 通常, 一条边的开销可反映出对应链路的物理长度(例如一条越洋链路的开销可能比一条短途陆地链路的开销高)、链路速度,或与该链路相关的金钱上的开销。为了简化,我们将这些链路开销看成是给定的,而不必操心这些值是如何确定的。 对于E中的任一条边(x, y) 我们用 c(x, y) 表示节点x和y间 边的开销。 如果节点对 (x,y) 不属于E, 则置c(x, y) = ∞ 。 此外,我们在这里考虑的都是无向图(即图的边没有方向),因此边(x, y) 与边 (y,x) 是相同的。并且c(x, y) =c(y, x) 。 然而,我们将学习的算法能够很容易地扩展到在每个方向有不同开销的有向图中。 同时,如果 (x, y) 属于 E, 节点y 也被称为节点x 的邻居。在图中为各条边指派了开后,路由选择算法的天然目标是找出从源到目的地间的最低开销路径。
一般而言,路由选择算法的一种分类方式是根据该算法是集中式还是分散式来划分。
- 集中式路由选择算法用完整的、全局性的网络知识计算出从源到目的地之间的最低开销路径。 也就是说,该算法以所有节点之间的连通性及所有链路的开销为输入。 这就要求该算法在真正开始计算以前,要以某种方式获得这些信息。 计算本身可在某个场点(例如逻辑集中式控制器)进行,或在每台路由器的路由选择组件中重复进行 。主要在于,集中式算法具有关于连通性和链路开销方面的完整信息。具有全局状态信息的路由选择算法常被称作链路状态算法
- 分散式路由选择算法,路由器以迭代、分布式的方式计算出最低开销路径。 没有节点拥有关于所有网络链路开销的完整信息。相反, 每个节点仅有与其直接相连链路的开销知识即可开始工作。 然后,通过迭代计算过程以及与相邻节点的信息交换, 一个节点逐渐计算出到达某目的节点或一组目的节点的最低开销路径。
路由选择算法的第二种广义分类方式是根据算法是静态的还是动态的进行分类。 静态路由选择算法,路由随时间的变化非常缓慢,通常是人工进行调整(如人为手工编辑一条链路开销)。 动态路由选择算法随着网络流量负载或拓扑发生变化而改变路由选择路径。 一个动态算法可周期性地运行或直接响应拓扑或链路开销的变化而运行。 虽然动态算法易于对网络的变化做出反应,但也更容易受诸如路由选择循环、路由振荡之类问题的影响。
路由选择算法的第三种分类方式是根据它是负载敏感的还是负载迟钝的进行划分。 在负载敏感算法中,链路开销会动态地变化以反映出链路的当前拥塞水平。 如果当前拥塞的一条链路与高开销相联系,则路由选择算法趋向于绕开该拥塞链路来选择路由。 当今的因特网路由选择算法(如 RIP、OSPF和 BGP) 都是负载迟钝的, 因为某条链路的开销不明确地反映其当前(或最近)的拥塞水平。
链路状态路由选择算法
在链路状态(LS)算法中,网络拓扑和所有的链路开销都是已知的,实践中这是通过让每个节点向网络中所有其他节点广播链路状态分组来完成的,其中每个链路状态分组包含它所连接的链路的标识和开销。在实践中这经常由链路状态广播算法来完成。 节点广播的结果是所有节点都具有该网络的统一、完整的视图。 于是每个节点都能够像其他节点一样,运行算法并计算出相同的最低开销路径集合。
我们下面给出的链路状态路由选择算法叫作Dijkstra 算法,该算法以其发明者命名。该算法计算从某节点(源节点,我们称之为u) 到网络中所有其他节点的最低开销路径。算法是迭代算法,其性质是经算法的第k次迭代后,可知道到k个目的节点的最低开销路径,我们定义下列记号。
- D(v): 到算法的本次迭代,从源节点到目的节点v 的最低开销路径的开销。
- p(v) : 从源到 v 沿着当前最低开销路径的前一节点 (v 的邻居)。
- N': 节点子集;如果从源到 v 的最低开销路径已确知, v在N'中。
该集中式路由选择算法由一个初始化步骤和其后的循环组成。 循环执行的次数与网络中节点个数相同。一旦终止,该算法就计算出了从源节点u到网络中每个其他节点的最短路径。
bash
Initialization:
N'= {u}
for all nodes v
if v is a neighbor of u
then D(v) = c(u,v)
else D(v) = oo
Loop
find w not in N'such that D(w) is a minimum
add w to N'
update D(v) for each neighbor v of w and not in N':
D(v) = min(D(v), D(w}+ c(w,v))
/* new cost to vis either old cost to v o工 known
least path cost tow plus cost from w to v */
until N'= N
举一个例子,考虑前文图中的网络,计算从u到所有可能目的地的最低开销路径。 该算法的计算过程以表格方式总结于下表中, 表中的每一行给出了迭代结束时该算法的变量的值。

- 在初始化步骤,从u 到与其直接相连的邻居v、x、 w的当前已知最低开销路径分别初始化为2、 1 和5。 值得注意的是,到w的开销被设为5 (尽管我们很快就会看见确实存在一条开销更小的路径),因为这是从u 到 w 的直接(一跳)链路开销。 到y与z的开销被设为无穷大,因为它们不直接与u连接。
- 在第一次迭代中,我们观察那些还未加到集合N'中的节点, 并且找出在前一次迭代结束时具有最低开销的节点。 那个节点便是x,其开销是 1。因此x被加到集合N' 中。 于是算法中的第 12 行中的程序被执行, 更新所有节点v 的 D(v), 产生表中第2 行(步骤1 ) 所示的结果。 到v 的路径开销未变。 经过节点x到w(在初始化结束时其开销为5) 的路径开销被发现为4。 因此这条具有更低开销的路径被选中,且沿从u开始的最短路径上w的前一节点被设为x。类似地,到y (经过x) 的开销被计算为2, 且该表也被相应地更新。
- 在第二次迭代时,节点v与y被发现具有最低开销路径 (2) , 我们将y加到集合N'中,使得N'中含有u、x和y。 到仍不在N'中的其余节点(即节
点v、 w 和z) 的开销通过算法中的第 12 行进行更新,产生如表中第3 行所示的结果。 - 如此循环。
当 算法终止时,对于每个节点,我们都得到从源节点沿着它的最低开销路径的前一节点。 对于每个前一节点,我们又有它的前一节点,以此方式我们可以构建从源节点到所有目的节点的完整路径。
该算法的计算复杂性是什么?即给定n 个节点 (不算源节点),在最坏情况下要经过多少次计算,才能找到从源节点到所有目的节点的最低开销路径? 在第一次迭代中,我们需要搜索所有的n个节点以确定出不在N'中且具有最低开销的节点w。 在第二次迭代时,我们需要检查n-1 个节点以确定最低开销。 第三次对n-2个节点迭代,依次类推。 总之,我们在所有迭代中需要搜寻的节点总数为n(n+ 1)/2, 因此我们说前面实现的链路状态算法在最差情况下复杂性为O(n2)。
在完成算法的讨论之前,我们考虑一下可能出现的问题。 下图显示了一个简单的网络拓扑,图中的链路开销等于链路上承载的负载,例如反映要历经的时延。在该例中,链路开销是非对称的,即仅当在链路两个方向所承载的负载相同时链路开销才相等。 节点z产生发往w的一个单元的流量,节点x也产生发往w 的一个单元的流量,并且节点y也产生发往w 的一个数量为e的流量。 初始路由选择情况如图a所示,其链路开销对应于承载的流量。

当算法运行时,节点y确定顺时针到w 的路径开销为1,经过路径(y,z,w)。 而逆时针到w的路径开销是是1 +e,经过路径(y,x,w)。因此,最短路径发生了改变,节点传输流量的方向也发生了改变。当算法下次运行时,节点又发现原来方向的路径是最短开销路径,路径又发生了变化。
如何才能防止这样的振荡 (它不只是出现在链路状态算法中,而且也可能出现在任何使用拥塞或基于时延的链路测度的算法中)。 一种解决方案可能强制链路开销不依赖于所承载的流量,但那是一种不可接受的解决方案,因为路由选择的目标之一就是要避开高度拥塞(如高时延)的链路。 另一种解决方案就是确保并非所有的路由器都同时运行算法。
距离向量路由选择算法
距离向量(DV)算法是一种迭代的、异步的和分布式的算法,说它是分布式的,是因为每个节点都要从一个或多个直接相连邻居接收某些信息,执行计算,然后将其计算结果分发给邻居。 说它是迭代的,是因为此过程一直要持续到邻居之间无更多信息要交换为止。 说它是异步的,是因为它不要求所有节点相互之间步伐一致地操作。
在我们给出 DV算法之前,有必要讨论一下存在于最低开销路径的开销之间的一种重要关系, 令dx(y) 是从节点 x 到节点 y 的最低开销路径的开销。 则该最低开销与著名的Bellman- Ford 方程相关,即
d x ( y ) = m i n v ∣ c ( x , v ) + d v ( y ) ∣ dx(y) = minv | c(x,v) + dv(y) | dx(y)=minv∣c(x,v)+dv(y)∣
方程中的minv 是对于x 的所有邻居的。 Bellman-Ford 方程是相当直观的。 实际上,从x到v遍历之后,如果我们接下来取从v到y 的最低开销路径,则该路径开销将是c(x, v) + dx(y) 。 因此我们必须通过遍历某些邻居v开始,从 x 到 y 的最低开销是对所有邻居v的c( x,v) + dv(y)的最小值。
算法基本思想如下:
bash
在每个节点x:
Initialization:
for all destinations y in N:
Dx(y)= c(x,y) / * if y i s not a neighbor then c(x,y)= ∞ */
for each neighbor w
Dw(y) =? for all destinations y in N
for each neighbor w
send distance vector Dx = (Dx(y) : y in N] to w
loop
wait (until I see a link cost change to some neighbor w or
until I receive a distance vector from some neighbor w)
for each yin N:
Dx(y) = minv{c(x,v) + Dv(y}}
if Dx(y) changed for any destination y
send distance vector Dx = [Dx(y) : y in N] to all neighbors
forever
在该DV算法中,当节点x发现它的直接相连的链路开销变化或从某个邻居接收到一个距离向量的更新时,它就更新其距离向量估计值。 但是为了一个给定的目的地y而更新它的转发表,节点x真正需要知道的不是到y的最短路径距离,而是沿着最短路径到y的下一跳路由器邻居节点v。下一跳路由器v是在DV算法第14 行中取得最小值的邻居v。
下面举例说明DV算法的运行, 图中有三个节点的简单网络。 算法的运行以同步的方式显示出来,其中所有节点同时从其邻居接收报文,计算其新距离向量,如果距离向量发生了变化则通知其邻居。 学习完这个例子后,你应当确信该算法以异步方式也能正确运行,异步方式中可在任意时刻出现节点计算与更新的产生/接收。
该图最左边一列显示了这3个节点各自的初始路由选择表。 例如, 位于最左边的是每个节点到其直接相连邻居的开销。因为在初始化时每个节还没有从邻居那收到任何东西,所以表项中被初始化为无穷大。随后,每个节点向其邻居发送其开销表,图中的箭头说明了这一情况。在接收到该更新后,每个节点重新计算它自己的距离向量。 例如,节点x 计算

第二列距离表,每个节点显示了节点的新距离向量连同刚从它的邻居接收到的距离向量。 注意到,例如节点x到节点z的最低开销Dx(z) 已经从7变成了3。 在节点重新计算它们的距离向量之后,它们再次向其邻居发送它们的更新距离向量( 如果它们已经改变的话)。图中由从表第二列到表第三列的箭头说明了这一情况。 注意到仅有节点x和节点z发送了更新:节点y的距离向量没有发生变化,因此节点y没有发送更新。 在接收到这些更新后,这些节点则重新计算它们的距离向量并更新它们的路由选择表,这些显示在第三列中。

从邻居接收更新距离向量、重新计算路由选择表项和通知邻居到目的地的最低开销路径的开销已经变化的过程继续下去,直到无更新报文发送为止。 在这个时候,因为无更新报文发送,将不会出现进一步的路由选择表计算,该算法将进入静止状态,即所有的节点将执行等待。 直到一条链路开销发生改变,如下面所讨论的那样。
- 距离向量算法:链路开销改变与链路故障
当一个运行DV算法的节点检测到从它自己到邻居的链路开销发生变化时,它就更新其距离向量,并且如果最低开销路径的开销发生了变化,向邻居通知其新的距离向量。
如下图a所示,从 y 到x的链路开销从4 变为 1 。DV 算法导致下列事件序列的出现:
- 在t0 时刻, y检测到链路开销变化(开销从4 变为1) , 更新其距离向量,并通知其邻居这个变化,因为最低开销路径的开销已改变。
- 在 t1 时刻, z 收到来自 y 的更新报文并更新了其距离表。 它计算出到x 的新最低开销(从开销5 减为开销2), 它向其邻居发送了它的新距离向量。
- 在 t2 时刻, y 收到来自 z 的更新并更新其距离表、 y的最低开销未变,因此y不发送任何报文给z。 该算法进入静止状态。
因此, 对于该DV算法只需两次迭代就到达了静止状态。 在x与y之间开销减少的好消息通过网络得到了迅速传播

我们现在考虑一下当某链路开销增加时发生的情况。 假设x与y之间的链路开销从4增加到60, 如上图b所示。在链路开销变化之前, Dy(x) =4, Dy( z) = 1 , Dz(y) = 1 和 Dz(x) =5。 在 t0 时刻,y 检测到链路开销变化(开销从4变为60)。 y计算它到x 的新的最低开销路径的开销,其值为
D y ( x ) = m i n ∣ c ( y , x ) + D x ( x ) , c ( y , z ) + D z ( x ) ∣ = m i n ∣ 60 + 0 , 1 + 5 ∣ = 6 Dy(x) = min |c(y,x) + Dx(x), c(y , z) + Dz(x) | = min |60 + 0 , 1 + 5 | = 6 Dy(x)=min∣c(y,x)+Dx(x),c(y,z)+Dz(x)∣=min∣60+0,1+5∣=6
- LS 与 DV 路由选择算法的比较
LS 与 DV 路由选择算法采用互补的方法来解决路由选择计算问题。在DV算法中,每个节点仅与它的直接相连的邻居交谈,但它为其邻居提它所知道的所有其他节点的最低开销估计。LS算法需要全局信息。 因此,当在每台路由器中实现时,每个节点(经广播)与所有其他节点通信,但仅告诉它们与它直接相连链路的开销。
我们通过快速比较它们各自的属性来总结所学的:
- 报文复杂性。 我们已经看到 LS算法要求每个节点都知道网络中每条链路的开销。而且无论何时一条链路的开销改变时,必须向所有节点发送新的链路开销。 DV算法要求在每次迭代时,在两个直接相连邻居之间交换报文。算法收敛所需时间依赖于许多因素。 当链路开销改时, DV算法仅当在新的链路开销导致与该链路相连节点的最低开销路径发生改变时,才传播已改变的链路开销。
- 收敛速度。LS 算法的实现是一个O(n2) 复杂度的算法。DV 算法收敛较慢,且在收敛时会遇到路由选择环路。
- 健壮性。 如果一台路由器发生故障、行为错乱或受到蓄意破坏时情况会怎样呢?对于LS算法,路由器能够向其连接的链路广播不正确的开销。一个LS节点仅计算自己的转发表;其他节点也自行执行类似的计算。 路由计算在某种程度上是分离的,提供了一定程度的健壮性。在DV算法下,一个节点可向任意或所有目的节点通告其不正确的最低开销路径。每次迭代时,在DV算法中一个节点的计算会传递给它的邻居,然后在下次迭代时再间接地传递给邻居的邻居。 在此情况下, DV 算法中一个不正确的节点计算值会扩散到整个网络。
因特网中自治系统内部的路由选择: OSPF
在我们至今为止的算法研究中,我们将网络只看作一个互联路由器的集合。 从所有路由器执行相同的路由选择算法以计算穿越整个网络的路由选择路径的意义上来说,,一台路由器很难同另一台路由器区别开来。在实践中,该网络模型和这种一组执行同样路由选择算法的同质路由器集合的观点有一点简单化,有以下两个重要原因:
- 规模。 随着路由器数目变得很大,涉及路由选择信息的通信、计算和存储的开销将高得不可实现。 当今的因特网由数亿台主机组成。 在这些主机中存储的路由选择信息显然需要巨大容量的内存。 在所有路由器之间广播连通性和链路开销更新所要求的负担将是巨大的!在如此大量的路由器中迭代的距离向量算法将肯定永远无法收敛!显然,必须采取一些措施以减少像因特网这种大型网络中的路由计算的复杂性。
- 管理自治。每个 ISP都有它自己的路由器网络。 ISP通常希望按自己的意愿运行路由器 (如在自己的网络中运行它所选择的某种路由选择算法) ,或对外部隐藏其网络的内部组织面貌。 在理想情况下,一个组织应当能够按自己的愿望运行和管理其网络,还要能将其网络与其他外部网络连接起来。
这两个问题都可以通过将路由器组织进 自治系统(AS)来解决,其中每个AS 由一组处在相同管理控制下的路由器组成。某些一级ISP在其整个网络中使用一个庞大的 AS, 而其他ISP则将它们的 ISP拆分为数十个互联的AS。 一个自治系统有其全局唯一的AS号。在相同 AS 中的路由器都运行相同的路由选择算法并且有彼此的信息。 在一个自治系统内运行的路由选择算法叫作自治系统内部路由选择协议。
开放最短路优先 (OSPF)
OSPF 路由选择 与 其关系密切的协议 IS-IS 都被广泛用于因特网的 AS 内部路由选择。OSPF 中的开放是指路由选择协议规范是公众可用的。OSPF 是一种链路状态协议,它使用链路状态信息和 Dijkstra 最低开销路径算法。使用 OSPF, 一台路由器构建了一幅关于整个自治系统的完整拓扑图。于是,每台路由器在本地运行Dijkstra 的最短路径算法,以确定一个以自身为根节点到所有子网的最短路径树。 各条链路开销是由网络管理员配置的。 管理员也许会选择将所有链路开销设为1 , 因而实现了最少跳数路由选择,或者可能会选择将链路权值按与链路容量成反比来设置,从而不鼓励流量使用低带宽链路。
使用OSPF 时,路由器向自治系统内所有其他路由器广播路由选择信息,而不仅仅是向其相邻路由器广播。 每当一条链路的状态发生变化时(如开销的变化或连接/中断状态的变化),路由器就会广播链路状态信息。 即使链路状态未发生变化,它也要周期性地( 至少每隔30 min 一次)广播链路状态。
OSPF 的优点包括下列几方面:
- 安全。 能够鉴别 OSPF 路由器之间的交换(如链路状态更新)。 使用鉴别,仅受信任的路由器能参与一个AS 内的 OSPF 协议,因此可防止恶意入侵者(或正在利用新学的知识到处试探的网络专业的学生)将不正确的信息注入路由器表内。 在默认状态下,路由器间的 OSPF报文是未被鉴别的并能被伪造。能够配置两类鉴别,使用简单的鉴别.每台路由器配置相同的口令。 当一台路由器发送一个 OSPF分组,它以明文方式包括了口令。 显然,简单鉴别并不是非常安全。MD5 鉴别基于配置在所有路由器上的共享秘密密钥。 每个要发送的OSPF分组,发送路由器对附加了秘密密钥的 OSPF分组内容计算 MD5 散列值。 然后路由器将所得的散列值写入该 OSPF 分组中。接收路由器使用预配置的秘密密钥计算出该分组的 MD5 散列值,并与该分组携带的散列值进行比较,从而验证了该分组的真实性。 在 MD5 鉴别中也使用了序号对重放攻击进行保护。
- 多条相同开销的路径。 当到达某目的地的多条路径具有相同的开销时, OSPF允许使用多条路径(这就是说,当存在多条相等开销的路径时,无须仅选择单一的路径来承载所有的流量)。
- 对单播与多播路由选择的综合支持。
- 支持在单个 AS 中的层次结构。 一个 OSPF 自治系统能够层次化地配置多个区域,每个区域都运行自己的OSPF链路状态路由选择算法,区域内的每台路由器都向该区域内的所有其他路由器广播其链路状态。 在每个区域内, 一台或多台区域边界路由器负责为流向该区域以外的分组提供路由选择。 在 AS 中只有一个OSPF区域配置成主干区域。 主干区域的主要作用是为该AS 中其他区域之间的流量提供路由选择。 该主干包含本AS 中的所有区域边界路由器、并且可能还包含了一些非边界路由器。 在AS 中的区域间的路由选择要求分组先路由到一个区域边界路由器(区域内路由选择),然后通过主干路由到位于目的区域的区域边界路由器进而再路由到最终目的地。
OSPF 是一个相当复杂的协议,而我们这里的讨论是十分简要的
ISP 之间的路由选择: BGP
OSPF是一个AS 内部路由选择协议。 当在相同AS 内的源和目的地之间进行分组路由时,分组遵循的路径完全由 AS 内路由选择协议所决定。然而,当分组跨越不同AS进行路由时,我们需要一个自治系统间路由选择协议,AS 间路由选择协议涉及多个 AS 之间的协调。在因特网中,所有的AS运行相同的AS 间路由选择协议,称为边界网关协议 (Broder Gateway Protocol, BGP) 。
BGP 的作用
为了理解BGP 的职责所在,考虑一个AS和在该AS 中的任意一个路由器。 每台路由器具有一张转发表,该转发表在将到达分组转发到出路由器链路的过程中起着主要作用。对于位于相同 AS 中的目的地而言,在路由器转发表中的表项由 AS 内部路由选择协议所决定。 而对于位于该AS外部的目的地而言情况如何呢?这正是BGP用武之地。
在BGP 中,分组并不是路由到一个特定的目的地址,相反是路由到地址的前缀,其中每个前缀表示一个子网或一个子网的集合。在 BGP的世界中, 一个目的地可以采用138. 16. 68/22 的形式。因此, 一台路由器的转发表将具有形式为 (x,i) 的表项,其中x是一个前缀(例如 138. 16. 68/22) , i是该路由器其中的一个接口。
作为一种AS 间的路由选择协议, BGP使每台路由器能完成以下任务:
- 从邻居AS 获得前缀的可达性信息。 特别是, BGP允许每个子网向因特网的其余部分通告它的存在。 一个子网高声宣布"我存在,我在这里",而BGP确保在因特网中的所有 AS 知道该子网。 如果没有BGP 的话,每个子网将是隔离的孤岛,即它们孤独地存在,不为因特网其余部分所知和所达。
- 确定到该前缀的"最好的"路由。 一台路由器可能知道两条或更多条到特定前缀的不同路由。 为了确定最好的路由,该路由器将本地运行一个BGP路由选择过程。 该最好的路由将基于策略 以及 使用它经过相邻的路由器获得的前缀可达性信息来确定。
我们现在钻研BGP如何执行这两个任务。
通告 BGP 路由信息

如上图所示,这个简单的网络具有3 个自治系统:AS1 、 AS2 和 AS3。 AS3 中的3d路由器连接了一个具有前缀x 的子网。 对于每个 AS, 每台路由器要么是一台网关路由器、要么是一台内部路由器。网关路由器是一台位于AS边缘的路由器,它直接连接到在其他AS 中的一台或多台路由器。 内部路由器仅连接在它自己AS 中的主机和路由器。
我们考虑这样一个任务:向图 中显示的所有路由器通告对于前缀x 的可达性信息。 在高层次上,这是简明易懂的。 首先, AS3 向 AS2 发送一个BGP报文,告知x存在并且位于AS3 中;我们将该报文表示为 "AS3x''。 然后AS2 向 AS1 发送一个BGP报文,告知x存在并且能够先通过AS2 然后进入AS3 进而到达x; 我们将该报文表示为 "AS2AS3x"。 以这种方式,每个自治系统不仅知道x的存在,而且知道通向 x 的自治系统的路径。
在BGP中,每对路由器通过使用 179端口的半永久TCP 连接交换路由选择信息。 每条直接连接以及所有通过该连接发送的 BGP报文,称为BGP 连接。此外,跨越两个 AS 的 BGP 连接称为外部 BGP (eBGP) 连接,而在相同AS 中的两台路由器之间的 BGP会话称为内部 BGP(iBGP) 连接。
确定最好的路由
从一个给定的路由器到一个目的子网可能有多条路径。 事实上,因特网中的路由器常常接收到很多不同的可能路径的可达性信息。 一台路由器如何在这些路径之间进行选择(并且再相应地配置它的转发表)呢?
在处理这个关键性问题之前,我们需要引入几个 BGP术语。 当路由器通过BGP连接通告前缀时,它在前缀中包括一些BGP属性。用 BGP术语来说,前缀及其属性称为路由。 两个较为重要的属性是 AS-PATH 和 NEXT-HOP。 AS-PATH 用于记录某条路由从源自治系统(AS)到当前路由器所经过的所有 AS 编号序列。为了生成AS-PATH的值,当一个前缀通过某AS时,该AS将其ASN(AS序号)加入AS-PATH 中的现有列表。 例如,在上图中,从 AS1 到子网 x使用 AS-PATH "AS2 AS3''; BGP 路由器还使用 AS-PATH 属性来检测和防止环路;当 BGP 路由器收到一条路由更新,若发现 AS-PATH 中包含自己的 AS 号,则拒绝接收该路由,从而避免环路。NEXT-HOP用于指示到达某目标网络应转发的下一跳地址。
-
热土豆路由选择
终于到了以精确的方式来讨论BGP路由选择算法的时刻了。 我们将以一个最简单的路由选择算法开始,即热土豆路由选择。

考虑在上图网络中的路由器 1b。 如同刚才所述,这台路由器将学习到达前缀x 的两条BGP路由。 使用热土豆路由选择,(从所有可能的路由中)选择该路由的 NEXT-HOP 路由器具有最小开销。 在这个例子中,路由器 1b 将查阅它的 AS 内部路由选择信息,以找到通往NEXT-HOP路由器2a最低开销的AS 内部路径 以及 通往NEXT-HOP路由器3d 的最低开销 AS间路径,进而选择这些最低开销路径中具有最低开销的那条。 例如,假设开销定义为穿越的链路数。 则从路由器 1b到路由器2a 的最低开销是2, 从路由器1b 到路由器3d 的最低开销是3。因此将选择路由器2a。 路由器1b则将查阅它的转发表(由它的 AS 内部算法所配置),并且找到通往路由器2a 的位于最低开销路径上的接口 I。1b 则把 (x, I) 加到它的转发表中。总结一下热土豆路由选择步骤,如下图所示。

-
路由器选择算法
在实践中, BGP使用了一种比热土豆路由选择更为复杂但却结合了其特点的算法。 对于任何给定的目的地前缀,BGP 路由选择算法的输入是到某前缀的所有路由的集合,该前缀是已被路由器学习和接受的。 如果仅有一条这样的路由, BGP则显然选择该路由。 如果到相同的前缀有两条或多条路由,则按照以下步骤直到只余下一条路由:
-
路由被指派一个本地偏好值作为其属性之一 (除了 AS-PATH 和NEXT-HOP 以外)。一条路由的本地偏好可能由该路由器设置或可能由在相同AS 中的另一台路由器学习到。 本地偏好属性的值是一种策略决定,它完全取决于该AS 的网络管理员(我们随后将更为详细地讨论BGP策略问题)。具有最高本地偏好值的路由将被选择。
-
从余下的路由中 (所有都具有相同的最高本地偏好值),将选择具有最短 AS-PATH 的路由。 如果该规则是路由选择的唯一规则,则 BGP将使用距离向量算法决定路径,其中距离测度使用AS跳的跳数而不是路由器跳的跳数。
-
从余下的路由中(所有都具有相同的最高本地偏好值和相同的 AS-PATH 长度)使用热土豆路由选择,即选择具有最靠近NEXT-HOP路由器的路由。
-
如果仍留下多条路由,该路由器使用BGP标识符来选择路由
IP 任播
除了作为因特网的AS间路由选择协议外, BGP还常被用于实现IP任播服务 , 该服务通常用于 DNS 中。 为了说明 IP 任播的动机,考虑在许多应用中,我们对下列情况感兴趣: 在许多分散的不同地理位置,替换不同服务器上的相同内容;让每个用户从最靠近的服务器访问内容。例如, 一个CDN能够更换位于不同国家不同服务器上的视频和其他对象。 类似地, DNS系统能够在遍及全世界的 DNS服务器上复制 DNS 记录。 当一个用户要访问该复制的内容,可以将用户指向具有该复制内容的"最近的"服务器。 BGP的路由选择算法为做这件事提供了一种最为容易和自然的机制。
为使我们的讨论具体,我们描述CDN可能使用IP任播的方式。如下图所示,使用 IP任播将用户引向最近的 CDN 服务器。

在IP任播配置阶段, CDN公司为它的多台服务器指派相同的 IP地址,并且使用标准的 BGP使得每台服务器通告其IP地址。当某台路由器收到对于该lP地址的多个路由通告,它将这些通告处理成 到服务器的不同路径。当配置其路由选择表时,每台路由器将本地化地使用BGP 路由选择算法来挑选到该IP地址的最好的路由。
当某客户请求视频时, CDN 向该客户返回地理上分散的服务器所使用的共同 IP地址,而无论该客户位于何处。 当该客户想向那个IP地址发送一个请求时,因特网路由器则向那个"最近的"服务器转发该请求分组,最近的服务器是由 BGP路由选择算法所定义的。尽管该例子很好地诠释了能够如何使用IP任播,但实践中 CDN通常选择不使用IP 任播,因为 BGP路由选择变化能够导致 一个TCP连接下的分组到达了 另外一个Web服务器。 但IP任播被 DNS 系统广泛用于将 DNS 请求指向最近的根 DNS 服务器。
路由选择策略
当某路由器选择到目的地的一条路由时, AS路由选择策略能够胜过所有其他考虑。在路由选择算法中,实际上首先根据本地偏好属性选择路由,本地偏好值由本地AS 的策略所确定。用一个简单的例子说明BGP路由选择策略的基本概念。

上图中显示了6 个互联的自治系统: A、 B、 C、 W、 X 、Y。 假设自治系统W、 X 、Y是接入ISP,而 A、 B 、C 是主干提供商网络。 A、 B、C直接向彼此发送流量,并向它们的客户网络提供全部的BGP信息。X 是一个多宿接入ISP,它是经由B、C两个不同的提供商连到网络的其余部分。X 如何防止转发B与C之间的流量呢?这能够通过控制 BGP路由的通告方式容易地实现。这就是说,即使X 可能知道一条路径(比如说XCY) 能到达网络Y, 它也将不把该条路径通告给B。所以B 绝不会经由 X转发目的为Y (或C) 的流量。 这个简单的例子说明了如何使用路由通告策略来实现客户/提供商路由选择关系。
我们接下来关注提供商网络B,假定B 巳经 (从A处) 知道了 A有一条到W的路径AW。B 因此能将路由 AW安装到其路由转发表中。显然, B也想向它的客户 X通告路径BAW, 这样X知道它能够通过B路由到W。但是, B应该将路径BAW通告给 C吗?如果它这样做,则 C可以经由 BAW将流量引导到 W。A、 B和C都是主干提供商,而B觉得它不应该承担在A与 C 之间传送流量的负担(和开销)。B 有理由认为,确保C能经过A和C之间的直接连接引导A客户的流量,是A和C的工作(和开销)。 目前还没有强制主干ISP之间如何路由选择的官方标准。 然而,商业运行的ISP 们都遵从的一个经验法则是:任何穿越某 ISP 主干网的流量,其源或目的( 或两者)必须位于该ISP 的某个客户网络中;不然的话这些流量将会免费搭车通过该ISP 的网络。
拼装在一起:在因特网中呈现
尽管本小节不是有关BGP本身的,但它将我们到此为止看到的许多协议和概念结合到一起,包括IP地址、 DNS和 BGP。
假定你创建了一个具有若干服务器的小型公司网络,包括一台描述公司产品和服务的公共Web 服务器, 一台从你的雇员获得他们的电子邮件的电子邮件服务器和一台 DNS 服务器。 你当然乐意整个世界能够访问你的 Web 站点,以得知你的现有产品和服务。 此外,你将乐意你的雇员能够向遍及世界的潜在客户发送和接收电子邮件。为了满足这些目标,你首先需要获得因特网连接,要做到这一点,需要与本地ISP签订合同并进行连接。 你的公司将有一台网关路由器,该路由器将与本地ISP的一台路由器相连。 该连接可以是一条通过现有电话基础设施的 DSL连接、 一条到 ISP路由器的租用线,或者是其他接入解决方案之一。 你的本地ISP也将为你提供一个IP地址范围,例如由256个地址组成的一个/24 地址范围。 一旦你有了自己的物理连接和 IP地址范围,你可以在该地址范围内分配IP地址: 一个给你的 Web 服务器, 一个给你的电子邮件服务器, 一个给你的 DNS服务器, 一个给你的网关路由器,并将其他IP地址分配给公司网络中的其他服务器和联网设备。
除了与一个ISP签订合同外,你还需要与一个因特网注册机构签订合同. 以便为你的公司获得一个域名,例如,如果你的公司名称比如说是Xanadu Inc. , 你自然希望获得域名 xanadu. com。 你的公司还必须呈现在 DNS 系统中。 具体而言,因为外部世界将要联系你的DNS服务器以获得该服务器的IP地址,所以你还需要为注册机构提供你的DNS服务器的IP地址。 该注册机构则在. com顶级域名服务器中为你的 DNS 服务器设置一个表项(域名和对应的 IP地址)。 在这个步骤完成后,任何知道你的域名(例如xanadu. com) 的用户将能够经过 DNS 系统获得你 DNS 服务器的 IP地址。为了使人们能够发现你的Web服务器的IP地址, 你需要在你的 DNS服务器中包括一个将你的Web 服务器的主机名 (例如www... xanadu. com) 映射到它的 IP 地址的表项。 你还要为公司中其他公共可用的服务器设置类似的表项,包括你的电子邮件服务器。 如此一来,如果Alice 要浏览你的 Web 服务器, DNS 系统将联系你的 DNS 服务器,找到你的 Web 服务器的IP 地址, 并将其给Alice。 Alice 则能与你的 Web 服务器创建一个直接的TCP连接。然而,允许来自世界各地的外部人员访问你的 Web 服务器,仍然还有一个必要的、决定性的步骤。 考虑当Alice做下列事情发生的状况: Alice知道你的 Web 服务器的 IP地址,她向该IP地址发送一个IP数据报 (例如一个TCP SYN报文段)。 该数据报将通过因特网进行路由, 经历了在许多不同的自治系统中的一系列路由器,最终到达你的Web服务器。 当任何一个路由器收到该数据报时、将去它的转发表中寻找一个表项来确定转发该数据报的外出端口。 因此,每台路由器需要知道你公司的/24 前缀。一台路由器如何知道你公司的前缀呢?如我们刚才看到的那样,它从 BGP知道了该前缀。具体而言,当你的公司与本地 lSP签订合同并且获得了分配的前缀 (即一个地址范围),你的本地ISP将使用 BGP 向与之连接的 ISP通告你的前缀。 这些ISP将依次使用 BGP来传播该通告。 最终,所有的因特网路由器将得知了你的前缀 (或者包括你的前缀的某个聚合项),因而能够将数据报适当地转发到适当的Web和电子邮件服务器。
参考目录
书籍:《计算机网络:自顶向下方法(第七版)》