Cisco
路由技术基础知识详解
路由器
<
一
>
最简单的网络可以想象成单线的总线,各个计算机可以通过向总线发送分组以互相通信。但随着网络中的计算机数目增长,这就很不可行了,会产
生许多问题:
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
分组后处理,注意发送者的对被存到接收
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
地址索引。该表可以用命令
arp
来管理,其语法包括:
向表中添加静态表项
-- arp -s
从表中删除表项
-- arp -d
显示表项
-- 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 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
中。不过,它常常是某些操作系统的唯一选择。