EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 alexwang 于 2020-7-1 15:02 编辑 / |- n, x1 E: H, f4 i
2 a: {$ a- X! ?! C& s
到底什么是路由? 1 X( Y- M( z$ \& J
EDA365原创 作者: 巢影字幕组 4 s5 N: t0 h* }3 N* P" {
7 V7 u) k& E1 J; O
1 j6 N* l2 t, f9 ` j* D) O$ r3 ~7 m
路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。
% \8 x0 d5 r* J9 \" s从下面的动图可以明显看出,进行从源到目标的数据管理不是一件容易的事情。
$ w/ U# Y$ w9 h2 c! U5 b
3 d% j$ h8 d, l, G" }, `; u) U$ {
; y1 m9 T; {( s
让我们试着通过一个类比来理解路由。想象一个场景,你下班后正准备从公司开车回家,此时路上塞满了车辆,你将在手机地图上查找道路和交通状况。根据路况,你将选择最通畅的那条路回家。 1 y" L; r. M% V( D
+ ^8 _+ `9 O5 G6 I! e# ?6 _1 n, q
0 w0 x- u$ m2 d3 X% Q8 `3 y8 c; @( C
类似地,在路由中,有关数据包移动的决策是根据网络的状态做出的,路由器负责做出这些逻辑数据决策。
2 p- `: t, v8 F* b, h: @4 r" Z设置路由器的主要目的是找到数据包从源到目的地的最有效路径。使用非常复杂的算法,路由器决定当前数据包必须通过哪个路由器或设备发送。重复此过程,直到数据包最终到达目的地。
; _0 W& Y$ D4 P0 X+ ^# z
' H2 Y# D A% k% H$ \, c+ J+ ` j1 _& M0 w* }$ r
9 ^; w) b. y* [5 G路由可以分为两类:静态路由和动态路由。在静态路由中,所有路由都是在一个路由器中手动设置的。因此,如果网络有任何变化,路由也不会有任何变化,除非有人手动更正它。
" m* m% A: `( y, k* N/ P) a: F/ I在动态路由中,路由是由软件根据网络的当前状态来设置的。 $ c1 L. ~- n4 Z
网络变化,如链路故障、流量变化等,将在每一个离散时间步更新。根据这些信息,将在每个时间步长确定新路线。动态路由优于静态路由,因为路由器会根据网络中的变化进行实时更新。 ( w) Z. w5 `" s* [2 u1 U* O
下面介绍一下最流行的动态路由算法之一,链接状态算法。
; t4 K) l( s5 {3 p链路状态算法分为 Reliable Flooding和Dijkstra最短路径算法。 1 ]( y$ m( l3 a: a
这个算法是由著名的荷兰计算机科学家Edsger Wybe Dijkstra(1930-2002)在1956年开发的。下面的网络中标记出了每个节点之间的成本,挑战在于找出从一个节点到另一个节点的最短路径。Dijkstra算法生成一个表作为它的输出,利用这个表我们可以确定网络中的最短路径。 9 u H2 R6 Y) W8 S0 l4 v* }; Q
" _0 ]' o% N0 w; g: R
, |1 T( S& T6 S7 ^" [( @. x/ O. q7 U3 X
这个表是为顶点A生成的。使用这个表,你可以预测到任何其他点的最短路径。如果你想要到点I的最短路径,只要检查之前的顶点即可。从这个顶点开始,检查它之前的顶点,以此类推,直到到达点A。这个表是使用迭代方法生成的,其中最短距离的初始值为无穷大。 2 x& W& d3 @& ?; \3 Q
下面的动图简单演示了这个过程。
1 f% M- h& m9 [& K+ z2 k+ e9 Z, B; @7 J3 q; n
4 ^+ _& B7 B! M3 h/ D, c8 a) s) K
6 l& G/ ~3 f7 K+ v
+ H1 z' u9 l: I+ ]/ C% t1 W" \: X8 A; e0 o9 [
现在我们再来看链路状态算法的第一部分,Reliable Flooding。 ' v: Z9 {0 A0 }. @
您可能已经注意到,为了完美地执行Dijkstra算法,每个路由器应该具有整个拓扑的信息。这是链路状态路由的第一步。路由器的邻域信息称为它的链路状态。这些信息可以是相邻路由器的IP地址、相邻链路的成本等。包含此邻域信息的小数据包称为链路状态数据包。我们应该准确地用拓扑中所有其他路由器的链接状态填充每个路由器。 4 T4 Z; `5 z4 {
& d0 L9 @7 t8 Y7 v& C' o( g' w8 @
6 ^& D R# C6 D8 v7 m3 }; Q( [
3 E0 U0 M$ F( E Q2 Y在网络中,最初每个路由器都知道自己的链路状态。对于下面的小网络,A将它的链路状态包传递给它的邻居,B将这个包传递给它的邻居,以此类推。这样,所有节点都将拥有拓扑的完整链接状态信息。利用这个数据包信息,所有节点都创建或更新一个路由表,并应用Dijkstra的最短路径算法来发送信息包。然而,Flooding并不是那么简单。 - D. h. `" D! x6 ^- a5 _# T
0 D/ d* |, C, p" N& Z
3 g% ~( w5 L* T1 \$ u' E) O0 Q
8 e: R7 Y! p$ y4 z4 z. M考虑一个场景,其中三个节点A、B和C相互连接。节点A向B和C发送链路状态信息。类似地,C将信息发送给B,B再次将信息发送给C,这个过程在一个循环中继续。这个问题称为循环。 ; [" d/ H2 C! H9 f. p. w4 E, a$ q" b
# h7 B' l C* ?" L/ k! w
7 |+ ~, c( S3 s( {
5 {" I* e' v/ e# S9 r8 b0 z' X: l因此,在理想的情况下,你希望节点只接收此信息一次。 ( g2 h; X0 D! ?, o' o1 y. E6 L- i! N
那么如何克服循环问题呢?
# |8 L* f' j2 N/ B2 D" {) j每个包被分配一个唯一的ID。当B从A和C收到这个唯一ID的数据包时,它不发送给C。 5 G; K* [! K, a
7 v" f: ^7 k# {
& ?; r/ a1 z$ b$ x3 U. X. | W( k' H1 I$ w
Flooding操作后,每个节点独立运行Dijkstra最短路径算法,以确定从自身到网络中其他节点的最短路径。我们所看到的算法是在网络协议的帮助下实现的。 % D& i5 G$ h+ u5 M' r* b7 H
将Flooding操作应用到整个全球网络几乎是不可能完成的任务。
" z5 x/ ^' O. X* i+ T8 a链路状态路由算法的协议称为OSPF。
. v% D0 K0 `8 n: P. R在OSPF中,整个网络被分成几个局部区域。还创建了一个主干区域,它共享来自本地区域的至少一个路由器。这样就创建了一些边界路由器。你可以看到所有的本地区域都通过这些边界路由器连接到主干区域。在OSPF中,Flooding操作发生在局部区域,而不是全局。
9 a! H2 a9 W& {' o+ `% U) i
" r l3 h" h0 Q l' R: v7 }' ~5 D( s$ q! I3 ^& E
) z. F, j0 E# N: V0 B9 d如果一个局部区域的数据包需要传送到另一个局部区域,它们必须经过主干区域。比如数据包从区域二流向区域三,它们必须通过主干区域,而不是直接通过。这种类型的结构通过减少路由表的大小来降低操作的复杂性,还有助于提高网络的可伸缩性。 7 e5 A( n" X! X5 l& j
希望这篇文章能帮助你对路由操作有一个更好的认识! & e! F, G8 m8 ~
; W: @. _; s* s9 n4 p
9 w- D" A E$ T: |/ e; T& _3 E9 `8 j7 B' y2 C" j; S" g* ] Y7 ~/ V t% C' v c7 x6 N0 f8 ^* {: K# N: n! w' e
& M# Y: i$ R+ ]% `; U1 J 注:本文为EDA365电子论坛原创文章,未经允许,不得转载 : } \6 I: S1 m; ]9 X' n
8 v6 B1 P/ j& i/ b+ } |