如果您已阅读十万个为什么文章路由器如何工作,那么您就知道路由器用于管理网络流量并找到发送数据包的最佳路由。但您曾否想过路由器是如何做到这一点的?路由器需要了解一些网络状态信息,以便决定如何以及向何处发送数据包。但是它们如何收集这些信息呢?
在本文中,我们将精确地找出路由器在确定数据包发送位置时使用的信息。
广告
如果您已阅读十万个为什么文章路由器如何工作,那么您就知道路由器用于管理网络流量并找到发送数据包的最佳路由。但您曾否想过路由器是如何做到这一点的?路由器需要了解一些网络状态信息,以便决定如何以及向何处发送数据包。但是它们如何收集这些信息呢?
在本文中,我们将精确地找出路由器在确定数据包发送位置时使用的信息。
广告
路由器使用路由算法来找到到达目的地的最佳路由。当我们说“最佳路由”时,我们考虑的参数包括跳数(数据包从网络中的一个路由器或中间点到另一个点的行程)、时间延迟和数据包传输的通信成本。
根据路由器如何收集网络结构信息以及它们如何分析信息以指定最佳路由,我们有两种主要的路由算法:全局路由算法和分散路由算法。在分散路由算法中,每个路由器只拥有与其直接连接的路由器的信息——它不了解网络中的所有路由器。这些算法也称为DV(距离矢量)算法。在全局路由算法中,每个路由器都拥有网络中所有其他路由器的完整信息以及网络的流量状态。这些算法也称为LS(链路状态)算法。我们将在下一节讨论LS算法。
广告
在LS算法中,每个路由器都必须遵循以下步骤
迪克斯特拉算法遵循以下步骤
广告
我们将在下一页使用此算法作为示例。
广告
在这里,我们想找到A和E之间的最佳路由(见下文)。您可以看到A和E之间有六种可能的路由(ABE、ACE、ABDE、ACDE、ABDCE、ACDBE),显而易见,ABDE是最佳路由,因为其权重最低。但生活并非总是如此简单,在某些复杂情况下,我们必须使用算法来找到最佳路由。
最后,E是目的地,所以我们在这里停止。
广告
我们到了最后!现在我们必须识别路由。E的前一个节点是D,D的前一个节点是B,B的前一个节点是A。因此,最佳路由是ABDE。在这种情况下,总权重为4 (1+2+1)。
尽管该算法运行良好,但它过于复杂,可能需要路由器长时间处理,从而导致网络效率低下。此外,如果路由器向其他路由器提供错误信息,所有路由决策都将无效。为了更好地理解此算法,这里是用C语言编写的程序源代码
#define MAX_NODES 1024 /* maximum number of nodes */ #define INFINITY 1000000000 /* a number larger than every maximum path */ int n,dist[MAX_NODES][MAX_NODES]; /*dist[I][j] is the distance from i to j */ void shortest_path(int s,int t,int path[ ]) {struct state { /* the path being worked on */ int predecessor ; /*previous node */ int length /*length from source to this node*/ enum {permanent, tentative} label /*label state*/ }state[MAX_NODES]; int I, k, min; struct state * p; for (p=&state[0];p < &state[n];p++){ /*initialize state*/ p->predecessor=-1 p->length=INFINITY p->label=tentative; } state[t].length=0; state[t].label=permanent ; k=t ; /*k is the initial working node */ do{ /* is the better path from k? */ for I=0; I < n; I++) /*this graph has n nodes */ if (dist[k][I] !=0 && state[I].label==tentative){ if (state[k].length+dist[k][I] < state[I].length){ state[I].predecessor=k; state[I].length=state[k].length + dist[k][I] } } /* Find the tentatively labeled node with the smallest label. */ k=0;min=INFINITY; for (I=0;I < n;I++) if(state[I].label==tentative && state[I].length < min)=state[I].length; k=I; } state[k].label=permanent }while (k!=s); /*Copy the path into output array*/ I=0;k=0 Do{path[I++]=k;k=state[k].predecessor;} while (k > =0); }
广告
DV算法也称为贝尔曼-福特路由算法和福特-富尔克森路由算法。在这些算法中,每个路由器都有一个路由表,显示其到达任何目的地的最佳路由。页面顶部显示了路由器J的典型图和路由表。
如表所示,如果路由器J想要将数据包发送到路由器D,它应该将它们发送到路由器H。当数据包到达路由器H时,它会检查自己的表并决定如何将数据包发送到D。
广告
在DV算法中,每个路由器都必须遵循以下步骤
DV算法最重要的问题之一被称为“计数到无穷大”。让我们通过一个例子来研究这个问题
想象一个如下图所示的网络图。如您在此图中所见,A与网络的其他部分之间只有一个链接。您可以在这里看到所有节点的图和路由表
现在想象一下A和B之间的链接被切断了。此时,B修正其路由表。经过一段时间后,路由器交换它们的路由表,因此B收到了C的路由表。由于C不知道A和B之间的链接发生了什么,它说它有一个到A的链接,权重为2(C到B为1,B到A为1——它不知道B没有到A的链接)。B收到此表后,认为C和A之间存在一个独立的链接,因此它修正了自己的表,并将无穷大更改为3(B到C为1,C到A为2,正如C所说)。路由器再次交换它们的路由表。当C收到B的路由表时,它看到B已将其到A的链接权重从1更改为3,因此C更新其表,并将到A的链接权重更改为4(C到B为1,B到A为3,正如B所说)。
这个过程会循环,直到所有节点发现到A的链接权重为无穷大。这种情况显示在下表中。通过这种方式,专家称DV算法具有收敛速度慢的特点。
解决这个问题的一种方法是,路由器只向那些不是目的地独占链接的邻居发送信息。例如,在这种情况下,C不应该向B发送任何关于A的信息,因为B是到达A的唯一路径。
广告
如您所见,在LS和DV算法中,每个路由器都必须保存一些关于其他路由器的信息。当网络规模增长时,网络中的路由器数量也会增加。因此,路由表的大小也会增加,路由器无法高效处理网络流量。我们使用分层路由来克服这个问题。让我们通过一个例子来探讨这个主题
我们使用DV算法来找到节点之间的最佳路由。在下图中所示的情况下,网络的每个节点都必须保存一个包含17条记录的路由表。这是A的典型图和路由表
广告
在分层路由中,路由器被划分为称为区域的组。每个路由器只拥有其所在区域内路由器的信息,而没有其他区域路由器的信息。因此,路由器在其表中只需为每个其他区域保存一条记录。在这个例子中,我们将网络分为五个区域(见下文)。
如果A想将数据包发送到区域2中的任何路由器(D、E、F或G),它会将它们发送给B,依此类推。如您所见,在这种路由类型中,路由表可以被汇总,从而提高了网络效率。上面的例子显示了二级分层路由。我们也可以使用三级或四级分层路由。
在三级分层路由中,网络被划分为多个集群。每个集群由多个区域组成,每个区域包含多个路由器。分层路由在互联网路由中被广泛使用,并利用了多种路由协议。
有关路由和相关主题的更多信息,请查看下一页的链接。
广告
请复制/粘贴以下文本以正确引用这篇十万个为什么.com文章
广告