使用静态选路,用默认方式生成路由表项或者通过ICMP重定向生成表项需要同时满足三种情况。1.网络很小;2与其他网络只有单个连接点;3没有多余路由。如果这三个条件不能完全满足,则通常使用动态选路。
动态选路是路由器之间采用选路协议进行通信,从相邻路由器接受信息来更新内核中的路由表。这种选路协议有很多种。而Internet是以一组自制系统的方式组织的,每个自制系统通常由单个实体管理,例如一个公司或者大学校园。每个自制系统可以选择该自制系统内各个路由器之间的选路协议,这种协议称为内部网关协议IGP(interior gateway protocol)。最常用的IGP就是选路信息协议RIP(routinginformation protocol)另外还有一种新的IGP是OSPF(Open shortest path first).
RIP路由信息协议
RIP报文包含在UDP报文里面,然后再加上IP首部发送。
RIP报文格式如下图:
命令字段中1表示请求。2表示应答。3和4舍弃不用。还包括两个非正式的命令:5表示轮询,6表示轮询表项。对于RIP-2,版本号为2.路由域是一个选路守护程序的标识符,指出这个数据报的所有者。在unix中,是一个选路守护程序的进程号。这就允许在单个路由器上运行多个RIP实例。后面紧跟的20个字节是RIP报文的路由部分。一个RIP报文最多有25个路由部分信息。地址类字段用来标识所使用的地址协议,如果采用的IP地址,这个字段值为2.路由标记字段表示自制系统号(由IANA分配,16位,最多65535个)。这个字段是为了支持外部网关协议而设置的。最后的度量部分表示到此网络的距离。RIP协议是一种分布式的基于距离向量的路由选择协议。RIP协议要求网络中的每个路由器都要维护从它自己到其他每一个目的网络的距离记录。从一个路由器到直接相连的网络的距离定义为1.从一个路由器到非直接相连的网络的距离为所经过的路由器数据加1.RIP协议允许一条路径上最多只能包含15个路由器,即最大为16.
RIP协议的特点是:
1. 仅仅和相邻的路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。RIP协议规定,不相邻的路由器不交换信息。
2. 路由器交换的信息时当前本路由器所知道的全部信息,即自己的路由表。也就是说,交换的信息为:我到本自制系统中所有网络的最短距离,以及到每个网络应该经过的吓一跳路由器。如上图所示
3. 按固定时间间隔交换路由信息,如每隔30秒。路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也几十向相邻路由器通告拓扑变化后的路由信息。
路由器刚开始工作的时候,只知道直接相连的网络的距离,这些距离为1.接着,每个路由器也只和数据非常有限的相邻路由器交换并更新路由信息。经过若干次更新后,所有的路由器最终都会知道这个新的路由器并且这个新的路由器也会知道到达其他网络需要经过的下一跳路由器和距离。
路由表中的主要信息就是到某个网络的距离(即最短距离),以及经过的下一跳地址。路由表更新的原则就是找到每个目的网络的最短距离。采用的算法成为距离向量算法。具体算法步骤不再详述。但是RIP协议的信息交换方式也决定了其具备一定的缺陷。首先,最大距离为16限制了网络的规模。其次,若网络中某一个路由器端口发生了故障,这个消息不会很快的传给网络中的所有路由器。只能由相邻的路由器一层层的扩散,即坏消息传播的很慢。
而OSPF协议几乎克服了RIP的所有限制。
OSPF开放最短路径优先协议
OSPF名字为开放最短路径优先(open shortest path first).其中最短路径优先是因为使用了Dijkstra提出的最短路径算法。使用这个算法需要每个路由器都了解自己到网络中所有其他路由器的信息。这个算法应该是一个动态规划的算法。
OSPF协议交换的并不是距离向量信息,而是相邻站点的链路状态。路由器主动地测试与其临站相连的链路状态,将这些信息发送给它的其他邻站,而邻站将这些信息在自制系统内传播出去,这样每个路由器接受这些链路状态信息并建立完整的路由表。这样链路状态协议总是比距离向量协议收敛的快。收敛的意思为路由发生变化后,例如路由器关闭或链路发生故障后,可以稳定下来。
OSPF报文首部如下图:
类型字段表示报文的类型。OSPF报文总共有5个类型
1. 问候分组(Hello)分组,用来发现和维持邻站的可达性。
2. 数据库描述(Database Description)分组,向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
3. 链路状态请求(Link State Request)分组,向对方请求发送某些链路状态项目的详细信息。
4. 链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态。这种分组时最复杂的,也是OSPF协议最核心的部分。路由器使用这种分组将其链路状态通知给邻站。链路状态更新分组共有五种不同的链路状态。这里从略。
5. 链路状态确认(Link State Acknowledge)分组,对链路更新分组的确认。
分组长度包括SOPF首部在内的分组长度,以字节为单位。
路由器标识符 标识发送该分组的路由器的接口的IP地址
区域标识符 分组属于的区域的标识符
鉴别类型(AuType)目前只有两种,0(不用)和1(口令)
鉴别 鉴别类型为0时就填入0.鉴别类型为1时就填入9个字符的口令。
OSPF分组由OSPF首部加上某一类型的OSPF分组内容组成。
与RIP报文不同的是,OSPF直接使用IP,OSPF分组直接加上IP数据报首部发送。
OSPF协议规定,每两个相邻的路由器每隔10秒就要交换一次问候分组。这样就能知道哪些邻站是可达的。对相邻路由器来说,可达是基本的要求。因为只有可达邻站的链路状态信息才存入链路状态数据库。在正常情况下,网络中传送的对大多数为OSPF问候分组。若有40秒没有收到某个相邻路由器发来的问候分组,就认为该路由器时不可达的,应立即修改链路状态数据库,并重新计算路由表。而另外四种分组都是用来进行链路状态数据库的同步。所谓同步就是指不同路由器的链路状态数据库的内容是一样的。两个同步的路由器叫做完全相邻的路由器。不是完全相邻的路由器表明它们虽然在物理上是相邻的,但是其链路状态数据库并没有达到一致。当一个路由器刚开始工作的时候,只能通过问候分组得知它有哪些相邻的路由器在工作,以及将数据发往相邻路由器所需的代价。如果所有的路由器都把自己的本地链路状态信息进行全网广播,则各个路由器只要将这些链路状态信息综合起来就能得到链路状态数据库。但是这样做的开销太大,随意OSPF让每个路由器用数据库表述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。摘要嘻嘻主要就是指出哪些路由器的链路状态信息已经写入数据库。经过与相邻路由器交换数据库描述分组后,路由器就是用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的分组交换,全网同步的链路数据库就简历了。若网络运行中,某个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路信息。
为了确保链路状态数据库与全网的状态保持一致,OSPF还规定每隔一段时间就要刷新一次数据库中的链路状态。每隔路由器的链路状态只涉及到与相邻路由器的连通状态,所以与整个互联网的规模并没有直接关系,即使互联网的规模很大时,OSPF协议要比RIP协议好得多。设N个路由器连接在以太网上,每个路由器要向其他N-1个路由器发送链路状态信息,所以共有(N-1)2个链路状态要在这个以太网上传送。OSPF协议对这种多点介入的局域网采用了指定的路由器的方法,是广播的信息量大大减小。OSPF将一个自治系统划分为若干个更小的范围,叫做区域。每个区域都有一个32位的区域标识符。一个区域内的路由器最好不要超过200个。
BGP外部网关协议
首先,一个自治系统就是处于一个管理机构控制之下的路由器和网络群组。它可以是一个路由器直接连接到一个LAN上,同时也连到Internet上;它可以是一个由企业骨干网互连的多个局域网。在一个自治系统中的所有路由器必须相互连接,运行相同的路由协议,同时分配同一个自治系统编号。自治系统之间的链接使用外部路由协议,例如BGP.
在一个自治系统中,其IP数据报分为本地流量和通过流量。在自治系统中,本地流量是起始或终止于该自治系统的流量,即其信源IP地址或者信宿IP地址所指定的主机位于该自治系统。其他的流量成为通过流量。使用BGP的一个目的就是减少通过流量。自治系统可以分为以下三种类型。
一.残桩自治系统(stub AS),与其他自治系统只有单个连接,即其只有本地流量。
二.多接口自治系统(multihomed AS),与其他自治系统有多个连接,但拒绝传送同通过流量。
三.转送自治系统(transit AS),与其他自治系统有多个连接,在一些策略准则之下,可以传送本地流量和通过流量。
RIP或者OSPF主要是设法使数据报在一个自治系统中尽可能有效的从原站传送到目的地站。而一个自治系统内部不需要考虑其他方面的策略。而BGP是不同的自治系统的路由器之间进行通信的外部网关协议。由于因特网规模太大,BGP在不同的自治系统间选择路由非常困难。如果使用链路状态协议,每个路由器需要维护很大的链路状态数据库并且还要考虑自治系统的不同类型。所以,BGF只能寻找一条能够到达目的地的网络并且是较好的路由,但并不是最佳路由。BGP采用的算法是路径向量路由选择协议。
与RIP和SOFP不同的是,BGP使用TCP作为其传输协议。两个运行BGP的系统之间建立一条TCP连接,然后交换整个BGP路由表。
CIDR无分类编址
首先介绍两级IP地址及其缺陷:
分类的IP地址(A/B/C/D/E类IP地址)为两级IP地址,分为网络号和主机号。
1二级的IP地址空间利用率有的时候很低。例如一个C类地址最多包含256-2=254个主机,如果一个网络拥有289个主机,就需要分配一个B类地址。这样地址利用率太低。
2每一个网络都分配一个网络号会使得路由表变得太大而影响路由表查找的效率,单单C类地址可指派的网络总数就是2^21-1个。
3两级IP地址不够灵活。例如一个单位需要在新的地点开通一个新的网络。但是新的IP地址申请下来之前,新增加的网络是无法连接因特网进行工作。
由于上述问题,引出了划分子网的做法。划分子网的基本思路如下:
1一个拥有许多物理网络的单位,将自己的物理网络划分为若干个子网。划分子网纯属单位内部的事情。本单位外网络是不知道这个网络到底是有多少个子网的,这个单位对外表现还是一个网络。
2划分子网的做法是从网络的主机号中借用若干位作为子网号同时主机号也就相应减少了同样的位数。两级IP地址就变为了三级IP地址,由网络号、子网号、主机号组成。对于上面第一个问题,可以给那个网络分配两个C类地址,即网络号16位,子网号6位,主机号10位。
3凡是从其他网络发送给本单位的某个主机的IP数据报,仍然是根据IP数据报的目的网络号(即本单位的网络号)找到链接在本单位网络的路由器。再由本单位的路由器按照目的网络号和子网号找到目的子网,交付给目的主机。对于上面的第二个问题,网络中的路由器只需要记录单位网络(即包含多个子网的打网络)的路由器即可。对于第三个问题,如果需要开通一个新的网络,只需要增加原来单位网络的子网号,就可以再多增加新的子网,但是同时每个子网中所能包含的主机数目会相应减少。
划分子网增加了灵活性,但是由于RFC950规定,子网号不能为全1或全0,却减少了能够连接在网络上的主机总数。不过随着CIDR的广泛使用,现在全1和全0的子网号也可以使用了,不过需要注意路由器的路由选择软件是否支持。
CIDR:构造超网
CIDR消除了传统的分类IP地址的概念,有效的利用了IP地址空间。其表示方法为网络前缀+主机号。可以使用斜线记法即IP地址后面加上斜线“/”然后再加上网络前缀所占的位数。CIDR把网络前缀相同的连续IP地址组成一个CIDR地址块。
例如:某家公司使用4个B类网络:分部A的IP地址为172.16.0.0/16,分部B的IP地址为172.17.0.0/16,分部C的IP地址为172.18.0.0/16,分部D的IP地址为172.19.0.0/16,可以将它们合并为一个地址块:172.16.0.0/14,它代表全部4个B类网络,这种操作是CIDR,因为合并跨越了B类网络的边界。(该举例来自http://blog.sina.com.cn/s/blog_56c321170100ddlo.html)
上例所采用的方法为路由聚合,这使得路由表中的一个项目可以表示原来传统分类地址的很多歌路由。路由聚合也成为构成超网。
在使用CIDR时,由于采用了网络前缀这种记法,IP地址由网络前缀和主机号这两个部分组成,因此在路由表中的项目也要有相应的改变。每个项目由网络前缀和下一跳地址组成。但是在查找路由表时可能会得到不止一个匹配结果,准则为最长匹配。例如路由表中含有206.0.68.0/22和206.0.71128/25两项,一个目的IP地址为206.0.71.130,该地址与前述路由表中的两项均匹配,则匹配后者。对于这些地址块儿,路由器中建立一个二叉线索树的结构,查找的时候从根节点逐层向下层延伸查找,具体算法不再赘述。