电脑技术学习

路由器 (2)

dn001

  三、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 255.255.255.0   201.66.37.74    U    eth0
  201.66.39.0 255.255.255.0   201.66.39.21    U    eth1
  
  
  主机将所有目的地为网络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    255.0.0.0   201.66.37.254   UG    eth0
  
  此项告诉主机所有目的地为网络73.0.0.0内主机的分组通过201.66.37.254路由过去。标志G(gateway)表示此项把分组导向外部网关。类似的,也可以定义通过网关到达特定主机的路由,增加标志H(host):
    目的      掩码      网关    标志 接口
  ----------- --------------  ------------  ----- ----
  91.32.74.21 255.255.255.255 201.66.37.254  UGH eth0
  
  下面是路由表的基础,除了非凡表项之外:
     目的     掩码      网关     标志  接口
   ----------- ------------  -----------  ---- -----
   127.0.0.1  255.255.255.255 127.0.0.1    UH  lo0
    default  0.0.0.0     201.66.37.254  UG  eth1
  第一项是loopback接口,用于主机给自己发送数据,通常用于测试和运行于IP之上但需要本地通信的应用。这是到特定地址127.0.0.1的主机路由(接口lo0是IP协议栈内部的“假”网卡)。第二项十分有意思,为了防止在主机上定义到因特网上每一个可能到达网络的路由,可以定义一个缺省路由,假如在路由表中没有与目的地址相匹配的项,该分组就被送到缺省网关。多数主机简单地通过一个网卡连接到网络,因此只有通过一个路由器到其它网络,这样在路由表中只有三项:loopback项、本地子网项和缺省项(指向路由器)。
  
  2、重叠路由
  
  
  假设在路由表中有下列重叠项:
      目的     掩码       网关     标志  接口
   -----------  -----------   -----------  ---- -----
    1.2.3.4  255.255.255.255  201.66.37.253 UGH  eth0
    1.2.3.0  255.255.255.0   201.66.37.254 UG  eth0
    1.2.0.0  255.255.0.0    201.66.37.253 UG  eth1
    default  0.0.0.0      201.66.39.254 UG  eth1
  之所以说这些路由重叠是因为这四个路由都含有地址1.2.3.4,假如向1.2.3.4发送数据,会选择哪条路由呢?在这种情况下,会选择第一条路由,通过网关201.66.37.253。
原则是选择具有最长(最精确)的子网掩码。类似的,发往1.2.3.5的数据选择第二条路由。
  
  注重:这条原则只适用于间接路由(通过网关)。把两个接口定义在同一子网在很多软件实现上是非法的。例如下面的设置通常是非法的(不过有些软件将尝试在两个接口进行负载平衡):
     接口     IP地址     子网掩码
   ------------  ------------   -------------
     eth0    201.66.37.1   255.255.255.0
     eth1    201.66.37.2   255.255.255.0
  
  对于重叠路由的策略是十分有用的,它答应缺省路由作为目的为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、静态路由
  回头看看我们已建立的路由表,已有了六个表项:
  
      目的     掩码       网关     标志   接口
   ------------  -----------    -----------  -----  ---
   127.0.0.1   255.255.255.255  127.0.0.1    UH   lo0
   201.66.37.0  255.255.255.0   201.66.37.74   U   eth0
   201.66.39.0  255.255.255.0   201.66.39.21   U   eth1
   default    0.0.0.0      201.66.39.254   UG  eth1
   73.0.0.0   255.0.0.0     201.66.37.254   UG  eth0
   91.32.74.21  255.255.255.255  201.66.37.254   UGH  eth0
  
  该网络图示如下:
   
  这些表项分别是怎么得到的呢?第一个是当路由表初始化时由路由软件加入的,第二、三个是当网卡绑定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)。主机将在路由表中创建一个新的表项:
      目的      掩码      网关     标志  接口
   -----------  --------------  -----------  ------ -----
   201.66.43.33 255.255.255.255 201.66.39.253  UGHD  eth1
  
  注重标志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中。不过,它经常是某些操作系统的唯一选择。
  
    请查看 路由器(1)