基础知识
路由器技术
路由器技术中最核心的技术是软件技术。路由软件是最复杂的软件之一。有些路由软件运行在UNIX或Linux操作系统上,有些路由软件运行在嵌入式操作系统上,甚至有些软件为提高效率,本身就是操作系统。全球最大的路由器生产厂家Cisco公司曾一度宣称是一个软件公司,可见路由器软件在路由器技术中所占的重要地位。
路由器软件一般实现路由协议功能、查表转发功能和管理维护等其他功能。由于互联网规模庞大,运行在互联网上路由器中的路由表非常巨大,可能包含几十万条路由。查表转发工作可想而知非常繁重。
在路由器研制过程中,可以通过购买商用源码等形式迅速实现路由器。但是通常认为路由器软件需要一年甚至两年的时间来稳定。MikroTik RouterOS在行业的发展已经有7年之久,所以在稳定性和功能上都是非常完善的。
什么是路由器
路由器是工作在OSI参考模型第三层——网络层的数据包转发设备。路由器通过转发数据包来实现网络互连。虽然路由器可以支持多种协议(例如TCP/IP、IPX/SPX、AppleTalk等协议),但是在我国绝大多数路由器运行TCP/IP协议。
路由器通常连接两个或多个由IP子网或点到点协议标识的逻辑端口,至少拥有1个物理端口。路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址,并且重写链路层数据包头实现转发数据包。 路由器通常动态维护路由表来反映当前的网络拓扑。路由器通过与网络上其他路由器交换路由和链路信息来维护路由表。路由器是连接IP网的核心设备。
最简单的网络可以想象成单线的总线,各个计算机可以通过向总线发送分组以互相通信。但随着网络中的计算机数目增长,这就很不可行了,会产生许多问题:
1、带宽资源耗尽。
2、每台计算机都浪费许多时间处理无关的广播数据。
3、网络变得无法管理,任何错误都可能导致整个网络瘫痪。
4、每台计算机都可以监听到其他计算机的通信。
把网络分段可以解决这些问题,但同时你必须提供一种机制使不同网段的计算机可以互相通信,这通常涉及到在一些ISO网络协议层选择性地在网段间传送数据,我们来看一下网络协议层和路由器的位置。

我们可以看到,路由器位于网络层。本文假定网络层协议为IPv4,因为这是最流行的协议,其中涉及的概念与其他网络层协议是类似的。
路由与网桥
路由相对于二层的桥接/交换是高层的概念,不涉及网络的物理细节,工作在二层的设备如交换机、无线AP等。在可路由的网络中,每台主机都有同样的网络层地址格式(如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通信。
IP地址
是用来标识Internet网上主机的,共32位。这个地址在整个网中是唯一的,为了便于记忆,可将这32位数分成4个组,每组8位,然后将每一组都用相应的十进制数表示,例如 202.102.14.141,IP地址分为两部分,第一部分是网络号码,用来标识Internet上某个特定的网络,第二部分是主机号,用来标识某个特定网络上的主机号.IP地址是人们在Internet上为了区分数以亿计的主机而给每台主机分配的一个专门的地址,通过IP地址就可以访问到每一台主机。
IP地址分类
IP地址分为固定IP地址和动态IP地址。
固定IP地址,也可称为静态IP地址,是长期固定分配给一台计算机使用的IP地址,一般是特殊的服务器才拥有固定IP地址。
动态IP地址是因为IP地址资源非常短缺,通过电话拨号上网或普通宽带上网用户一般不具备固定IP地址,而是由ISP动态分配给暂时的一个IP地址。普通人一般不需要去了解动态IP地址,这些都是计算机系统自动分配完成的。
IP地址分为公有IP地址和私有IP地址。
公有地址(Public address,也可称为公网地址)由Internet NIC(Internet Network Information
Center因特网信息中心)负责。这些IP地址分配给注册并向Internet
NIC提出申请的组织机构。通过它直接访问因特网,它是广域网范畴内的。
私有地址(Private address,也可称为专网地址)属于非注册地址,专门为组织机构内部使用,它是局域网范畴内的,出了所在局域网是无法访问因特网的。
留用的内部私有地址目前主要有以下几类:
* A类:
* B类:172.16.0.0--172.31.255.255
* C类:192.168.0.0--192.168.255.255
在可路由的网络层协议中,协议地址必须含有两部分信息:网络地址和主机地址。存贮这种信息最明显的方法是用两个分离的域,这样我们必须考虑到两个域的最大长度,有些协议(如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个主机的子网)。
4、可变长子网掩码(VLSM)
如果你想把你的网络分成多个不同大小的子网,可以使用可变长子网掩码,每个子网可以使用不同长度的子网掩码。例如:如果你按部门划分网络,一些网络的掩码可以为255.255.255.0(多数部门),其它的可为255.255.252.0(较大的部门)。
路由
1、路由表
如果一个主机有多个网络接口,当向一个特定的IP地址发送分组时,它怎样决定使用哪个接口呢?答案就在路由表中。来看下面的例子:
|
目的 |
子网掩码 |
网关 |
标志 |
接口 |
|
201.66.37.0 |
255.255.255.0 |
201.66.37.74 |
A |
eth0 |
|
201.66.39.0 |
255.255.255.0 |
201.66.39.21 |
A |
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)发送。标志A表示该路由状态为“active”(即激活状态)。对于直接连接的网络,一些软件并不象上例中一样给出接口的IP地址,而只列出接口。
此例只涉及了直接连接的主机,那么目的主机在远程网络中如何呢?如果你通过IP地址为201.66.37.254的网关连接到网络73.0.0.0,那么你可以在路由表中增加这样一项:
目的 掩码
网关
标志 接口
73.0.0.0 255.0.0.0 201.66.37.254 AG eth0
此项告诉主机所有目的地为网络73.0.0.0内主机的分组通过201.66.37.254路由过去。标志S(static)表示此项通过静态指定把分组导向外部网关。类似的,也可以定义通过网关到达特定主机的路由,也标志为S:
|
目的 |
掩码 |
网关 |
标志 |
接口 |
|
91.32.74.21 |
255.255.255.255 |
201.66.37.254 |
AS |
eth0 |
下面是路由表的基础,除了特殊表项之外:
|
目的 |
掩码 |
网关 |
标志 |
接口 |
|
127.0.0.1 |
255.255.255.255 |
127.0.0.1 |
A S |
lo0 |
|
default |
|
201.66.37.254 |
AS |
eth1 |
第一项是loopback接口,用于主机给自己发送数据,通常用于测试和运行于IP之上但需要本地通信的应用。这是到特定地址127.0.0.1的主机路由(接口lo0是IP协议栈内部的“假”网卡,在RouterOS中)。第二项十分有意思,为了防止在主机上定义到因特网上每一个可能到达网络的路由,可以定义一个缺省路由,如果在路由表中没有与目的地址相匹配的项,该分组就被送到缺省网关。多数主机简单地通过一个网卡连接到网络,因此只有通过一个路由器到其它网络,这样在路由表中只有三项:loopback项、本地子网项和缺省项(指向路由器)。
2、重叠路由
假设在路由表中有下列重叠项:
|
目的 |
掩码 |
网关 |
标志 |
接口 |
|
|
255.255.255.255 |
201.66.37.253 |
AS |
eth0 |
|
|
255.255.255.0 |
201.66.37.254 |
AS |
eth0 |
|
|
255.255.0.0 |
201.66.37.253 |
AS |
eth1 |
|
default |
|
201.66.39.254 |
AS |
eth1 |
之所以说这些路由重叠是因为这四个路由都含有地址
注意:这条原则只适用于间接路由(通过网关)。把两个接口定义在同一子网在很多软件实现上是非法的。例如下面的设置通常是非法的(不过有些软件将尝试在两个接口进行负载平衡):
|
接口 |
IP地址 |
子网掩码 |
|
eth0 |
201.66.37.1 |
255.255.255.0 |
|
eth1 |
201.66.37.2 |
255.255.255.0 |
对于重叠路由的策略是十分有用的,它允许缺省路由作为目的为
3、静态路由
回头看看我们已建立的路由表,已有了六个表项:
|
目的 |
掩码 |
网关 |
标志 |
接口 |
|
127.0.0.1 |
255.255.255.255 |
127.0.0.1 |
AS |
lo0 |
|
201.66.37.0 |
255.255.255.0 |
201.66.37.74 |
AS |
eth0 |
|
201.66.39.0 |
255.255.255.0 |
201.66.39.21 |
AS |
eth1 |
|
default |
|
201.66.39.254 |
AS |
eth1 |
|
73.0.0.0 |
255.0.0.0 |
201.66.37.254 |
AS |
eth0 |
|
91.32.74.21 |
255.255.255.255 |
201.66.37.254 |
AS |
eth0 |
该网络图示如下:

这些表项分别是怎么得到的呢?第一个是当路由表初始化时由路由软件加入的,第二、三个是当网卡绑定IP地址时自动创建的,其余三个必须手动加入。
NAT技术
NAT技术主要解决IP地址短缺问题,最初提出的建议是在子网内部使用局部地址,而在子网外部使用少量的全局地址,通过路由器进行内部和外部地址的转换。局部地址是在子网内部独立编址的,可以与外部地址重叠。这种想法的基础是假定在任何时候子网中只有少数计算机需要与外部通信,可以让这些计算机共享少量的全局IP地址。后来根据这种技术又开发出其他一些应用,下面讲述两种最主要的应用:
第一种应用事动态地址翻译(Dynamic Address Translation)。为此首先引入存根域的概念,所谓存根域(Stub Domain)就是内部网络的抽象,这样的网络只是处理源和目标都在子网内部的通信。任何时候存根域内只有一部份主机要与外界通信,甚至还有许多主机可能从不与外界通信,所有整个存根域只需要共享少量的全局IP地址。存根域有一个边界路由器,由它来处理域内与外部的通信。这种NAT地址使用如下特点:
只要缓冲区中存在尚未使用的C类地址,任何从内向外的连接请求都可以得到响应,并且在边界路由器的动态NAT表中为之建立一个映像表项;
如果内部主机的映像存在,就可以利用它建立连接;
从外部访问内部主机是有条件的,即动态NAT表必须存在该主机的映像。<