路由器基础知识(源作者:swaterj)管理员处理图片

主题位置：论坛首页>>提问区>>综合问题 发布新贴 | 版　主：powusr

楼 主
·网名：killsnow
·头衔：野人
·级别：
·资历：250
·经验：75
·注册：2006-6-8
·发送短信 加为好友

主 题：路由器基础知识(源作者:swaterj)管理员处理图片

最简单的网络可以想象成单线的总线，各个计算机可以通过向总线发送分组以互相通信。但随着网络中的计算机数目增长，这就很不可行了，会产生许多问题：
1、带宽资源耗尽。
2、每台计算机都浪费许多时间处理无关的广播数据。
3、网络变得无法管理，任何错误都可能导致整个网络瘫痪。
4、每台计算机都可以监听到其他计算机的通信。
把网络分段可以解决这些问题，但同时你必须提供一种机制使不同网段的计算机可以互相通信，这通常涉及到在一些ISO网络协议层选择性地在网段间传送数据，我们来看一下网络协议层和路由器的位置。

我们可以看到，路由器位于网络层。本文假定网络层协议为IPv4，因为这是最流行的协议，其中涉及的概念与其他网络层协议是类似的。
一、路由与桥接
路由相对于2层的桥接/交换是高层的概念，不涉及网络的物理细节。在可路由的网络中，每台主机都有同样的网络层地址格式（如IP地址），而无论它是运行在以太网、令牌环、FDDI还是广域网。网络层地址通常由两部分构成：网络地址和主机地址。
网桥只能连接数据链路层相同（或类似）的网络，路由器则不同，它可以连接任意两种网络，只要主机使用的是相同的网络层协议。
二、连接网络层与数据链路层
网络层下面是数据链路层，为了它们可以互通，需要“粘合”协议。ARP（地址解析协议）用于把网络层(3层)地址映射到数据链路层(2层)地址，RARP(反向地址解析协议)则反之。
虽然ARP的定义与网络层协议无关，但它通常用于解析IP地址；最常见的数据链路层是以太网。因此下面的ARP和RARP的例子基于IP和以太网，但要注意这些概念对其他协议也是一样的。
1、地址解析协议
网络层地址是由网络管理员定义的抽象映射，它不去关心下层是哪种数据链路层协议。然而，网络接口只能根据2层地址来互相通信，2层地址通过ARP从3层地址得到。
并不是发送每个数据包都需要进行ARP请求，回应被缓存在本地的ARP表中，这样就减少了网络中的ARP包。ARP的维护比较容易，是一个比较简单的协议。
2、简介
如果接口A想给接口B发送数据，并且A只知道B的IP地址，它必须首先查找B的物理地址，它发送一个含有B的IP地址的ARP广播请求B的物理地址，接口B收到该广播后，向A回应其物理地址。

注意，虽然所有接口都收到了信息，但只有B回应该请求，这保证了回应的正确且避免了过期的信息。要注意的是，当A和B不在同一网段时，A只向下一跳的路由器发送ARP请求，而不是直接向B发送。

下图为接收到ARP分组后的处理，注意发送者的<IP address, hardware address>对被存到接收ARP请求的主机的本地ARP表中，一般A想与B通信时，B可能也需要与A通信。

3、IP地址冲突
ARP产生的问题中最常见的是IP地址的冲突，这是由于两个不同的主机IP地址相同产生的，在任何互联的网络中，IP地址必须是唯一的。这时会收到两个ARP回应，分别指出了不同的硬件地址，这是严重的错误，没有简单的解决办法。
为了避免出现这类错误，当接口A初试化时，它发送一个含有其IP地址的ARP请求，如果没有收到回应，A就假定该IP地址没有被使用。我们假定接口B已经使用了该IP地址，那么B就发送一个ARP回应，A就可以知道该IP地址已被使用，它就不能再使用该IP地址，而是返回错误信息。这样又产生一个问题，假设主机C含有该IP地址的映射，是映射到B的硬件地址的，它收到接口A的ARP广播后，更新其ARP表使之指向A的硬件地址。为了解决这个错误，B再次发送一个ARP请求广播，这样主机C又更新其ARP表再次指向B的硬件地址。这时网络的状态又回到先前的状态，有可能C已经向A发送了应该发送给B的IP分组，这很不幸，但是因为IP提供的是无保证的传输，所以不会产生大的问题。
4、管理ARP缓存表
ARP缓存表是<IP地址，硬件地址>对的列表，根据IP地址索引。该表可以用命令arp来管理，其语法包括：

- 向表中添加静态表项 -- arp -s <IP address> <hardware address>
- 从表中删除表项 -- arp -d <IP address>
- 显示表项 -- arp -a

ARP表中的动态表项(没有手动加入的表项)通常过一段时间自动删除，这段时间的长度由特定的TCP/IP实现决定。
5、静态ARP地址的使用
静态ARP地址的典型使用是设置独立的打印服务器，这些设备通常通过telnet来配置，但首先它们需要一个IP地址。没有明显的方法来把此信息告诉该设备，好象只能使用其串口来设置。但是，这需要找一个合适的终端和串行电缆，设置波特率、奇偶校验等，很不方便。
假设我们想给一个打印服务器设置IP地址P-IP，并且我们知道其硬件地址P-hard，在工作站A上创建一个静态ARP表项把P-IP映射到P-hard，这样，虽然打印服务器不知道自己的IP地址，但是所有指向P-IP的数据就将被送到P-hard。我们现在就可以telnet到P-IP并配置其IP地址了，然后再删除该静态ARP表项。

有时会在一个子网里配置打印服务器，而在另一个子网里使用它，方法与上面类似。假设其IP地址为P-IP，我们分配一个本网的临时IP地址T-IP给它，在工作站A上创建临时ARP表项把T-IP映射到P-hard，然后telnet到T-IP，给打印服务器配以IP地址P-IP。接下来就可以把它放到另一个子网里使用了，别忘了删除静态ARP表项。

6、代理ARP
可以通过使用代理ARP来避免在每台主机上配置路由表，在使用子网时这特别有用，但注意，不是所有的主机都能理解子网的。基本的思想是即使对于不在本子网的主机也发送ARP请求，ARP代理服务器（通常是网关）回应以网关的硬件地址，见下图，注意与上面的图比较一下。
代理ARP简化了主机的管理，但是增加了网络的通信量(不是很明显)，并且可能需要较大的ARP缓存，每个不在本网的IP地址都被创建一个表项，都映射到网关的硬件地址。在使用代理ARP的主机看来，世界就象一个大的没有路由器物理网络。

三、IP地址
在可路由的网络层协议中，协议地址必须含有两部分信息：网络地址和主机地址。存贮这种信息最明显的方法是用两个分离的域，这样我们必须考虑到两个域的最大长度，有些协议(如IPX)就是这样的，它在小型和中型的网络里可以工作的很好。
另一种方案是减少主机地址域的长度，如24位网络地址、8位主机地址，这样就有了较多的网段，但每个网段内的主机数目很少。这样一来，对于多于256个主机的网络，就必须分配多个网段，其问题是很多的网络给路由器造成了难以忍受的负担。
IP把网络地址和主机地址一起包装在一个32位的域里，有时主机地址部分很短，有时很长，这样可以有效利用地址空间，减少IP地址的长度，并且网络数目不算多。有两种将主机地址分离出来的方法：基于类的地址和无类别的地址。
1、主机和网关
主机和网关的区别常产生混淆，这是由于主机意义的转变。在RFC中(1122/3和1009)中定义为：

- 主机是连接到一个或多个网络的设备，它可以向任何一个网络发送和从其接收数据，但它从不把数据从一个网络传向另一个。
- 网关是连接到多于一个网络的设备，它选择性的把数据从一个网络转发到其它网络。

换句话说，过去主机和网关的概念被人工地区分开来，那时计算机没有足够的能力同时用作主机和网关。主机是用户工作的计算机，或是文件服务器等。现代的计算机的能力足以同时担当这两种角色，因此，现代的主机定义应该如此：

- 主机是连接到一个或多个网络的设备，它可以向任何一个网络发送和从其接收数据。它也可以作为网关，但这不是其唯一的目的。

路由器是专用的网关，其硬件经过特殊的设计使其能以极小的延迟转发大量的数据。然而，网关也可以是有多个网卡的标准的计算机，其操作系统的网络层有能力转发数据。由于专用的路由硬件较便宜，计算机用作网关已经很少见了，在只有一个拨号连接的小站点里，还可能使用计算机作为非专用的网关。
2、基于类的地址
最初设计IP时，地址根据第一个字节被分成几类：
0: 保留
1-126: A类(网络地址:1字节，主机地址:3字节)
127: 保留
128-191: B类(网络地址:2字节，主机地址:2字节)
192-223: C类(网络地址:3字节，主机地址:1字节)
224-255: 保留
3、子网划分
虽然基于类的地址系统对因特网服务提供商来说工作得很好，但它不能在一个网络内部做任何路由，其目的是使用第二层(桥接/交换)来导引网络中的数据。在大型的A类网络中，这就成了个特殊的问题，因为在大型网络中仅使用桥接/交换使其非常难以管理。在逻辑上其解决办法是把大网络分割成若干小的网络，但在基于类的地址系统中这是不可能的。为了解决这个问题，出现了一个新的域：子网掩码。子网掩码指出地址中哪些部分是网络地址，哪些是主机地址。在子网掩码中，二进制1表示网络地址位，二进制0表示主机地址位。传统的各类地址的子网掩码为：

- A类：255.0.0.0
- B类：255.255.0.0
- C类：255.255.255.0

如果想把一个B类网络的地址用作C类大小的地址，可以使用掩码255.255.255.0。用较长的子网掩码把一个网络分成多个网络就叫做划分子网。要注意的是，一些旧软件不支持子网，因为它们不理解子网掩码。例如UNIX的routed路由守护进程通常使用的路由协议是版本1的RIP，它是在子网掩码出现前设计的。
上面只介绍了三种子网掩码：255.0.0.0、255.255.0.0和255.255.255.0，它们是字节对齐的子网掩码。但是也可以在字节中间对其进行划分，这里不进行详细讲解，请参照相关的TCP/IP书籍。
子网使我们可以拥有新的规模的网络，包括很小的用于点到点连接的网络（如掩码255.255.255.252，30位的网络地址，2位的主机地址：两个主机的子网），或中型网络（如掩码255.255.240.0，20位网络地址，12位主机地址：4094个主机的子网）。注意DNS被设计为只允许字节对齐的IP网络(在in-addr.arpa.域中)。
4、超网(supernetting)
超网是与子网类似的概念--IP地址根据子网掩码被分为独立的网络地址和主机地址。但是，与子网把大网络分成若干小网络相反，它是把一些小网络组合成一个大网络--超网。
假设现在有16个C类网络，从201.66.32.0到201.66.47.0，它们可以用子网掩码255.255.240.0统一表示为网络201.66.32.0。但是，并不是任意的地址组都可以这样做，例如16个C类网络201.66.71.0到201.66.86.0就不能形成一个统一的网络。不过这其实没关系，只要策略得当，总能找到合适的一组地址的。
5、可变长子网掩码(VLSM)
如果你想把你的网络分成多个不同大小的子网，可以使用可变长子网掩码，每个子网可以使用不同长度的子网掩码。例如：如果你按部门划分网络，一些网络的掩码可以为255.255.255.0(多数部门)，其它的可为255.255.252.0(较大的部门)。
6、无类别地址(CIDR)
因特网上的主机数量增长超出了原先的设想，虽然还远没达到232，但地址已经出现匮乏。1993年发表的RFC1519--无类别域间路由CIDR(Classless Inter-Domain Routing)--是一个尝试解决此问题的方法。CIDR试图延长IPv4的寿命，与128位地址的IPv6不同，它并不能最终解决地址空间的耗尽，但IPv6的实现是个庞大的任务，因特网目前还没有做好准备。CIDR给了我们缓冲的准备时间。
基于类的地址系统工作的不错，它在有效的地址使用和少量的网络数目间做出了较好的折衷。但是随着因特网意想不到的成长出现了两个主要的问题：

- 已分配的网络数目的增长使路由表大得难以管理，相当程度上降低了路由器的处理速度。
- 僵化的地址分配方案使很多地址被浪费，尤其是B类地址十分匮乏。

为了解决第二个问题，可以分配多个较小的网络，例如，用多个C类网络而不是一个B类网络。虽然这样能够很有效地分配地址，但是更加剧了路由表的膨胀（第一个问题）。
在CIDR中，地址根据网络拓扑来分配。连续的一组网络地址可以被分配给一个服务提供商，使整组地址作为一个网络地址（很可能使用超网技术）。例如：一个服务提供商被分配以256个C类地址，从213.79.0.0到213.79.255.0，服务提供商给每个用户分配一个C类地址，但服务提供商外部的路由表只通过一个表项--掩码为255.255.0.0的网络213.79.0.0--来分辨这些路由。
这种方法明显减少了路由表的增长，CIDR RFC的作者估计，如果90%的服务提供商使用了CIDR，路由表将以每3年54%的速度增长，而如果没有使用CIDR，则增长速度为776%。如果可以重新组织现有的地址，则因特网骨干上的路由器广播的路由数量将大大减少。但这实际是不可行的，因为将带来巨大的管理负担。
四、路由
1、路由表
如果一个主机有多个网络接口，当向一个特定的IP地址发送分组时，它怎样决定使用哪个接口呢？答案就在路由表中。来看下面的例子：

主机将所有目的地为网络201.66.37.0内主机(201.66.37.1-201.66.37.254)的数据通过接口eth0(IP地址为201.66.37.74)发送，所有目的地为网络201.66.39.0内主机的数据通过接口eth1(IP地址为201.66.39.21)发送。标志U表示该路由状态为“up”（即激活状态）。对于直接连接的网络，一些软件并不象上例中一样给出接口的IP地址，而只列出接口。
此例只涉及了直接连接的主机，那么目的主机在远程网络中如何呢？如果你通过IP地址为201.66.37.254的网关连接到网络73.0.0.0，那么你可以在路由表中增加这样一项：

此项告诉主机所有目的地为网络73.0.0.0内主机的分组通过201.66.37.254路由过去。标志G(gateway)表示此项把分组导向外部网关。类似的，也可以定义通过网关到达特定主机的路由，增加标志H(host)：

下面是路由表的基础，除了特殊表项之外：

第一项是loopback接口，用于主机给自己发送数据，通常用于测试和运行于IP之上但需要本地通信的应用。这是到特定地址127.0.0.1的主机路由(接口lo0是IP协议栈内部的“假”网卡)。第二项十分有意思，为了防止在主机上定义到因特网上每一个可能到达网络的路由，可以定义一个缺省路由，如果在路由表中没有与目的地址相匹配的项，该分组就被送到缺省网关。多数主机简单地通过一个网卡连接到网络，因此只有通过一个路由器到其它网络，这样在路由表中只有三项：loopback项、本地子网项和缺省项（指向路由器）。
2、重叠路由
假设在路由表中有下列重叠项：

之所以说这些路由重叠是因为这四个路由都含有地址1.2.3.4，如果向1.2.3.4发送数据，会选择哪条路由呢？在这种情况下，会选择第一条路由，通过网关201.66.37.253。原则是选择具有最长(最精确)的子网掩码。类似的，发往1.2.3.5的数据选择第二条路由。
注意：这条原则只适用于间接路由(通过网关)。把两个接口定义在同一子网在很多软件实现上是非法的。例如下面的设置通常是非法的（不过有些软件将尝试在两个接口进行负载平衡）：

对于重叠路由的策略是十分有用的，它允许缺省路由作为目的为0.0.0.0、子网掩码为0.0.0.0的路由进行工作，而不需要作为路由软件的一个特殊情况来实现。
回头来看看CIDR，仍使用上面的例子：一个服务提供商被赋予256个C类网络，从213.79.0.0到213.79.255.0。该服务提供商外部的路由表只以一个表项就了解了所有这些路由：213.79.0.0，子网掩码为255.255.0.0。假设一个用户移到了另一个服务提供商，他拥有网络地址213.79.61.0，现在他是否必须从新的服务提供商处取得新的网络地址呢？如果是，意味着他必须重新配置每台主机的IP地址，改变DNS设置，等等。幸运的是，解决办法很简单，原来的服务提供商保持路由213.79.0.0(子网掩码为255.255.0.0)，新的服务提供商则广播路由213.79.61.0(子网掩码为255.255.255.0)，因为新路由的子网掩码较长，它将覆盖原来的路由。
3、静态路由

回头看看我们已建立的路由表，已有了六个表项：

该网络图示如下：

这些表项分别是怎么得到的呢？第一个是当路由表初始化时由路由软件加入的，第二、三个是当网卡绑定IP地址时自动创建的，其余三个必须手动加入，在UNIX系统中，这是通过命令route来做的，可以由用户手工执行，也可以通过rc脚本在启动时执行。上述方法涉及的是静态路由，通常在启动时创建，并且没有手工干预的话将不再改变。
4、路由协议
主机和网关都可以使用称作动态路由的技术，这使路由表可以动态改变。动态路由需要路由协议来增加和删除路由表项，路由表还是和静态路由一样地工作，只是其增添和删除是自动的。
有两种路由协议：内部的和外部的。内部协议在自制系统(AS)内部路由，而外部协议则在自制系统间路由。自制系统通常在统一的控制管理之下，例如大的公司或大学。小的站点常常是其因特网服务提供商自制系统的一部分。
这里只讨论内部协议，很少有人涉及到甚至听说外部协议。最常见的外部协议是外部网关协议EGP(External Gateway Protocol)和边缘网关协议BGP(Border Gateway Protocol)，BGP是较新的协议，在逐渐地取代EGP。
5、ICMP重定向
ICMP通常不被看作路由协议，但是ICMP重定向却与路由协议的工作方式很类似，所以将在这里讨论一下。假设现在有上面所给的六个表项的路由表，分组被送往201.66.43.33，看看路由表，除了缺省路由外，这并不能匹配任何路由。静态路由将其通过路由器201.66.39.254发送(trip 1)，但是，该路由器知道所有发向子网201.66.43.0的分组应该通过201.66.39.253，因此，它把分组转发到适当的路由器(trip 2)。但是如果主机直接把分组发到201.66.39.253就会提高效率(trip 3)。如下图：

因为路由器把分组从同一接口发回了分组，所以它知道有更好的路由，路由器可以通过ICMP重定向指示主机使用新的路由。虽然路由器知道所有发向201.66.43.0子网的分组应该通过201.66.39.253，它通常只发送特定的主机的ICMP重定向（此例中是201.66.43.33）。主机将在路由表中创建一个新的表项：

注意标志D，对所有由ICMP重定向创建的路由设置此标志。将来此类分组将通过新路由发送(trip 3)。
6、RIP
RIP是一种简单的内部路由协议，已经存在很久，被广泛地实现（UNIX的routed就使用RIP）。它使用距离向量算法，所以其路由选择只是基于两点间的“跳(hop)”数，穿过一个路由器认为是一跳。主机和网关都可以运行RIP，但是主机只是接收信息，而并不发送。路由信息可以从指定网关请求，但通常是每隔30秒广播一次以保持正确性。RIP使用UDP通过端口520在主机和网关间通信。网关间传送的信息用于建立路由表，由RIP选定的路由总是具有距离目的跳数最少的。RIP版本1在简单、较小的网络中工作得不错，但是在较大的网络中，就出现一些问题，有些问题在RIP版本2中已纠正，但有些是由于其设计产生的限制。在下面的讨论中，适用于两种版本时简单称为RIP，RIP v1和RIP v2则指特定的版本。
RIP并没有任何链接质量的概念，所有的链路都被认为是相同的，低速的串行链路被认为与高速的光纤链路是同样的。RIP以最小的跳数来选择路由，因此当在下面两个路由中选择时：

- 100Mbps的光纤链路，路由器，然后是10Mbps的以太网
- 9600bps的串行链路

RIP将选择后者。RIP也没有链路流量等级的概念。例如对于两条以太网链路，其中一个很繁忙，另一个根本没有数据流，RIP可能会选择繁忙的那条链路。
RIP中的最大hop数是15，大于15则认为不可到达。因此在很大的自制系统中，hop数很可能超过15，使用RIP是很不现实的。RIP v1不支持子网，交换的信息中不含子网掩码，对给定路由确定子网掩码的方法各不相同，RIP v2则弥补了此缺点。RIP每隔30秒才进行信息更新，因此在大网中断链信息可能要花些时间才能传播开来，路由信息的稳定时间可能更长，并且在这段时间内可能产生路由环路。对此有一些解决办法，但这里不进行讨论。
可以看出，RIP是一个简单的路由协议，有一些限制，尤其在版本1中。不过，它常常是某些操作系统的唯一选择。

[此贴子已经被killsnow于2006-7-20 11:30:47编辑过]
本文地址：

| ＋＋＋＋＋＋＋＋＋＋＋＋ ＋业精于专，方显卓越。＋ ＋＋＋＋＋＋＋＋＋＋＋＋

删除 置顶 推荐 精华 加锁 编辑 取消 | 2006-7-20 11:28:06

回 复：路由器基础知识(源作者:swaterj)管理员处理图片

回复内容： |
上传图片： | (允许上传gif|jpg|GIF|JPG|SWF|swf类型的图片)
图片说明： |