查看完整版本: 路由和交换技术

y2yuyu 2007-7-5 13:59

路由和交换技术

路 由 和 交 换 技 术 资 料
































二〇〇七年五月



目  录

第1章 TCP/IP协议与IP地址介绍        6
1.1 TCP/IP协议与OSI参考模型        6
1.2 应用层        9
1.3 传输层        10
1.4 网络层        15
1.5 IP地址介绍        18
第2章 路由协议基础        23
2.1 什么是路由        23
2.2 通过路由表进行选路        24
2.3 路由表中路由的来源        24
2.4 路由优先级        25
2.5 路由的花费        26
2.6 静态路由配置        26
2.7 静态路由配置示例        27
2.8 缺省路由的配置        28
2.9 路由自环        29
第3章 动态路由协议概述        30
3.1 动态路由协议在协议栈中的位置        30
3.2 自治系统(AS)        30
3.3 路由协议的分类        31
3.4 路由协议之间的互操作        32
3.5 衡量路由协议的一些性能指标        33
第4章 距离矢量路由协议概述        34
4.1 距离矢量算法基本原理        34
4.2 距离矢量协议路由发现        35
4.3 距离矢量协议拓扑变化        35
4.4 路由环路问题        36
4.4.1 路由环路产生        36
4.4.2 环路补救方案-定义一个最大值        37
4.4.3 环路避免方案        37
4.4.4 在多路径情况下的解决方案        39
第5章 RIP路由协议        41
5.1 RIP协议概述        41
5.2 RIP协议的实现        42
第6章 IS-IS协议基本原理        44
6.1 IS-IS概览        44
6.2 链路状态协议简介        44
6.3 L1和L2的基本概念        45
6.4 IS-IS的基本工作原理        46
6.5 报文分类        46
6.6 邻居建立及数据库同步        47
6.7 DIS与伪节点        49
6.8 IS-IS协议的地址编码方式        50
6.9 节点识别        50
6.10 泛洪算法        51
6.11 IS-IS与OSPF比较        52
第7章 OSPF路由协议        54
7.1 OSPF协议原理        54
7.2 OSPF基本概念        55
7.3 链路状态        55
7.4 计算路由        56
7.5 OSPF的协议报文        57
7.6 OSPF的邻居状态机        58
7.7 链路状态数据库的同步过程        59
7.8 DR和BDR        60
7.9 NBMA和点到多点        62
7.10 区域划分        63
7.11 区域间路由计算        64
7.12 骨干区域与虚连接        64
7.13 与自治系统外部通讯        65
7.14 STUB区域与路由聚合        66
7.15 LSA分类        68
7.16 接口分类及路由器分类        69
7.17 OSPF与路由自环        70
第8章 BGP协议概述        72
8.1 基本概念        72
8.2 自治系统        73
8.3 BGP的工作机制        74
8.4 BGP的两种邻居        75
8.5 BGP路由通告原则        75
8.6 BGP同步        76
8.7 如何成为BGP路由        77
第9章 BGP的报文和状态机        80
9.1 报文种类        80
9.2 报文内容及格式        80
9.3 BGP协议的状态机        83
9.4 BGP协议中消息的应用        84
第10章 BGP路由属性        85
10.1 路由属性概述        85
10.2 常见BGP路由属性        86
10.2.1 ORIGIN属性        86
10.2.2 AS-PATH属性        87
10.2.3 下一跳属性        88
10.2.4 本地优先属性        88
10.2.5 MED属性        89
10.2.6 团体属性        90
10.3 BGP路由选择过程        90
第11章 交换技术基础及运用        92
11.1 概述        92
11.2 交换技术的种类        92
11.3 局域网交换机的种类        93
11.4 VLAN的基本概念        94
11.5 VLAN的网络功能        96
11.5.1 VLAN的网络功能包括二层交换、三层路由。        96
11.5.2 VLAN与二层交换        97
11.5.3 VLAN 与三层路由        97
11.5.4 三层交换机的出现:        98
11.6 VLAN动态注册协议        100
第12章 生成树协议        101
12.1 桥接概述        101
12.2 冗余链和产生的问题—Mac地址表不稳定        102
12.3 冗余链和产生的问题—广播风暴        103
12.4 生成树协议的引入        103
12.5 生成树协议基本原理        104
12.6 配置消息介绍        105
12.7 配置消息格式        106
12.8 生成树比较        109
12.9 配置消息举例        110
12.10 生成树协议的不足        111
12.11 快速生成树协议的介绍        112
12.12 STP与RSTP端口角色的比较        112
12.13 STP与RSTP状态机的比较        114
12.14 快速生成树协议改进        114
12.15 生成树和快速生成树的比较        117



第1章  TCP/IP协议与IP地址介绍

1.1  TCP/IP协议与OSI参考模型

为了解决网络之间兼容性的问题,帮助各个厂商生产出可兼容的网络设备,国际标准化组织ISO(International Standards Organization)于1984年提出了开放系统互连参考模型OSI/RM(Open System Interconnection Reference Model),它很快成为计算机网络通信的基础模型。
TCP/IP起源于6 0年代末美国政府资助的一个分组交换网络研究项目,到90年代已发展成为计算机之间最常应用的组网形式。它是一个真正的开放系统,因为协议族的定义及其多种实现可以不用花钱或花很少的钱就可以公开地得到。它成为被称作“全球互联网”或“因特网(Internet)”的基础
与OSI参考模型一样,TCP(Transfer Control Protocol)/IP(Internet Protocol)协议(传输控制协议/网际协议)也分为不同的层次开发,每一层负责不同的通信功能。但是,TCP/IP协议简化了层次设计,只有五层:应用层、传输层、网络层、数据链路层和物理层。从上图可以看出,TCP/IP协议栈与OSI参考模型有清晰的对应关系,覆盖了OSI参考模型的所有层次。应用层包含了OSI参考模型所有高层协议。
两种协议的异同点:
相同点:
(1)         都是分层结构,并且工作模式一样,都要层和层之间很密切的协作关系;
(2)         有相同的应用层,传输层,网络层,数据链路层,物理层;(注意:这里为了方便比较,TCP/IP才分为5层,在CISCO,在其他很多文献资料里都把数据链路层和物理层合并为数据链路层或网络接口层-network access layer)。
(3)         都使用包交换技术(packet-switched)
(4)         网络工程师必须都要了解这两个模型;
不同点:
(1)         TCP/IP把表示层和会话层都归入了应用层;
(2)         TCP/IP的结构比较简单,因为分层少;
(3)         TCP/IP标准是在internet网络不断的发展中 建立的,基于实践,有很高的信任度。相比较而言,OSI参考模型是基于理论上的,是做为一种向导!
                                  TCP/IP协议栈的封装过程

同OSI参考模型数据封装过程一样,TCP/IP协议在报文转发过程中,封装和去封装也发生在各层之间。
发送方,加封装的操作是逐层进行的。各个应用程序将要发送的数据送给传输层;传输层(TCP/UDP)对数据分段为大小一定的数据段,加上本层的报文头。发送给网络层。在传输层报文头中,包含接收它所携带的数据的上层协议或应用程序的端口号,例如,Telnet 的端口号是 23。传输层协议利用端口号来调用和区别应用层各种应用程序。
网络层对来自传输层的数据段进行一定的处理(利用协议号区分传输层协议、寻找下一跳地址、解析数据链路层物理地址等),加上本层的IP报文头后,转换为数据包,再发送给链路层(以太网、帧中继、PPP、HDLC等);
链路层依据不同的数据链路层协议加上本层的帧头,发送给物理层以比特流的形式将报文发送出去。
在接收方,这种去封装的操作也是逐层进行的。从物理层到数据链路层,逐层去掉各层的报文头部,将数据传递给应用程序执行。
图中帧头和帧尾下面所标注的数字是典型以太网帧首部的字节长度。在后面的章节中 我们将详细讨论这些帧头的具体含义。
以太网数据帧的物理特性是其长度必须在4 6~1500字节之间。
所有的Internet标准和大多数有关TCP/IP的书都使用octet这个术语来表示字节。使用这个过分雕琢的术语是有历史原因的,因为TCP/IP的很多工作都是在DEC-10系统上进行的,但是它并不使用8 bit的字节。由于现在几乎所有的计算机系统都采用8 bit的字节。更准确地说,图中IP和网络接口层之间传送的数据单元应该是分组(packet)。分组既可以是一个IP数据报,也可以是I P数据报的一个片(fragment)。
UDP数据与TCP数据基本一致。唯一的不同是UDP传给IP的信息单元称作UDP数据报(UDP datagram),而且UDP的首部长为8字节。
由于TCP、UDP、ICMP和IGMP都要向IP传送数据,因此IP必须在生成的IP首部中加入某种标识,以表明数据属于哪一层。为此,IP在首部中存入一个长度为8bit的数值,称作协议域。1表示为I C M P协议,2表示为IGMP协议,6表示为TCP协议,17表示为UDP协议。类似地,许多应用程序都可以使用TCP或UDP来传送数据。运输层协议在生成报文首部时要存入一个应用程序的标识符。TCP和UDP都用一个16bit的端口号来表示不同的应用程序。TCP和UDP把源端口号和目的端口号分别存入报文首部中。
网络接口分别要发送和接收IP、ARP和RARP数据,因此也必须在以太网的帧首部中加入某种形式的标识,以指明生成数据的网络层协议。为此,以太网的帧首部也有一个16bit的帧类型域。
                                      TCP/IP协议数据封装方式

当应用程序用T C P传送数据时,数据被送入协议栈中,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息)。T C P传给I P的数据单元称作T C P报文段或简称为T C P段(TCPsegment)。I P传给网络接口层的数据单元称作I P数据报(IP PACKETS)。通过以太网传输的比特流称作帧(Fr a m e )。
在物理层转变为二进制BIT流。
                                      TCP/IP协议栈

物理层和数据链路层涉及到在通信信道上传输的原始比特流,它实现传输数据所需要的机械、电气、功能性及过程等手段,提供检错、纠错、同步等措施,使之对网络层显现一条无错线路;并且进行流量调控。网络层检查网络拓扑,以决定传输报文的最佳路由,执行数据转发。其关键问题是确定数据包从源端到目的端如何选择路由。网络层的主要协议有IP(Internet protocol)、ICMP(Internet Control Message Protocol,互联网控制报文协议)、IGMP(Internet Group Management Protocol,互联网组管理协议)、ARP(Address Resolution Protocol,地址解析协议)和RARP(Reverse Address Resolution Protocol,反向地址解析协议)等。
传输层的基本功能是为两台主机间的应用程序提供端到端的通信。传输层从应用层接受数据,并且在必要的时候把它分成较小的单元,传递给网络层,并确保到达对方的各段信息正确无误。传输层的主要协议有TCP(Transfer control protocol传输控制协议)、UDP(User Datagraph Protocol,用户数据报协议)。
应用层负责处理特定的应用程序细节。应用层显示接收到的信息,把用户的数据发送到低层,为应用软件提供网络接口。应用层 包含大量常用的应用程序,例如HTTP(HyperText Transfer Protocol超文本传输协议)、Telnet(远程登录)、FTP(File Transfer Protocol)、TFTP(Trivial File Transter Protocol)等。
1.2  应用层

应用层为用户的各种网络应用开发了许多网络应用程序,例如文件传输、网络管理等,甚至包括路由选择。这里我们重点介绍常用的几种应用层协议。
FTP(文件传输协议、File Transfer Protocol)是用于文件传输的Internet标准。FTP支持一些文本文件(例如ASCII、二进制等等)和面向字节流的文件结构。FTP使用传输层协议TCP在支持FTP的终端系统间执行文件传输,FTP与我们已描述的另一种应用不同,它采用两个TCP连接来传输一个文件。
(4)         控制连接以通常的客户服务器方式建立。服务器以被动方式打开众所周知的用于FTP的端口(21),等待客户的连接。客户则以主动方式打开TCP端口21,来建立连接。控制连接始终等待客户与服务器之间的通信。该连接将命令从客户传给服务器,并传回服务器的应答。由于命令通常是由用户键入的,所以IP对控制连接的服务类型就是“最大限度地减小迟延”。
(5)         每当一个文件在客户与服务器之间传输时,就创建一个数据连接。(其他时间也可以创建,后面我们将说到)。由于该连接用于传输目的,所以IP对数据连接的服务特点就是“最大限度提高吞吐量”。
因此,FTP被认为提供了可靠的面向连接的服务,适合于远距离、可靠性较差线路上的文件传输。
TFTP(Trivial File Transfer Protocol,简单文件传输协议)也是用于文件传输,但TFTP使用UDP提供服务,被认为是不可靠的,无连接的。TFTP通常用于可靠的局域网内部的文件传输。TFTP最初打算用于引导无盘系统(通常是工作站或X终端)。TFTP的代码(和它所需要的UDP、IP和设备驱动程序)都能适合只读存储器。它只使用几种报文格式,是一种停止等待协议。为了允许多个客户端同时进行系统引导,TFTP服务器必须提供一定形式的并发。因为UDP在一个客户与一个服务器之间并不提供唯一连接(TCP也一样),TFTP服务器通过为每个客户提供一个新的UDP端口来提供并发。TFTP协议没有提供安全特性。大多数执行指望TFTP服务器的系统管理员来限制客户的访问,只允许它们访问引导所必须的文件。TFTP也是我们升级设备的一种方式。
SMTP(Simple Mail Transfer Protocol。简单邮件传输协议)支持文本邮件的Internet传输。
POP3(Post Office Protocol)是一个流行的Internet邮件标准。
SNMP(Simple Network Management Protocol。简单网络管理协议)负责网络设备监控和维护,支持安全管理、性能管理等。
Telnet是客户机使用的与远端服务器建立连接的标准终端仿真协议。
Ping命令是一个诊断网络设备是否正确连接的有效工具。
Tracert命令和Ping命令类似,tracert命令可以显示数据包经过的每一台网络设备信息,是一个很好的诊断命令。
HTTP协议支持WWW(World Wide Web,万维网)和内部网信息交互,支持包括视频在内的多种文件类型。HTTP是当今流行的Internet标准。
DNS(Domain Name System,域名系统)把网络节点的易于记忆的名字转化为网络地址。
WINS(Windows Internet Name Server,Windows Internet命名服务器),此服务可以将NetBIOS 名称注册并解析为网络上使用的IP地址。
BootP(Bootstrap Protocol,引导协议)是使用传输层UDP协议动态获得IP地址的协议。是DHCP协议的前身。
1.3  传输层

传输层位于应用层和网络层之间,为终端主机提供端到端的连接,以及流量控制(由窗口机制实现)、可靠性(由序列号和确认技术实现)、支持全双工传输等等。传输层协议有两种:TCP和UDP。虽然TCP和UDP都使用相同的网络层协议IP,但是TCP和UDP却为应用层提供完全不同的服务。
传输控制协议TCP:为应用程序提供可靠的面向连接的通信服务,适用于要求得到响应的应用程序。目前,许多流行的应用程序都使用TCP。
用户数据报协议UDP:提供了无连接通信,且不对传送数据包进行可靠的保证。适合于一次传输小量数据,可靠性则由应用层来负责。
TCP协议通过以下过程来保证端到端数据通信的可靠性:
(1)         TCP实体把应用程序划分为合适的数据块,加上TCP报文头,生成数据段;
(2)         当TCP实体发出数据段后,立即启动计时器,如果源设备在计时器清零后仍然没有收到目的设备的确认报文,重发数据段;
(3)         当对端TCP实体收到数据,发回一个确认。
(4)         TCP包含一个端到端的校验和字段,检测数据传输过程的任何变化。如果目的设备收到的数据校验和计算结果有误,TCP将丢弃数据段,源设备在前面所述的计时器清零后重发数据段。
(5)         由于TCP数据承载在IP数据包内,而IP提供了无连接的、不可靠的服务,数据包有可能会失序。TCP提供了重新排序机制,目的设备将收到的数据重新排序,交给应用程序。
(6)         TCP提供流量控制。TCP连接的每一端都有缓冲窗口。目的设备只允许源设备发送自己可以接收的数据,防止缓冲区溢出。
(7)         TCP支持全双工数据传输。
UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。
TCP/UDP报文格式

TCP协议为终端设备提供了面向连接的、可靠的网络服务,UDP协议为终端设备提供了无连接的、不可靠的数据报服务。从上图我们可以看出,TCP协议为了保证数据传输的可靠性,相对于UDP报文,TCP报文头部有更多的字段选项。
首先让我们来看一下TCP的报文头部主要字段:
每个TCP报文头部都包含源端口号(source port)和目的端口号(destination port),用于标识和区分源端设备和目的端设备的应用进程。在TCP/IP协议栈中,源端口号和目的端口号分别与源IP地址和目的IP地址组成套接字(socket),唯一的确定一条TCP连接。
序列号(Sequence number)字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序列号对每个字节进行计数。序列号是一个32bits的数。
既然每个传输的字节都被计数,确认序号(Acknowledgement number,32bits)包含发送确认的一端所期望接收到的下一个序号。因此,确认序号应该是上次已成功收到的数据字节序列号加1。
URG紧急指针(urgent pointer)有效。
ACK确认序号有效。
PSH接收方应该尽快将这个报文段交给应用层。
RST重建连接。
SYN同步序号用来发起一个连接。这个标志和下一个标志。一般在建立连接时使用。
FIN发端完成发送任务,断开连接时使用。
TCP的流量控制由连接的每一端通过声明的窗口大小(windows size)来提供。窗口大小用数据包来表示,例如Windows size=3, 表示一次可以发送三个数据包。窗口大小起始于确认字段指明的值,是一个16bits字段。窗口大小可以调节。
校验和(checksum)字段用于校验TCP报头部分和数据部分的正确性。如果有了差错要重传。这个和UDP不一样,UDP检测出差错以后直接丢弃,在单个局域网中传输是可以接受的,但是如果通过路由器,会产生很多错误,导致传输失败。因为在路由器中也存在软件和硬件的差错,以致于修改数据报中的数据。
最常见的可选字段是MSS(Maximum Segment Size,最大报文大小)。MSS指明本端所能够接收的最大长度的报文段。当一个TCP连接建立时,连接的双方都要通告各自的MSS协商可以传输的最大报文长度。我们常见的MSS有1024(以太网可达1460字节)字节。
相对于TCP报文,UDP报文只有少量的字段:源端口号、目的端口号、长度、校验和等,各个字段功能和TCP报文相应字段一样。
UDP报文没有可靠性保证和顺序保证字段,流量控制字段等,可靠性较差。当然,使用传输层UDP服务的应用程序也有优势。正因为UDP协议较少的控制选项,在数据传输过程中,延迟较小,数据传输效率较高,适合于对可靠性要求并不高的应用程序,或者可以保障可靠性的应用程序像DNS、TFTP、SNMP等;UDP协议也可以用于传输链路可靠的网络。
端口号

TCP协议和UDP协议使用16bits端口号(或者socket)来表示和区别网络中的不同应用程序,网络层协议IP使用特定的协议号(TCP6,UDP17)来表示和区别传输层协议。
任何TCP/IP实现所提供的服务都是1~1023之间的端口号,这些端口号由IANA(Internet Assigned Numbers Authority,Internet号码分配机构)分配管理。其中,低于255的端口号保留用于公共应用;255到1023的端口号分配给各个公司,用于特殊应用;对于高于1023的端口号,称为临时端口号,IANA未做规定。
常用的TCP端口号有:HTTP 80,FTP 20/21,Telnet 23,SMTP 25,DNS 53等;常用的保留UDP端口号有:DNS 53,BootP 67(server)/ 68(client),TFTP 69,SNMP 161等。
套接字(socket)分为源套接字和目的套接字:
源套接字:源端口号+源IP地址;
目的套接字:目的端口号+目的IP地址;
源套接字和目的套接字用于唯一的确定一条TCP连接。
                                           TCP连接

为了在上图所示的主机和服务器之间建立一个连接,首先需要两端设备进行同步。同步(synchronization)是通过各个携带有初始序列号的数据段交换过程实现的。
主机发送一个序列号为a的报文段1;
服务器发回包含序列号为b的报文段2,并用确认号a+1对主机的报文段1进行确认;
主机接收服务器发回的报文段2,发送报文段3,用确认号b+1对报文段2进行确认。
这样在主机和服务器之间建立了一条TCP连接,这个过程被称为三步握手(three-way handshake)。接下来,数据传输开始。
数据传输结束后,应该终止连接。终止TCP连接需要4次握手。
                                   断开TCP连接

建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN(报文段4)来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。
收到一个FIN只意味着在这一方向上没有数据流动。一个TCP连接在收到一个FIN后仍能发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的TCP应用程序这样做。
首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)执行被动关闭。
当服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个F I N将占用一个序号。同时TCP服务器还向应用程序(即丢弃服务器)传送一个文件结束符。接着这个服务器程序就关闭它的连接,导致它的TCP端发送一个FIN(报文段6),客户必须发回一个确认,并将确认序号设置为收到序号加1(报文段7)。
上图显示了终止一个连接的典型握手顺序。我们省略了序号。在这个图中,发送FIN将导致应用程序关闭它们的连接,这些FIN的ACK是由TCP软件自动产生的。连接通常是由客户端发起的,这样第一个SYN从客户传到服务器。每一端都能主动关闭这个连接(即首先发送FIN)。然而,一般由客户端决定何时终止连接,因为客户进程通常由用户交互控制。
滑动窗口
            
TCP滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口:一个用于接收数据,另一个用于发送数据。TCP使用肯定确认技术,其确认号指的是下一个所期待的字节。
下面我们以数据单方向发送为例,介绍滑动窗口如何实现流量控制。
假定发送方设备以每一次三个数据包的方式发送数据,也就是说,窗口大小为3。发送方发送序列号为1、2、3的三个数据包,接收方设备成功接收数据包,用序列号4确认。发送方设备收到确认,继续以窗口大小3发送数据。当接收方设备要求降低或者增大网络流量时,可以对窗口大小进行减小或者增加,本例降低窗口大小为2,每一次发送两个数据包。当接收方设备要求窗口大小为0,表明接收方已经接收了全部数据,或者接收方应用程序没有时间读取数据,要求暂停发送。发送方接收到携带窗口号为0的确认,停止这一方向的数据传输。
滑动窗口机制为端到端设备间的数据传输提供了可靠的流量控制机制。然而,它只能在源端设备和目的端设备起作用,当网络中间设备(例如路由器等)发生拥塞时,滑动窗口机制将不起作用。我们可以利用ICMP的源抑制机制进行拥塞管理。关于ICMP,我们将在后面介绍。
1.4  网络层

网络层位于TCP/IP协议栈数据链路层和传输层中间,网络层接收传输层的数据报文,分段为合适的大小,用IP报文头部封装,交给数据链路层。网络层为了保证数据包的成功转发,主要定义了以下协议:
IP(Internet Protocol)协议:IP协议和路由协议协同工作, 寻找能够将数据包传送到目的端的最优路径。IP协议不关心数据报文的内容,提供无连接的、不可靠的服务。
ARP协议(Address Resolution Protocol,地址解析协议):把已知的IP地址解析为MAC地址;
RARP(Reverse Address Resolution Protocol,反向地址解析协议):用于数据链路层地址已知时,解析IP地址;
ICMP(Internet Control Message Protocol,网际控制消息协议)定义了网络层控制和传递消息的功能。
IGMP(Internet Group Management Protocol,网际组管理协议),一种组播应用协议。
                                         IP报文格式

普通的IP头部长度为20个字节,不包含IP选项字段。
版本号(Version)字段标明了IP协议的版本号,目前的协议版本号为4。下一代IP协议的版本号为6。
报文长度指IP包头部长度,占4位。
8位的服务类型(TOS,Type of Service)字段包括一个3位的优先权字段(COS,Class of Service),4位TOS字段和1位未用位。4位TOS分别代表最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。Telnet和Rlogin这两个交互应用要求最小的传输时延,因为人们主要用它们来传输少量的交互数据。另一方面,FTP文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管理(SNMP)和路由选择协议。用户网络新闻(Usenet news, NNTP)是唯一要求最小费用的应用。
总长度(Total length)是整个IP数据报长度,包括数据部分。由于该字段长16比特,所以I P数据报最长可达65535字节。尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都会对它进行分片。而且,主机也要求不能接收超过576字节的数据报。UDP限制用户数据报长度为512字节,小于576字节。但是,事实上现在大多数的实现(特别是那些支持网络文件系统NFS的实现)允许超过8192字节的IP数据报。
标识符(Identification)字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
标志位:3比特
多种控制位:
0比特: 保留, 必须为0
1比特: (DF) 0 = 可以分片,  1 =不可以分片.
2比特: (MF) 0 =最后的分片, 1 = 更多的分片.
DF和MF的值不可能相同。
        0   1   2
        +---+---+---+
        |   | D | M |
        | 0 | F | F |
        +---+---+---+
片偏移:指的是这个分片是属于这个数据流的哪里。
生存时间(TTL,Time to Live)字段设置了数据包可以经过的路由器数目。一旦经过一个路由器,TTL值就会减1,当该字段值为0时,数据包将被丢弃。
协议字段确定在数据包内传送的上层协议,和端口号类似,IP协议用协议号区分上层协议。TCP协议的协议号为6,UDP协议的协议号为17。
报头校验和(Head checksum)字段计算IP头部的校验和,检查报文头部的完整性。源IP地址和目的IP地址字段标识数据包的源端设备和目的端设备。
                             ARP-地址解析协议

地址解析协议ARP是一种广播协议,主机通过它可以动态地发现对应于一个IP地址的MAC层地址。
假定主机A需要知道主机B的MAC地址,主机A发送称为ARP请求的以太网数据帧给网段上的每一台主机,这个过程称为广播。发送的ARP请求报文中,带有自己的IP地址到MAC地址的映射,同时还带有需要解析的目的主机的IP地址。目的主机B收到请求报文后,将其中的主机A的IP地址与MAC地址的映射存到自己的ARP高速缓存中,并把自己的IP地址到MAC地址的映射作为响应发回主机A。主机A收到ARP应答,就得到了主机B的MAC地址,同时,主机A缓存主机B的IP地址到MAC地址映射。
                                     RARP-反向地址解析协议

RARP常用于X终端和无盘工作站等,这些设备知道自己MAC地址,需要获得IP地址。
以上图为例,无盘工作站需要获得自己的IP地址,向网络中广播RARP请求,RARP服务器接收广播请求,发送应答报文,无盘工作站获得IP地址。
对应于ARP、RARP请求以广播方式发送,ARP、RARP应答一般以单播方式发送,以节省网络资源。
                                    ICMP协议

网际控制消息协议ICMP是一个网络层的协议,它提供了错误报告和其它回送给源点的关于 IP 数据包处理情况的消息。ICMP通常为IP层或者更高层协议使用,一些ICMP报文把差错报文返回给用户进程。ICMP报文通常被封装在IP数据包内传输。RFC 792 中有关于ICMP的详细说明。
ICMP包含几种不同的消息,其中ping程序借助于echo request消息,主机可通过它来测试网络的可达性,ICMP Echo Reply 消息表示该节点是可达的。ICMP还定义了源抑制(source quench)报文。当路由器的缓冲区满后,送入的报文被丢弃,此时路由器向发送报文的主机发送源抑制报文,要求降低发送速率。
1.5  IP地址介绍
                                       二进制与十进制的转化


我们用的最多而且最熟悉的记数系统就是十进制计数系统了。十进制计数系统是基于10的冥级数:101,102 等。二进制计数系统是基于2的冥级数:21,
22等。
二进制中用0和1表示。如第一张图,有8位二进制,从左到右每个1表示的数字为28-1=128,27-1=64,26-1=32,25-1=16,24-1=8,23-1=4,22-1=2,21-1=1,然后每位相加就得到了255。如果二进制的某位为0,则此位对应的十进制为0。

每个IP地址是一个写成4个8位字节的32比特值。这就意味着存在4个组,每个组包括8个二进制位。如上图。

前面我们已经了解了TCP/IP协议的网络层的相关协议,并且已经在OSI参考模型中了解到每一个协议栈的网络层都有网络层地址,TCP/IP协议也不例外。
IP地址是进行复杂的子网规划的基础。
我们前面已经学习到,数据链路层有物理地址-----MAC地址,也知道,MAC地址是全球唯一的。当有数据发送时,源网络设备查询对端设备的MAC地址,然后将数据发送过去。然而,MAC地址通常存在于一个平面地址空间,没有清晰的地址层次,只适合于本网段主机的通信,另外,MAC地址固化在硬件中,灵活性较差。对于不同网络之间的互连通信,我们通常使用基于软件实现的网络层地址----IP地址来通信,提供更大的灵活性。
在我们学习IP地址前,假定您已经掌握了二进制、十进制、十六进制的相关知识。
IP地址,又称逻辑地址,和MAC地址一样,IP地址也是独一无二的。每一台网络设备用IP地址来唯一的标识。IP地址由32个二进制位组成,这些二进制数字被分为四个八位数组(octets),又称为四个字节。IP地址可以这样表示:
点分十进制形式:10.110.192.111
二进制形式:00001010.01101110.10000000.01101111
十六进制形式:0a.7e.80.7f
通常我们把IP地址表示为点分十进制形式,很少表示成十六进制形式。
由于IP地址有32个二进制位,理论上可以有232个IP地址可以使用,也就是43亿个IP地址。在互联网络上,如果每一台三层网络设备,例如路由器,为了彼此通信,储存每一个节点的IP地址,可以想象路由器会有多么大的路由表,这对路由器来说是不可能的。为了减少路由器的路由表数目,更加有效的进行路由,清晰的区分各个网段,决定对IP地址采用结构化的分层方案。
IP地址的结构化分层方案将IP地址分为网络部分和主机部分,区分网络部分和主机部分需要借助地址掩码(Mask)。网络部分位于IP地址掩码前面的连续二进制“1”位,主机部分是后面连续二进制“0”位。
IP地址的分层方案类似于我们常用的电话号码。电话号码也是全球唯一的。例如对于电话号码010-82882484,前面的字段010代表北京的区号,后面的字段82882484代表北京地区的一部电话。IP地址也是一样,前面的网络部分代表一个网段,后面的主机部分代表这个网段的一台设备。
IP地址采用分层设计,这样,每一台第三层网络设备就不必储存每一台主机的IP地址,而是储存每一个网段的网络地址(网络地址代表了该网段内的所有主机),大大减少了路由表条目,增加了路由的灵活性。
                                             IP地址的分类

IP地址的网络部分称为网络地址,网络地址用于唯一地标识一个网段,或者若干网段的聚合,同一网段中的网络设备有同样的网络地址。IP地址的主机部分称为主机地址,主机地址用于唯一的标识同一网段内的网络设备。例如,前面所述的A类IP地址:10.110.192.111,网络部分地址为10,主机部分地址为110.192.111。
那么如何区分IP地址的网络地址和主机地址呢?最初互联网络设计者根据网络规模大小规定了地址类,把IP地址分为A、B、C、D、E五类。
A类IP地址的网络地址为第一个八位数组(octet),第一个字节以“0”开始。因此,A类网络地址的有效位数为8-1=7位,A类地址的第一个字节为1~126之间(127留作它用)。例如10.1.1.1、126.2.4.78等为A类地址。A类地址的主机地址位数为后面的三个字节24位。A类地址的范围为1.0.0.0~126.255.255.255,每一个A类网络共有224个A类IP地址。
B类IP地址的网络地址为前两个八位数组(octet),第一个字节以“10”开始。因此,B类网络地址的有效位数为16-2=14位,B类地址的第一个字节为128~191之间。例如128.1.1.1、168.2.4.78等为B类地址。B类地址的主机地址位数为后面的二个字节16位。B类地址的范围为128.0.0.0~ 191.255.255.255,每一个B类网络共有216个B类IP地址。
C类IP地址的网络地址为前三个八位数组(octet),第一个字节以“110”开始。因此,C类网络地址的有效位数为24-3=21位,C类地址的第一个字节为192~223之间。例如192.1.1.1、220.2.4.78等为C类地址。C类地址的主机地址部分为后面的一个字节8位。C类地址的范围为192.0.0.0~ 223.255.255.255,每一个C类网络共有28=256个C类IP地址。
D类地址第一个8位数组以“1110”开头,因此,D类地址的第一个字节为224~239。D类地址通常作为组播地址。关于组播地址,在HCSE交换课程会有讨论。
E类地址第一个字节为240~255之间,保留用于科学研究。
我们经常用到的是A、B、C三类地址。IP地址由国际网络信息中心组织(International Network Information Center,InterNIC)根据公司大小进行分配。过去通常把A类地址保留给政府机构,B类地址分配给中等规模的公司,C类地址分配给小单位。然而,随着互联网络飞速发展,再加上IP地址的浪费,IP地址已经非常紧张。
现在进行IP地址规划时,我们通常在公司内部网络使用私有IP地址。私有IP地址是由InterNIC预留的由各个企业内部网自由支配的IP地址。使用私有IP地址不能直接访问Internet。原因很简单,私有IP地址不能在公网上使用,公网上没有针对私有地址的路由,会产生地址冲突问题。当访问Internet时,需要利用网络地址转换(NAT,Network Address Translation)技术,把私有IP地址转换为Internet可识别的公有IP地址。InterNIC预留了以下网段作为私有IP地址:A类地址10.0.0.0~10.255.255.255; B类地址172.16.0.0~ 172.31.255.255; C类地址192.168.0.0~192.168.255.255等。使用私有IP地址,不仅减少了企业用于购买公有IP地址的投资,而且节省了IP地址资源。但是这并不能完全解决IP地址短缺问题,目前已经正式提出了IPv6协议。IPv6地址有128个二进制位,共约2128个IP地址,完全可以解决IP地址紧张问题。
                                          特殊的IP地址

IP地址用于唯一的标识一台网络设备,但并不是每一个IP地址都是可用的,一些特殊的IP地址被用于各种各样的用途,不能用于标识网络设备。
对于主机部分全为“0”的IP地址,称为网络地址,网络地址用来标识一个网段。例如,A类地址1.0.0.0,私有地址10.0.0.0, 192.168.1.0等。
对于主机部分全为“1”的IP地址,称为网段广播地址,广播地址用于标识一个网络的所有主机。例如,10.255.255.255 , 192.168.1.255等,路由器可以在10.0.0.0或者192.168.1.0等网段转发广播包。广播地址用于向本网段的所有节点发送数据包。
对于网络部分为127的IP地址,例如127.0.0.1往往用于环路测试目的。
全“0”的IP地址0.0.0.0代表所有的主机,华为Quidway系列路由器用0.0.0.0地址指定默认路由。
全“1”的IP地址255.255.255.255,也是广播地址,但255.255.255.255代表所有主机,用于向网络的所有节点发送数据包。这样的广播不能被路由器转发。
如上所述,每一个网段会有一些IP地址不能用作主机IP地址。下面让我们来计算一下可用的IP地址。例如B类网段172.16.0.0, 有16个主机位,因此有216个IP地址,去掉一个网络地址172.16.0.0,一个广播地址172.16.255.255不能用作标识主机,那么共有216-2个可用地址。C类网段192.168.1.0,有8个主机位,共有28=256个IP地址,去掉一个网络地址192.168.1.0,一个广播地址192.168.1.255,共有254个可用主机地址。现在,我们可以这样计算每一个网段可用主机地址:假定这个网段的主机部分位数为n,那么可用的主机地址个数为2n-2个。



第2章  路由协议基础
2.1  什么是路由

路由器提供了将异构网互联的机制,实现将一个数据包从一个网络发送到另一个网络。路由就是指导IP 数据包发送的路径信息。
在互连网中进行路由选择要使用路由器,路由器只是根据所收到的数据报头的目的地址选择一个合适的路径(通过某一个网络),将数据包传送到下一个路由器,路径上最后的路由器负责将数据包送交目的主机。数据包在网络上的传输就好像是体育运动中的接力赛一样,每一个路由器只负责自己本站数据包通过最优的路径转发,通过多个路由器一站一站的接力将数据包通过最优最佳路径转发到目的地,当然有时候由于实施一些路由策略数据包通过的路径并不一定是最佳路由。
根据路由的目的地不同,可以划分为:
        子网路由:目的地为子网
        主机路由:目的地为主机
另外,根据目的地与该路由器是否直接相连,又可分为:
        直接路由:目的地所在网络与路由器直接相连
间接路由:目的地所在网络与路由器不是直接相连
2.2  通过路由表进行选路

路由器转发数据包的关键是路由表。每个路由器中都保存着一张路由表,表中每条路由项都指明数据包到某子网或某主机应通过路由器的哪个物理端口发送,然后就可到达该路径的下一个路由器,或者不再经过别的路由器而传送到直接相连的网络中的目的主机。
路由表中包含了下列关键项:
        目的地址(Destination):用来标识IP包的目的地址或目的网络。
        网络掩码(Mask):与目的地址一起来标识目的主机或路由器所在的网段的地址。将目的地址和网络掩码“逻辑与”后可得到目的主机或路由器所在网段的地址。例如:目的地址为8.0.0.0,掩码为255.0.0.0的主机或路由器所在网段的地址为8.0.0.0。掩码由若干个连续“1”构成,既可以用点分十进制表示,也可以用掩码中连续“1”的个数来表示。
        输出接口(Interface):说明IP包将从该路由器哪个接口转发。
        下一跳IP地址(Nexthop):说明IP包所经由的下一个路由器的接口地址。
2.3  路由表中路由的来源

在路由表中有一个Protocol字段:指明了路由的来源,即路由是如何生成的。路由的来源主要有3 种:
        链路层协议发现的路由(Direct)
开销小,配置简单,无需人工维护,只能发现本接口所属网段拓扑的路由。
        手工配置的静态路由(Static)   
静态路由是一种特殊的路由,它由管理员手工配置而成。通过静态路由的配置可建立一个互通的网络,但这种配置问题在于:当一个网络故障发生后,静态路由不会自动修正,必须有管理员的介入。静态路由无开销,配置简单,适合简单拓扑结构的网络。
        动态路由协议发现的路由(RIP、OSPF     ……)  
当网络拓扑结构十分复杂时,手工配置静态路由工作量大而且容易出现错误,这时就可用动态路由协议,让其自动发现和修改路由,无需人工维护,但动态路由协议开销大,配置复杂。
2.4  路由优先级

到相同的目的地,不同的路由协议(包括静态路由)可能会发现不同的路由,但并非这些路由都是最优的。事实上,在某一时刻,到某一目的地的当前路由仅能由唯一的路由协议来决定。这样,各路由协议(包括静态路由)都被赋予了一个优先级,这样,当存在多个路由信息源时,具有较高优先级(数值越小表明优先级越高)的路由协议发现的路由将成为最优路由,并被加入路由表中。
不同厂家的路由器对于各种路由协议优先级的规定各不相同。华为 Quidway 路由器的缺省优先级如下表所示。其中:0表示直接连接的路由,255 表示任何来自不可信源端的路由。
路由协议或路由种类        相应路由的优先级
DIRECT        0
OSPF        10
STATIC        60
RIP        100
IBGP        130
OSPF ASE        150
EBGP        170
UNKNOWN        255
除了直接路由(DIRECT)外,各动态路由协议的优先级都可根据用户需求,手工进行配置。另外,每条静态路由的优先级都可以不相同。

2.5  路由的花费

路由的花费(metric)标识出了到达这条路由所指的目的地址的代价,通常路由的花费值会受到线路延迟、带宽、线路占有率、线路可信度、跳数、最大传输单元等因素的影响,不同的动态路由协议会选择其中的一种或几种因素来计算花费值(如RIP用跳数来计算花费值)。该花费值只在同一种路由协议内有比较意义,不同的路由协议之间的路由花费值没有可比性,也不存在换算关系。静态路由的花费值为0。
2.6  静态路由配置

在组网结构比较简单的网络中,只需配置静态路由就可以使路由器正常工作,仔细设置和使用静态路由可以改进网络的性能,并可为重要的应用保证带宽。
还有一种静态路由类型为称为接口静态路由,它用于表示那些直接连接到路由器接口上的目的网络。接口静态路由优先级是0,这意味着它是直接连接网络的路由。
静态路由还有如下的属性:
        可达路由:正常的路由都属于这种情况,即IP报文按照目的地标示的路由被送往下一跳,这是静态路由的一般用法。
        目的地不可达的路由:当到某一目的地的静态路由具有“reject”属性时,任何去往该目的地的IP报文都将被丢弃,并且通过ICMP 消息通知源主机目的地不可达。
        目的地为黑洞的路由:当到某一目的地的静态路由具有“blackhole”属性时,任何去往该目的地的IP报文都将被丢弃。同“reject”的区别是不向源主机发送任何消息。
其中各参数的解释如下:
(1)<ip_address>[<mask>|<masklen>]:目的IP地址和掩码
IP地址为点分十进制格式,掩码可以用点分十进制表示,也可用掩码长度(即掩码中‘1’的位数)表示。
(2)<interface_name>|<gateway_address>:发送接口或下一跳地址
在配置静态路由时,可指定发送接口interface-name,也可指定下一跳地址gateway-address,是指定发送接口还是指定下一跳地址要视具体情况而定。
实际上,所有的路由项都必需明确下一跳地址。IP在发送报文时,首先根据报文的目的地址寻找路由表中与之匹配的路由。只有路由指定了下一跳地址,链路层才能通过下一跳IP地址找到对应的链路层地址,然后按照该地址将报文转发。
在以下几种情况下可以指定发送接口:
        对于支持网络地址到链路层地址解析的接口(如以太网口支持ARP),当ip-address和mask(或mask-length)指定了一个主机地址,而且该目的地址就在该接口的直接连接网络中,这时可以指定发送接口。
        对于点到点接口,指定发送接口即隐含指定了下一跳地址,这时认为与该接口相连的对端接口地址就是路由的下一跳地址。如串口封装PPP协议,通过PPP协商获取对端的IP地址,这时可以不用指定下一跳地址,只需指定发送接口即可。
        对于NBMA接口(如封装X.25或帧中继的接口、拨号口等),支持点到多点,这时除了配置IP路由外,还需在链路层建立二次路由,即IP地址到链路层地址的映射(如dialer map ip、x.25 map ip或frame-relay map ip等)。这种情况下配置静态路由就不能指定发送接口,而应配置下一跳IP地址。
(3)<preference_value>:优先级
对优先级preference的不同配置,可以灵活应用路由管理策略。如在配置到达网络目的地的多条路由时,若指定相同优先级,可实现负载分担;若指定不同优先级,则可实现路由备份。在同一命令中优先级可以多次输入,但只有最后一个有效。
(4)其它参数
属性reject 和 blackhole 分别指明不可达路由和黑洞路由。
2.7  静态路由配置示例

在路由器QuidwayA上配置一条到目的网段129.1.0.0/16的静态路由,下一跳地址为路由器QuidwayB的S0接口的IP地址10.0.0.2。如果链路的封装是PPP或HDLC,也可以指定本路由器的转发接口。
静态路由配置命令:
[QuidwayA]ip route 129.1.0.0 16 s 0         或
[QuidwayA]ip route 129.1.0.0 16 10.0.0.2         或
[QuidwayA]ip route 129.1.0.0 255.255.0.0 10.0.0.2 。
2.8  缺省路由的配置

缺省路由也是一种静态路由。简单地说,缺省路由就是在没有找到匹配的路由表入口项时才使用的路由。即只有当没有合适的路由时,缺省路由才被使用。在路由表中,缺省路由以到网络0.0.0.0(掩码为0.0.0.0)的路由形式出现。可通过命令display ip route 的输出看它是否被设置。如果报文的目的地址不能与路由表的任何入口项相匹配,那么该报文将选取缺省路由。如果没有缺省路由且报文的目的地址不在路由表中,那么该报文被丢弃的同时,将返回源端一个ICMP报文指出该目的地址或网络不可达。
缺省路由在网络中是非常有用的。在一个包含上百个路由器的典型网络中,选择动态路由协议可能耗费较大量的带宽资源,使用缺省路由意味着采用适当带宽的链路来替代高带宽的链路以满足大量用户通信的需求。
Internet上大约99.99%的路由器上都存在一条缺省路由!
缺省路由并不一定都是手工配置的静态路由,有时也可以由动态路由协议产生。比如OSPF路由协议配置了Stub区域的路由器会动态产生一条缺省路由。
2.9  路由自环

“路由自环”是指某个报文从一台路由器发出,经过几次转发之后又回到初始的路由器。原因是其中部分路由器的路由表出现错误。产生的原因可能是配置静态路由有误,或者是动态路由协议错误地计算路由(虽然这种情况发生的几率很小)。当产生路由自环时,报文会在几个路由器之间循环转发,直至TTL=0 时才被丢弃,极大地浪费了网络资源,因此应该尽量避免“路由自环”的产生。



第3章  动态路由协议概述
3.1  动态路由协议在协议栈中的位置

所有的动态路由协议在TCP/IP协议栈中都属于应用层的协议。但是不同的路由协议使用的底层协议不同。
OSPF将协议报文直接封装在IP 报文中,协议号89,由于IP协议本身是不可靠传输协议,所以OSPF传输的可靠性需要协议本身来保证。
BGP使用TCP作为传输协议,提高了协议的可靠性,TCP的端口号是179。
RIP使用UDP作为传输协议,端口号520。

3.2  自治系统(AS)

一个AS是一组共享相似的路由策略并在单一管理域中运行的路由器的集合。一个AS可以是一些运行单个IGP(内部网关协议)协议的路由器集合,也可以是一些运行不同路由选择协议但都属于同一个组织机构的路由器集合。不管是哪种情况,外部世界都将整个AS看作是一个实体。
每个自治系统都有一个唯一的自治系统编号,这个编号是由因特网授权的管理机构IANA分配的。它的基本思想就是希望通过不同的编号来区分不同的自治系统。这样,当网络管理员不希望自己的通信数据通过某个自治系统时,这种编号方式就十分有用了。例如,该网络管理员的网络完全可以访问某个自治系统,但由于它可能是由竞争对手在管理,或是缺乏足够的安全机制,因此,可能要回避它。通过采用路由协议和自治系统编号,路由器就可以确定彼此间的路径和路由信息的交换方法。
自治系统的编号范围是1到65535,其中1到65411是注册的因特网编号,65412到65535是专用网络编号。

3.3  路由协议的分类

按照工作区域,路由协议可以分为IGP 和EGP:
        IGP(Interior gateway protocols)内部网关协议
在同一个自治系统内交换路由信息,RIP 和IS-IS  都属于IGP。IGP的主要目的是发现和计算自治域内的路由信息。
        EGP(Exterior gateway protocols)外部网关协议
用于连接不同的自治系统,在不同的自治系统之间交换路由信息,主要使用路由策略和路由过滤等控制路由信息在自治域间的传播,应用的一个实例是BGP。

按照路由的寻径算法和交换路由信息的方式,路由协议可以分为 距离矢量协议(Distant-Vector)和链路状态协议。距离矢量协议包括 RIP 和 BGP,链路状态协议包括 OSPF、IS-IS。
距离矢量路由协议基于贝尔曼-福特算法,使用D-V算法的路由器通常以一定的时间间隔向相邻的路由器发送他们完整的路由表。接收到路由表的邻居路由器将收到的路由表和自己的路由表进行比较,新的路由或到已知网络但开销(Metric)更小的路由都被加入到路由表中。相邻路由器然后再继续向外广播它自己的路由表(包括更新后的路由)。距离矢量路由器关心的是到目的网段的距离(Metric)和矢量(方向,从哪个接口转发数据)。在发送数据前,路由协议计算到目的网段的Metric;在收到邻居路由器通告的路由时,将学到的网段信息和收到此网段信息的接口关联起来,以后有数据要转发到这个网段就使用这个关联的接口。
距离矢量路由协议的优点:配置简单,占用较少的内存和CPU处理时间。缺点:扩展性较差,比如RIP最大跳数不能超过16 跳。
链路状态路由协议基于Dijkstra算法,有时被称为最短路径优先算法。L-S算法提供比RIP等D-V算法更大的扩展性和快速收敛性,但是它的算法耗费更多的路由器内存和处理能力。D-V算法关心网络中链路或接口的状态(up或down、IP地址、掩码),每个路由器将自己已知的链路状态向该区域的其他路由器通告,这些通告称为链路状态通告(LSA:Link State Advitisement)。通过这种方式区域内的每台路由器都建立了一个本区域的完整的链路状态数据库。然后路由器根据收集到的链路状态信息来创建它自己的网络拓朴图,形成一个到各个目的网段的带权有向图。
链路状态算法使用增量更新的机制,只有当链路的状态发生了变化时才发送路由更新信息,这种方式节省了相邻路由器之间的链路带宽。部分更新只包含改变了的链路状态信息,而不是整个的路由表。
3.4  路由协议之间的互操作

为了在同一个互联网中支持多种路由协议,必须在这些不同的路由协议之间共享路由信息。例如从RIP学到的路由信息可能需要引入到OSPF协议中去。这种在不同路由协议中间交换路由信息的过程被称为路由引入。路由引入可以是单向的(例如将RIP引入OSPF),也可以是双向的(RIP和OSPF互相引入)。执行路由引入的路由器一般位于不同自治系统或者不同路由域的边界。
由于各路由协议的算法不同,不同的协议可能会发现不同的路由,因此各路由协议之间存在如何共享各自发现结果的问题。前面我们讲过,不同路由协议之间的花销不存在可比性,也不存在换算关系,所以在引入路由时必须重新设置引入路由的Metric值,或者使用系统默认的数值。VRP支持将一种路由协议发现的路由引入(import-route)到另一种路由协议中,每种协议都有相应的路由引入机制。
路由协议的相互引入实现了不同路由信息的共享,但同时也带来了一些问题。使用多种路由协议通常会导致网络管理复杂和额外开销增大。当路由器将从一个自治系统学到的路由信息再发送回同一自治系统,就有可能会产生路由环路。另外,由于各路由协议使用不同的度量值来决定最佳路由,所以利用引入的路由信息进行路径选择有可能会导致次最佳路由。一般情况下,应尽量避免重叠使用路由协议(同一个区域内既使用RIP,又使用OSPF),使用不同路由协议的网络之间要有明确的边界;如果有一台以上的路由器担任路由引入点,应只在一个方向上进行路由引入,以避免路由环路和因收敛时间不一致导致的问题。如果在一个路由域中只有一台边界路由器,可以使用双向引入。
3.5  衡量路由协议的一些性能指标



第4章  距离矢量路由协议概述
4.1  距离矢量算法基本原理

距离矢量(DISTANCE-VECTOR,简称D-V)算法(也称BELLMAN-FORD 算法)周期性地将路由表信息的拷贝在路由器之间传送。当网络拓扑变化时,也会将更新信息及时传送给路由器。每一个路由器只能接收到网络中相邻路由器的路由表,就如图所示,路由器B接收到相邻路由器A的信息,通过增加一个距离矢量数(例如一个跳数)来增大距离矢量,然后将更新的路由表信息传送给相邻路由器C。这种逐步过程发生在相邻路由器之间。
距离矢量算法的数学模型如下:
我们用D(i,j)来表示从实体i到j的最佳路由的Metric,i、j可以是系统中的任意一对实体,用d(i,j)来表示单个跳数的花费,也就是从i直接到j的花费,如果i与j不是直接相邻的,则d(i,j)为无穷大。这样任意两个实体间的最佳Metric可以表示如下:
D(i,j)=0                                                     对所有的i
D(i,j)=min [ D(i,j)+d(i,k)]          i不等于k时
由于我们把非相邻两实体间的d(i,j)定义为无穷大,当表达式中k不是i的相邻主机或路由器时,D(i,j)永远不可能为最小,故我们也可以把k限定为与i相邻。由此我们可以得出一个基于这个数学模型的计算Metric的简单算法:实体i接收它的邻居们k发送给它的到目标主机j的距离评价,并加上d(i,j),在这里是通过i,k之间网络所需的cost 值,接下来i比较来自所需邻居的信息,并选择其中最小的。可以证明,在拓扑结构不变的情况下该算法在有限时间内收敛于正确的D(i,j)。
距离矢量算法通过上述方法累加网络距离,并维护网络拓扑信息数据库。使用这种算法,路由器并不能知道整个网络的确切拓扑结构。
某种程度上,距离矢量信息类似十字路口上指向目的地的路标,沿着路标的指向前进,在下一个十字路口,会再看到一个路标,但在这个路标处,距离目的地就近了一些。只要路径中每下一个路标都能表示到目的地距离的缩短,则这个路径为最优的。

4.2  距离矢量协议路由发现

距离矢量协议直接传送各自的路由表信息。网络中的路由器从自己的邻居路由器得到路由信息,并将这些路由信息连同自己的本地路由信息发送给其他邻居,这样一级级的传递下去以达到全网同步。每个路由器都不了解整个网络拓扑,它们只知道与自己直接相连的网络情况,并根据从邻居得到的路由信息更新自己的路由表。
距离矢量协议无论是实现还是管理都比较简单,但是它的收敛速度慢,报文量大,占用较多网络开销,并且为避免路由环路需要做各种特殊处理。

4.3  距离矢量协议拓扑变化

距离矢量算法要求每个路由器将自己的路由表传送给相邻的路由器。当路由器接收到更新的路由信息时,首先将更新的信息与原有的路由表中的信息相比较,遇到下述情况之一时,须修改本地路由表(假设RouterA收到RouterB的D-V报文)以反映最新的网络变化:
⑴ RouterB的路由表中列出的某表项RouterA的路由表中没有,则RouterA的路由表中须增加相应表项,其目标网络为RouterB路由表中的目标网络,其路径开销为RouterB表项中的路径开销加1(假设以跳数计算路径开销),其下一跳为RouterB;
⑵ RouterB的路由表中去往某目标网络的路径开销比RouterA的路由表中去往该目标网络的路径开销减1还小,这说明去往该目标网络若经过RouterB路径开销会更小,则RouterA修改本表项,将下一跳改为RouterB,路径开销为RouterB中的路径开销加1;
⑶ RouterA的路由表中去往某目标网络的下一跳为RouterB,而RouterB的路由表中去往该目标网络的路径开销发生了变化,则RouterA中相应表项的路径开销须修改,以RouterB的更新后的路径开销加1取代原来的路径开销;
⑷ RouterA的路由表中去往某目标网络的下一跳为RouterB,而RouterB的路由表中不再包含去往该目标网络的路径,则RouterA的路由表中相应路径应删除。
4.4  路由环路问题
4.4.1  路由环路产生

由于网络故障可能会引起路径与实际网络拓扑结构不一致而导致网络不能快速收敛,这时,可能会发生路由环路现象。图中用一个简单的网络结构来说明路由环路的产生。
如上图所示,如果网络11.4.0.0 故障,就可能会在路由器之间产生路由环路,下面是产生路由环路的步骤:
        在网络11.4.0.0发生故障之前,所有的路由器都具有正确一致的路由表,网络是收敛的。在本例中,路径开销用跳数来计算,所以,每条链路的开销是1。路由器C与网络11.4.0.0直连,跳数为0。路由器B经过路由器C 到达网络11.4.0.0,跳数为1。路由器A 经过路由器B到达网络11.4.0.0,跳数为2。
        当网络11.4.0.0 发生故障,路由器C 最先收到故障信息,路由器C 把网络11.4.0.0 设为不可达,并等待更新周期到来通告这一路由变化给相邻路由器。如果,路由器B的路由更新周期在路由器C之前到来,那么路由器C就会从路由器B那里学习到去往11.4.0.0 的新路由(实际上,这一路由已经是错误路由了)。这样路由器C的路由表中就记录了一条错误路由(经过路由器B,可去往网络11.4.0.0,跳数增加到2 )。
        路由器C 学习了一条错误信息后,它会把这样的路由信息再次通告给路由器B,根据通告原则,路由器B也会更新这样一条错误路由信息,认为可以通过路由器A 去往网络11.4.0.0,跳数增加到3 。
        这样,路由器 B 认为 可以通过路由器C 去往网络11.4.0.0,路由器C 认为 可以通过路由器B 去往网络11.4.0.0,就形成了环路。
4.4.2  环路补救方案-定义一个最大值

如上所述,发生路由环路时,路由器去往网络11.4.0.0 的跳数会不断的增大,网络无法收敛。为解决这个问题,我们给跳数定义一个最大值,在RIP 路由协议中,允许跳数最大值为16。在图中,当跳数到达最大值时,网络11.4.0.0 被认为是不可达的。路由器会在路由表中显示网络不可达信息,并不再更新到达网络11.4.0.0 的路由。
通过定义最大值,距离矢量路由协议可以解决发生环路时路由权值无限增大的问题,同时也校正了错误的路由信息。但是,在最大权值到达之前,路由环路还是会存在。也就是说,以上解决方案只是补救措施,不能避免环路产生,只能减轻路由环路产生的危害。路由协议的设计者们又提供了诸如水平分割、触发更新等多种避免环路产生几率的方案。
4.4.3  环路避免方案
水平分割

水平分割是在距离矢量路由协议中最常用的避免环路发生的解决方案之一。分析产生路由环路的原因,其中一条就是因为路由器将从某个邻居学到的路由信息又告诉了这个邻居。水平分割的思想就是在路由信息传送过程中,不再把路由信息发送给接收此路由信息的接口上。如上图所示:
        路由器C 告诉路由器B 去往网络11.4.0.0的路由,路由器B会把此路由信息传递给路由器A。同时,也会再传回给路由器C。网络11.4.0.0没有崩溃时,路由器C不会接受路由器B传递来的去往网络11.4.0.0的路由信息。因为,路由器C有花费更小的路由。
        如果路由器C到达网络11.4.0.0的路由崩溃了,路由器C就会接受路由器B传递来的去往网络11.4.0.0 的路由信息,尽管这条路由信息已经是错误路由了(因为随着路由器C去往网络11.4.0.0的路由崩溃,路由器B从路由器C学到的去往网络11.4.0.0 路由也就错误了)。但是路由器C 并不知道这一点。
这样,路由器B 认为 可以通过路由器C 去往网络11.4.0.0 ,路由器C 认为 可以通过路由器B 去往网络11.4.0.0  ,就形成了环路。
        水平分割方法就是解决这样问题的,水平分割不允许路由器将路由更新信息再次传回到传出该路由信息的端口。上图中,路由器B从路由器C那里学习到了去往网络11.4.0.0 的路由。水平分割规定:路由器B不再把去往网络11.4.0.0 的路由信息传回给路由器C,从而在一定程度上避免了环路的产生。

                            路由中毒和抑制时间

路由中毒和抑制时间结合起来,也可以在一定程度上避免路由环路产生,同时也可以抑制因复位接口等原因,引起的网络动荡。这种方法在网络故障或接口复位时,使相应路由中毒,同时启动抑制时间,控制 路由器在抑制时间内不要轻易更新自己的路由表。从而,避免环路产生、抑制网络动荡。
如上图所示:
        当网络11.4.0.0发生故障时,路由器C 使自己路由表中的此路由项中毒,也就是在路由表中使到达网络11.4.0.0的路径开销是无穷大(也就是不可达),同时启动抑制时间,在抑制时间结束之前的任何时刻,如果从同一相邻路由器(或同一方向)又接收到此路由可达的更新信息时,路由器就将网络标识为可达,并删除抑制时间。
        如果接收到其他的相邻路由器的更新信息,且新的权值比以前的权值好,则路由器就将更新路由表,接受这一更优的路由,并删除抑制时间。
        在抑制时间结束之前的任何时刻,如果从其他的相邻路由器接收到路径可用的更新信息时,但新的权值没有以前的权值好,则不接收此更新路由。如果在抑制时间过后,路由器仍能收到该更新路由信息,则路由器将更新路由表。                            
                             触发更新

如图,网络11.4.0.0 不可达了,路由器C最先得到这一信息。通常,更新路由信息会定时发送给相邻路由器。例如,RIP 协议每隔30秒发送一次。但如果在路由器C 等待更新周期到来的时候,路由器B的更新报文传到了路由器C,路由器C 就会学到路由器B的去往网络11.4.0.0的错误路由。这样就会形成路由环路。如果路由器C 发现网络故障之后,不再等待更新周期到来,就立即发送路由更新信息,则可以避免产生上述问题。这就是触发更新机制。
触发更新机制是在路由信息产生某些改变时,立即发送给相邻路由器一种称为触发更新的信息。路由器检测到网络拓扑变化,立即依次发送触发更新信息给相邻路由器,如果每个路由器都这样做,这个更新会很快传播到整个网络。
在图中,路由器C立即通告网络11.4.0.0不可达信息,路由器B接收到这个信息,就从S0口发出网络11.4.0.0不可达信息,依次路由器A从E0口通告此信息。
从上述叙述可以看出,使用触发更新方法能够在一定程度上避免路由环路发生。但是,仍然存在两个问题:
        包含有更新信息的数据包可能会被丢掉或损坏。
        如果触发更新信息还没有来得急发送,路由器就接收到相邻路由器的周期性路由更新信息,使路由器更新了错误的路由信息。
为解决以上的问题,我们将抑制时间和触发更新相结合,就可以解决上述问题。抑制时间方法有一个规则就是,当到某一目的网络的路径出现故障,在一定时间内,路由器不轻易接收到这一目的网络的路径信息。因此,将抑制时间和触发更新相结合就可以确保了触发信息有足够的时间在网络中传播。
4.4.4  在多路径情况下的解决方案

在下面的例子中,路由器之间有多条路径到达对方,图中,路由器A,D,E都有两条路径到达网络11.4.0.0 。
当网络11.4.0.0 发生故障时,会有下面的情形发生;
⑴ 路由中毒——当路由器B检测到网络11.4.0.0 故障时,路由器B使所有连接该网络的路径中毒,使到此网络的跳数为最大数值。
⑵ 设定抑制时间——旦路由器B使连接网络11.4.0.0 的路径中毒,则它会设定一个抑制时间。
⑶ 发送触发更新信息——路由器B向路由器A、D发送触发更新信息,指出网络11.4.0.0 故障。新的路由信息在其它网络间传输,使得其余路由器再重复步骤2、3。路由器A、D接收到触发更新信息以后,在抑制时间内禁止更新的路径信息。接下来,路由器A和D再向路由器E发送网络11.4.0.0 故障的触发更新信息。
路由器E接收到触发更新信息后,设定自己的抑制时间,一直处于等待状态,直到出现下面的情形:
        抑制时间结束。出现这种情况,路由器E确定网络11.4.0.0不可达。
        接收到网络状态改变的信息。出现这种情况,路由器E更新路由表。
        接收到具有更好权值的路径更新信息。出现这种情况,路由器E更新路由表。


第5章  RIP路由协议
5.1  RIP协议概述

RIP是Routing Information Protocol (路由信息协议)的简称。它是一种相对简单的动态路由协议,但在实际使用中有着广泛的应用。RIP是一种基于D-V算法的路由协议,它通过UDP交换路由信息,每隔30秒向外发送一次更新报文。如果路由器经过180秒没有收到来自对端的路由更新报文,则将所有来自此路由器的路由信息标志为不可达,若在其后120 秒内仍未收到更新报文,就将该条路由从路由表中删除。
RIP 使用跳数(Hop Count)来衡量到达目的网络的距离,称为路由权(Routing Metric)。在RIP中,路由器到与它直接相连网络的跳数为0,通过一个路由器可达的网络的跳数为1,其余依此类推。为限制收敛时间,RIP规定metric取值0~15之间的整数,大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。
为提高性能,防止产生路由环路,RIP支持水平分割(Split Horizon)与路由中毒(Poison Reverse),并在路由中毒时采用触发更新(Triggered Update)。另外,RIP协议还允许引入其它路由协议所得到的路由。
RIP包括RIP-1和RIP-2两个版本,RIP-1 不支持变长子网掩码(VLSM),RIP-2  支持变长子网掩码(VLSM),同时RIP-2支持明文认证和 MD5 密文认证。
RIP-1使用广播发送报文,RIP-2有两种传送方式:广播方式和组播方式,缺省将采用组播发送报文,RIP-2的组播地址为224.0.0.9。组播发送报文的好处是在同一网络中那些没有运行RIP的网段可以避免接收RIP的广播报文;另外,组播发送报文还可以使运行RIP-1的网段避免错误地接收和处理RIP-2中带有子网掩码的路由。

RIP协议是最早使用的IGP之一,RIP协议被设计用于使用同种技术的中小型网络,因此适应于大多数的校园网和使用速率变化不是很大的区域性网络。对于更复杂的环境,一般不使用RIP协议。
在实现时,RIP作为一个系统长驻进程存在于路由器中,它负责从网络中的其它路由器接收路由信息,从而对本地IP层路由表作动态的维护,保证IP层发送报文时选择正确的路由,同时广播本路由器的路由信息,通知相邻路由器作相应的修改。
RIP协议处于UDP协议的上层,RIP所接收的路由信息都封装在UDP的数据报中,RIP 在520号端口上接收来自远程路由器的路由修改信息,并对本地的路由表做相应的修改,同时通知其它路由器。通过这种方式,达到全局路由的同步。

5.2  RIP协议的实现
                      RIP路由表的初始化

        RIP 启动时的初始路由表仅包含本路由器的一些直连接口路由。
        RIP 协议启动后向各接口广播一个 Request 报 文。
        邻居路由器的 RIP 协议从某接口收到 Request 报文后,根据自己的路由表,形成 Response  报文向该接口对应的网络广播。
        RIP 接收邻居路由器回复的包含邻居路由器路由表的Response 报文,形成自己的路由表。
RIP根据D-V算法的特点,将协议的参加者分为主动机和被动机两种。主动机主动向外广播路由刷新报文,被动机被动地接收路由刷新报文。一般情况下,主机作为被动机,路由器则既是主动机又是被动机,即在向外广播路由刷新报文的同时,接收来自其它主动机的D-V报文,并进行路由刷新。
                           RIP路由表的更新

RIP 协议以 30 秒为周期用 Response 报文广播自己的路由表。
收到邻居发送而来的 Response 报文后,RIP 协议计算报文中的路由项的度量值,比较其与本地路由表路由项度量值的差别,更新自己的路由表。
报文中路由项度量值的计算: metric' = MIN(metric + cost, 16),metric 为报文中携带的度量值信息,cost 为接收报文的网络的度量值开销,缺省为 1(1 跳),16 代表不可达。
RIP 路由表的更新原则:
对本路由表中已有的路由项,当发送报文的网关相同时,不论度量值增大或是减少,都更新该路由项(度量值相同时只将其老化定时器清零);
对本路由表中已有的路由项,当发送报文的网关不同时,只在度量值减少时,更新该路由项;
对本路由表中不存在的路由项,在度量值小于不可达(16)时,在路由表中增加该路由项;
路由表中的每一路由项都对应一老化定时器,当路由项在 180 秒内没有任何更新时,定时器超时,该路由项的度量值变为不可达(16)。
某路由项的度量值变为不可达后,以该度量值在 Response 报文中发布四次(120 秒),之后从路由表中清除。

        可指定RIP在接口上的工作状态,如接口上是否运行RIP,即是否在接口发送和接收RIP刷新报文;还可单独指定接口是否发送或者接收更新报文。
在缺省情况下,一个接口既可接收RIP更新报文,也可发送RIP更新报文。
undo rip work 命令的功能与no network命令功能相近,但它们并不完全相同。相同点在于,使用任一命令的接口都不再收发RIP路由;区别在于: 在undo rip work情况下,其它接口对使用该命令的接口的路由仍然转发,而在undo network的情况下,其它接口对使用该命令的接口的路由不再转发,见到的效果就象少了一个接口。
另外, rip work 从功能上等价于rip input 与rip output 两个命令。
        路由聚合是指:同一自然网段内的不同子网的路由在向外(其它网段)发送时聚合成一条自然掩码的路由发送。路由聚合减少了路由表中的 路由信息量,也减少了路由交换的信息量。







第6章  IS-IS协议基本原理
6.1  IS-IS概览

IS-IS(Intermediate System-to-Intermediate System:中间系统到中间系统)是一种路由选择协议,是基于OSI域内(intradomain)的路由选择协议,Intermediate System是OSI中Router的叫法。IS-IS可以用作IGP(Interior Gateway Protocol:内部网关协议)以支持纯IP环境、纯OSI环境和多协议环境。IS-IS是一种链路状态协议,基于SPF算法,以寻找到目标的最佳路径,由于SPF算法本身的优势,IS-IS协议天生具有抵抗路由环路的能力。
6.2  链路状态协议简介

LSP:Link State PDU,含有链路状态信息的IS-IS报文。
链路状态协议都是基于近邻关系的,每个路由器公开其链路的开销和状态。所以区域里每个路由器知道区域内所有活动的链路,并知道有关这些活动链路所标识路由器发起的信息,然后把该状态信息传播到其他路由器。传播信息使所有路由器保持同一数据库。每个路由器用唯一的地址来标识,从而避免了循环。
在路由器接收到有关所有其它路由器及其链路的信息之后,每个单个的路由器运行SPF算法,该算法是基于Dijkstra算法,以计算到每个已知目标的最佳路径。(Dijkstra算法是个分布式算法,由每个路由器在处理完信息之后执行。)







SFP算法示例


运行SPF算法生成整个区域的拓扑结构,同一层次中的所有路由器有相同的LSDB,LSDB中储存着同一层次中所有路由器产生的LSP,LSP通过可靠泛洪机制,由产生它的路由器扩散到整个可达区域。
6.3  L1和L2的基本概念

如图,该路由系统分为两层,Level1和Level2,同一区域内的路由器交换信息的节点组成1层(L1),区域内的所有L1路由器知道整个区域的拓扑结构,负责区域内的数据交换。区域之间通过L2路由器相联接,各个区域的边缘路由器组成骨干网,是2层(L2),L2 负责区域间的数据交换对于一个要送往另一个区域的数据报,不管它的目的区域到底在哪。
L1 IS总是将数据报直接送往位于该区域内最近的L2 IS,该数据报再通过Lever2路由系统到达目的区域,然后再通过目的区域的L1 IS路由系统到达目标。
6.4  IS-IS的基本工作原理

L1路由器: 接收来自其他系统的报文,如果报文的目的地址在本区域内,就直接将报文转发到目的系统;如果报文的目的地址在本区域外,则将报文转交给离自己最近的一个L1L2路由器。
        仅拥有同一区域中的路由器。
        拥有自己区域中的信息。
        观察L1 LSP,寻找“最近”的L1L2路由器。
        安装一条通向“最近”L1L2路由器的缺省路径。
        L2路由器:接收来自L1路由器的报文,并按照目的地址将报文转交给其他区域的L2路由器。接收来自其他区域的L2路由器的报文,并按照目的地址将报文转发。
        可能拥有其他区域中的邻居。
        拥有关于L2拓扑的信息。
        拥有关于什么L1目标可以到达,以及如何通过L2拓扑到达它的信息。
        L2路由其通常也执行L1路由,因此通常称可以执行L1路由的L2路由器为L1L2路由器。
        骨干区L2必须是连续的。
L1/L2:完成它所在的区域和骨干之间的路由信息的交换,既承担L1的职责也承担L2的职责。
6.5  报文分类

1. 链路状态数据单元(Link State PDU)
用来在区域中传播链路状态记录。 分为两种:Level 1 Link State PDU和Level 2 Link State PDU,处在层次1的路由器产生L1 LSP,处于层次2的路由器产生L2 LSP,LSP只会泛洪到自己的所属层次。1层LSP中包含它都有什么邻居,它的接口都处在什么网段中等信息,只用于本地区域。 2层LSP中包含它都有什么邻居,通过它都能够到达什么网段等信息即包含IS-IS里所有可到达前缀的信息。链路状态报文,含有一个路由器的所有信息,包括邻接、所连接的IP前缀、OSI终端系统、区域地址等。
2. Hello报文(IIH PDU)
用于维护邻接。 问候包发送到组播MAC层地址,来确定其它系统是否在运行IS-IS。在IS-IS里有三种问候包:一种是点对点接口的、一种是对Level 1路由器的和一种是对Level 2路由器的。发送到Level 1路由器和Level 2路由器的问候给定了不同组播地址。所以,Level 1路由器连接到与Level 2路由器驻留的地方,但看不到Level 2的问候,反过来也是一样。 当链路初始化时或从近邻接收到问候包时,发送问候包,此时,初始化邻接。在从近邻接收到问候的基础上,路由器把问候包发送回近邻,表明路由器看到了问候。这时,就建立了双向联系。这就是邻接的在线状态(up state)。
3. 全时序协议数据单元(CSNP:Complete Sequence Numbers Protocol Data Unit)
CSNP分为两种:Level 1 CSNP和Level 2 CSNP。用于广播链路上的LSPDB同步。 DIS在广播接口上每10秒发送一次CSNP。CSNP包含了本地数据库里所有LSP的完整列表。正如前面所提到,CSNP用于数据库同步。在串行线路上,只在第一次邻接时发送CSNP。
4. 部分时序协议数据单元(PSNP:Partial sequence Number Protocol Data Unit)
PSNP分为两种:Level 1 PSNP和Level 2 PSNP。
用于非广播链路时,类似于p2p链路上的ACK,响应LSP报文。
在广播链路上,PSNP用于数据库同步。当路由器从近邻接收到CSNP时,注意到CSNP丢失了部分数据库,路由器发送PSNP请求新的LSP。
6.6  邻居建立及数据库同步

上图显示了两台路由器间如何通过发送协议报文建立邻居关系及邻居状态机的变化过程。
(1)         Router A的一个连接到广播类型网络的接口上运行了IS-IS,该接口使用组播地址发送协议Hello报文,此时Router A在该网络上未发现任何邻居,故Hello报文中的邻居字段为空。
(2)         Router B接收到Router A发送的Hello报文后,为Router A创建一个邻居的数据结构,并且将该邻居的状态设为Init.。Router B 发送一个Hello报文给Router A,并且在将Router A的MAC地址包含在报文的邻居字段中,表明Router B已经受到来自Router A的Hello 报文。
(3)         Router A接收到Router B发送的Hello报文后,同样为Router B创建一个邻居的数据结构,并且将该邻居的状态设为Init.。Router A 再发送一个Hello报文给Router B,并且在将Router B的MAC地址包含在报文的邻居字段中,表明Router A已经受到来自Router B的Hello 报文
(4)         当Router B再次接收到Router A发送的Hello报文后,检查到本地已经有Router A的邻居数据结构了,表明之前已经受到来自该邻居的Hello报文,同时检测到所接受到的邻居报文的邻居字段中有本地路由器的MAC地址,表明对端已经接受到本端的Hello报文,经过双方的检测后将邻居状态设为Up,下一步双方开始发送各自的链路状态数据库。
(5)         双方建立邻居关系后,DR也会同时选举出来(发送两个Hello报文后),双方开始向对段发送本端的链路状态报文(LSP)。为保证邻居链路状态数据库的同步性及减少网络报文流量,每个路由器并不与广播网上的每一台路由器同步数据库,而是采用DR同步数据库的方式,既每个路由器只与DR同步链路状态数据库,这样广播网上同步的次数将从N*N减少到(N-1)。
(6)         当DR选举出来并且邻居间经过一段时间的数据链路状态报文交换后,DR将发送CSNP报文,该报文只包括本地数据库中LSP的摘要信息(并不包含实际的LSP),每一条摘要信息用LSPID来唯一标识一条LSP。
(7)         当接收到CSNP报文后,将CSNP报文中的LSP与本地的数据库中的LSP进行比较,如果发现本地缺少相应的LSP,本地将发送PSNP报文用来请求该LSP,PSNP中包括所缺少的LSP摘要描述,如果发现本地有更多的LSP信息,则直接发送该LSP给DR。
(8)         当DR接收到PSNP后,发送该PSNP指定的LSP来同步链路状态数据库。
经过一定时间后,整个网络的链路状态数据库完全同步,则网络出于稳定状态,只定时发送Hello报文维系邻居关系,发送LSP维系数据库同步。
注意:
只有同一层次的相邻路由器才有可能成为邻居,而只有成为邻居,才交换IS-IS信息。
6.7  DIS与伪节点

DIS:Designated IS,指定中间系统,广播网上的领袖路由器,相当于OSPF中的DR。
Pseudonodes:伪结点。
将多重访问链路模拟成伪结点,由DIS产生,和本网络中的所有路由器建立联系。
DIS负责生成伪节点的LSP,伪节点和本网络中的所有路由器建立联系,并且不允许它们之间直接联系。
IS-IS 协议中,广播子网和NBMA网络在外部被看成一个伪节点。同一网络中的IS 之间会根据各自优先权选出一个DIS(Designated IS)。网络中的非DIS 会向DIS 报告自己的链路状态信息,而DIS 则代表整个网络中所有的IS 报告链路状态信息。选举DIS 的原因与OSPF 中选举DR 的原因一样,其目的是为了减少不必要的邻接关系和路由信息的交换。 伪节点不是一个真实的路由器,但它要占用一个额外的LSP 项。伪节点LSP是由DIS 创建的。
DIS的选举过程:
IS-IS 协议中,DIS 的选举是自动进行的。选举的依据是同一网络中各接口的优先权,如果最高的优先权的接口不止一个则从这些优先权相同的接口中找MAC 地址最大的。DIS 的选举是在IS 自身进行的,网络中的各个IS 根据所在网络的接口上的邻居信息来进行选举。由于整个网络中的邻居信息是一致的,所以各自进行的选举结果是相同的。
  注意:
(9)         只有在广播和NBMA类型的网络接口上才会选举DIS,在Point-to-Point类型的接口上不需要DIS 的选举;
1.        DIS 是针对IS 的接口而言的。某台IS 在这个接口上可能是DIS ,而在另一个接口却可能不是;
2.        不同层次有不同层次的DIS,即L1级的广播网选举L1级的DIS,L2级的广播网选举L2级的DIS;
3.        IS-IS中不存在备份DIS,当一个DIS不能工作时,直接选举另一个;
4.        DIS由整个广播网络上优先级最高的IS担当,如果两个路由器拥有相同的优先权,则选择具有最大MAC地址的一个。


6.8  IS-IS协议的地址编码方式

IS-IS协议地址称为NET(Network Entity Title),可分成三部分:
        区域地址  该部分长度是可变的。区域地址标识区域的路由域长度,并在路由域里固定。
        System ID  长度为6个八位字节,在一个自治系统中值是唯一的。
        N选择器  长度总是1个八位字节,用来指定上层协议。当N选择器设置成0时,用于IP网络。
所有的IS-IS地址必须遵从如下限制:
        一个中间系统(路由器)至少有一个NET(实际中最多有3个,所有NET 必须有相同的System ID),不能有两个中间系统具有相同的NET 。
        一个路由器可以有一个或多个区域地址。 多NET设置只有当区域需要重新划分时才需要使用,例如多个区域的合并或者将一个区域划分为多个不同的区域。这样可以保证在进行重新配置时仍然能够保证路由的正确性。
        IS-IS NET地址至少需要八个字节:一个字节的区域地址,六个字节的系统标识和一个字节的N 选择器,最多为20个字节。

6.9  节点识别

1. 系统ID
唯一标识自治系统内的一个IS。
2. 伪节点ID
伪节点ID只有在广播子网或者NBMA上才有,它的值是伪节点在DIS 上对应接口的接口ID,DIS的伪节点ID 不为0。
3. LSP Number
由于一个IS 中的链路状态信息太多从而导致在一个链路状态的报文中不能装下,这些信息只能装在多个报文中。IS 给每一个分片分配一个LSP Number 号。
4. 链路状态报文ID
LSPID=System ID + Pseudonode ID + LSP Number
例子:
0001.0002.0003.00-00
粗体字:系统ID
斜体字:伪节点ID
下划线:LSP Number
  注意:
在IIH PDU中的报文结构中,源节点标识SOURCE ID=System ID+Pseudonode ID,而不是LSP ID。

6.10  泛洪算法

为什么要保持数据的一致性?
IS-IS 是基于链路状态算法的路由协议,每个IS根据自身的链路状态数据库运行SPF 算法计算路由。如果每个IS 上的链路状态数据库不一致,则有可能导致路由黑洞和循环。
IS-IS协议适用的链路(Links)包括点对点的联接(Point to Point Links)、广播网联接(Broadcast Links)、NBMA(Non-Broadcast Multi-Access )。
所有的IS 都会生成一个代表自己的链路状态报文,如果是广播子网和NBMA 的DIS ,DIS 还会生成一个代表伪节点的链路状态报文。链路状态报文不是一成不变的,当链路状态发生改变时会生成新的报文。
以下改变会触发新的链路状态报文,
        邻居/接口的Up/Down
        接口的度量发生改变
        定期的刷新

6.11  IS-IS与OSPF比较


IS-IS和OSPF是链路状态路由协议的两个最典型的代表,都采用SPF算法来计算路由;
由于具有快速收敛、无环路等特点,IS-IS和OSPF都能很好地支持大型网络,但从全球的部署来看,采用OSPF的还是占了多数,而IS-IS在近几年开始得到比较多的应用;
IS-IS和OSPF一样采用Hello协议来维护邻居关系,但IS-IS的Hello协议与OSPF具体实现上有所不同;
IS-IS和OSPF都采用分层路由的概念,都有骨干区域,为网络规划提供了比较灵活而且实际的设计方案;
为了控制链路状态数据库的规模和复杂度,IS-IS和OSPF在广播网络上都选举DR来担任数据库同步的主要角色,但在细节处理上还是有较大的差别的;
对协议报文的验证能力是所有高级路由协议所必须具备的功能,IS-IS对于协议报文的验证处理是有些特别的,它按照Level和PDU类型来处理;
IS-IS和OSPF对路由开销的度量(metric)都采用了接口可配置的cost,能够比较正确地反映网络的实际情况;
在支持大型网络的时候,触发更新的Update方式比周期性广播方式要节约大量的协议报文所产生带宽消耗;
对于每个LSP(LSA)都有一个记时器相关联,正常情况下在一定时间内(较长时间)会更新重新计时,如果在规定时间内没有收到新的更新,将从数据库中清除该LSP(LSA),不再用做路由计算用;
对于边缘区域中的路由器,一是通过区域划分,二是通过设置区域类型来减少对路由器资源的需求。IS-IS可以将区域中的路由器设置为level-1 only类型,OSPF可以将整个区域设置为stub来减少数据库的大小,同时保证正确路由。



IS-IS最初是为ISO的标准协议,为CLNS(connect less network service 无连接网络服务)设计的,后来增加了对IP的支持;而OSPF一开始就是IETF为IP网络设计的;
IS-IS协议直接在链路层上运行,报文直接封装在链路层报文中,支持CLNS、IP等多种协议;OSPF报文封装在IP中,只支持IP协议;
IS-IS协议中整个路由器只能全部属于一个区域,区域边界位于两个路由器之间,路由器的LSDB按Level来维护;而OSPF按接口来,一个路由器可以属于多个区域,为每个区域维护一个LSDB数据库;
OSPF通过特殊的区域ID Area0区来定义骨干区,而IS-IS是通过连续的L2路由器来组成骨干区;
IS-IS的采用的Hello协议比较简单,OSPF比较复杂;而且IS-IS检查比较宽松,邻居之间的Hello和Dead等间隔不一定必须一样,不像OSPF要求必须一致才能形成邻居关系;
IS-IS的LSP生存时间是从20分钟(可配置)往下计算到0来清除旧的LSP,而OSPF是从0往最大值涨到60分钟(周期不可配置)来清除更新旧的LSA的;
IS-IS协议的DR选举比较简单,而且是抢占式可预见的,优先级最高的是DR,优先级别为0的也可能成为DR;为了保证变动比较小,OSPF协议DR选举机制比较复杂并不可预见,优先级最高的不一定是DR,优先级为0的不可能成为DR,并且有BDR的概念,DR失败,BDR立即承担DR的职责,而IS-IS没有BDR,DR失败,重新选举DR;
IS-IS不支持P-2-MP类型的网络,并且NBMA网络都只能设置为子接口模拟成P2P来运行;OSPF可以很好地支持以下各种网络类型:Broadcast,NBMA,P-2-P,P-2-MP;

第7章  OSPF路由协议
7.1  OSPF协议原理

OSPF 是 Open Shortest Path First(即“开放最短路由优先协议”)的缩写。它是 IETF (Internet Engineering Task Force)组织开发的一个基于链路状态的自治系统内部路由协议。在 IP 网络上,它通过收集和传递自治系统的链路状态来动态地发现并传播路由。当前OSPF协议使用的是第二版,最新的RFC是2328。OSPF协议具有如下特点:
适应范围: OSPF 支持各种规模的网络,最多可支持几百台路由器。
快速收敛: 如果网络的拓扑结构发生变化,OSPF 立即发送更新报文,使这一变化在自治系统中同步。
无自环: 由于 OSPF 通过收集到的链路状态用最短路径树算法计算路由,故从算法本身保证了不会生成自环路由。
子网掩码 : 由于 OSPF 在描述路由时携带网段的掩码信息,所以OSPF协议不受自然掩码的限制,对VLSM 提供很好的支持。
区域划分 : OSPF 协议允许自治系统的网络被划分成区域来管理,区域间传送的路由信息被进一步抽象,从而减少了占用网络的带宽。
等值路由 : OSPF 支持到同一目的地址的多条等值路由。
路由分级 : OSPF 使用 4 类不同的路由,按优先顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。
支持验证 : 它支持基于接口的报文验证以保证路由计算的安全性。
组播发送 : OSPF在有组播发送能力的链路层上以组播地址发送协议报文,即达到了广播的作用,又最大程度的减少了对其他网络设备的干扰。
7.2  OSPF基本概念

1. Router ID
OSPF协议使用一个被称为Router ID的32位无符号整数来唯一标识一台路由器。基于这个目的,每一台运行OSPF的路由器都需要一个Router ID。这个Router ID一般需要手工配置,一般将其配置为该路由器的某个接口的IP地址。由于IP地址是唯一的,所以这样就很容易保证Router ID的唯一性。在没有手工配置Router ID的情况下,一些厂家的路由器(包括Quidway系列)支持自动从当前所有接口的IP地址自动选举一个IP地址作为Router ID。
2. 协议号
OSPF 协议用IP 报文直接封装协议报文,协议号是89。
7.3  链路状态

OSPF协议计算路由是以本路由器周边网络的拓扑结构为基础的。每台路由器将自己周边的网络拓扑描述出来,传递给其他所有的路由器。
OSPF 将不同的网络拓扑抽象为以下四种类型:
        该接口所连的网段中只有本路由器自己。(stub networks)
        该接口通过点到点的网络与一台路由器相连。(point-to-point )
        该接口通过广播或NBMA的网络与多台路由器相连。(broadcast or NBMA networks)
        该接口通过点到多点的网络与多台路由器相连。(point-to-multipoint)
NBMA与点到多点的区别:
在OSPF协议中NBMA和点到多点都是指非广播多点可达的网络,但NBMA网络必须满足全连通(full meshed)的要求,即任意两点都可以不经转发而使报文直达对端。否则,我们称该网络是点到多点网络。
如上图所示:
RTA作为网络中的一台路由器,其周围的链路状态情况可归纳为以下四种:
        通过 PPP 协议与另一台路由器RTB直接相连;
        通过一个 X.25 网络与 RTC 和 RTD 相连(该网络是全连通的);
        通过一个Frame Relay网络与RTE和RTF相连(该网络不是全连通的,RTE与RTF不直接相连);
        直接连接着一个局域网。

7.4  计算路由

上图中描述了通过 OSPF 协议计算路由的过程。
(1)由四台路由器组成的网络,连线旁边的数字表示从一台路由器到另一台路由器所需要的花费。为简化问题,我们假定两台路由器相互之间发送报文所需花费是相同的。
(2)每台路由器都根据自己周围的网络拓扑结构生成一条 LSA(链路状态广播),并通过相互之间发送协议报文将这条 LSA 发送给网络中其它的所有路由器。这样每台路由器都收到了其它路由器的 LSA,所有的 LSA 放在一起称作 LSDB(链路状态数据库)。显然,4 台路由器的 LSDB 都是相同的。
(3)由于一条 LSA 是对一台路由器周围网络拓扑结构的描述,那么 LSDB 则是对整个网络的拓扑结构的描述。路由器很容易将 LSDB 转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。显然,4 台路由器得到的是一张完全相同的图。
(4)接下来每台路由器在图中以自己为根节点,使用SPF算法计算出一棵最短路径树,由这棵树得到了到网络中各个节点的路由表。显然,4 台路由器各自得到的路由表是不同的。
这样每台路由器都计算出了到其它路由器的路由。
由上面的分析可知:OSPF协议计算出路由主要有以下三个主要步骤:
        描述本路由器周边的网络拓扑结构,并生成LSA。
        将自己生成的LSA在自治系统中传播。并同时收集所有的其他路由器生成的LSA。
        根据收集的所有的LSA计算路由。

7.5  OSPF的协议报文

OSPF的报文类型一共有五种:
HELLO报文(Hello Packet):
最常用的一种报文,周期性的发送给本路由器的邻居。内容包括一些定时器的数值,DR,BDR,以及自己已知的邻居。
DD报文(Database Description Packet):
两台路由器进行数据库同步时,用DD报文来描述自己的LSDB,内容包括LSDB中每一条LSA的摘要(摘要是指LSA的HEAD,通过该HEAD可以唯一标识一条LSA)。这样做是为了减少路由器之间传递信息的量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分,根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。
LSR报文(Link State Request Packet):
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的或是对端更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需要的LSA的摘要。
LSU报文(Link State Update Packet):
用来向对端路由器发送所需要的LSA,内容是多条LSA(全部内容)的集合。
LSAck 报文(Link State Acknowledgment Packet)
用来对接收到的LSU报文进行确认。内容是需要确认的LSA的HEAD(一个报文可对多个LSA进行确认)。

7.6  OSPF的邻居状态机

Down:邻居状态机的初始状态,是指在过去的Dead-Interval时间内没有收到对方的Hello报文。
Attempt:只适用于NBMA类型的接口,处于本状态时,定期向那些手工配置的邻居发送HELLO报文。
Init:本状态表示已经收到了邻居的HELLO报文,但是该报文中列出的邻居中没有包含我的Router ID(对方并没有收到我发的HELLO报文)。
2-Way:本状态表示双方互相收到了对端发送的HELLO报文,建立了邻居关系。在广播和NBMA类型的网络中,两个接口状态是DROther的路由器之间将停留在此状态。其他情况状态机将继续转入高级状态。
ExStart:在此状态下,路由器和它的邻居之间通过互相交换DD报文(该报文并不包含实际的内容,只包含一些标志位)来决定发送时的主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。
Exchange:路由器将本地的LSDB用DD报文来描述,并发给邻居。
Loading:路由器发送LSR报文向邻居请求对方的DD报文。
Full:在此状态下,邻居路由器的LSDB中所有的LSA本路由器全都有了。即,本路由器和邻居建立了邻接(adjacency)状态。
  注意:
(10)         灰色的状态是指稳定的状态,其他状态则是在转换过程中瞬间(一般不会超过几分钟)存在的状态。
5.        本路由器和状态可能与对端路由器的状态不相同。例如本路由器的邻居状态是Full,对端的邻居状态可能是Loading。

7.7  链路状态数据库的同步过程

上图显示了两台路由器之间如何通过发送5种协议报文来建立邻接关系,以及邻居状态机的迁移。
1.        RT1的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个HELLO报文(使用组播地址224.0.0.5)。由于此时RT1在该网段中还未发现任何邻居,所以HELLO报文中的Neighbor字段为空。
2.        RT2收到RT1发送的HELLO报文后,为RT1创建一个邻居的数据结构。RT2发送一个HELLO报文回应RT1,并且在报文中的Neighbor字段中填入RT1的Router id,表示已收到RT1的HELLO报文,并且将RT1的邻居状态机置为Init。
3.        RT1收到RT2回应的HELLO报文后,为RT2创建一个邻居的数据结构,并将RT2邻居状态机置为Exstart状态。下一步双方开始发送各自的链路状态数据库。
为了提高发送的效率,双方需先了解一下对端数据库中那些LSA是自己所需要的(如果某一条LSA自己已经有了,就不再需要请求了)。方法是先发送DD报文,DD报文中包含了对本地数据库中LSA的摘要描述(每一条摘要可以惟一标识一条LSA,但所占的空间要少得多)。由于OSPF直接用IP报文来封装自己的协议报文,所以在传输的过程中必须考虑到报文传输的可靠性。为了做到这一点,在DD报文的发送过程中需要确定双方的主从关系。作为Master的一方定义一个序列号seq,每发送一个新的DD报文将seq 加一。作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的seq。实际上这种序列号机制是一种隐含的确认方法。如果再加上每个报文都有超时重传,就可以保证这种传输是可靠的。
RT1首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号为x。I=1表示这是第一个DD报文,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文。
4.        RT2在收到RT1的DD报文后,将RT1的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RT2的Router ID较大,所以在报文中RT2认为自己是Master,并且重新规定了序列号为y。
5.        RT1收到报文后,同意了RT2为Master,并将RT2的邻居状态机改为Exchange。RT1使用RT2的序列号y来发送新的DD报文,该报文开始正式地传送LSA的摘要。在报文中RT1将MS=0,说明自己是Slave。
6.        RT2收到报文后,将RT1的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,需要注意的是:此时RT2已将报文的序列号改为y+1了。
7.        上述过程持续进行,RT1通过重复RT2的序列号来确认已收到RT2的报文。RT2通过将序列号+1来确认已收到RT1的报文。当RT2发送最后一个DD报文时,将报文中的M=0,表示这是最后一个DD报文了。
8.        RT1收到最后一个DD报文后,发现RT2的数据库中有许多LSA是自己没有的,将RT2邻居状态机改为Loading状态。此时RT2也收到了RT1的最后一个DD报文,但RT1的LSA,RT2都已经有了,不需要再请求,所以直接将RT1的邻居状态机改为Full状态。
9.        RT1发送LS Request报文向RT2请求所需要的LSA。RT2用LS Update报文来回应RT1的请求。RT1收到之后,需要发送LS Ack报文来确认。上述过程持续到RT1中的LSA与RT2的LSA完全同步为止。此时RT1将RT2的邻居状态机改为Full状态。

  注意:
以上过程是两台路由器由相互没有发现对方的存在到建立邻接关系的过程。或者可以理解为网络中新加入一台路由器时的处理情况。当两台路由器之间的状态机都已经达到Full状态之后,如果此时网络中再有路由变化时,就无须重复以上的所有步骤。只由一方发送LS Update报文通知需要更新的内容,另一方发送LS  Ack报文予以回应即可。双方的邻居状态机在此过程中不再发生变化。
7.8  DR和BDR

DR的概念:
在广播和NBMA类型的网络上,任意两台路由器之间都需要传递路由信息(flood),如果网络中有 N 台路由器,则需要建立N *(N-1)/2 个邻接关系。任何一台路由器的路由变化,都需要在网段中进行N*(N-1)/2 次的传递。这是没有必要的,也浪费了宝贵的带宽资源。为了解决这个问题,OSPF协议指定一台路由器DR(Designated Router)来负责传递信息。所有的路由器都只将路由信息发送给DR,再由DR将路由信息发送给本网段内的其他路由器。两台不是DR的路由器(DROther)之间不再建立邻接关系,也不再交换任何路由信息。这样在同一网段内的路由器之间只需建立N个邻接关系,每次路由变化只需进行2N 次的传递即可。
DR的产生过程:
哪台路由器会成为本网段内的DR并不是人为指定的,而是由本网段中所有的路由器共同选举出来的。DR的选举过程如下:
        登记选民
本网段内的运行OSPF的路由器;
        登记候选人
本网段内的Priority>0 的OSPF路由器;Priority 是接口上的参数,可以配置,缺省值是1;
        竞选演说
一部分Priority>0 的OSPF路由器自己是DR;
        投票
在所有自称是DR的路由器中选priority值最大的当选,若两台路由器的priority值相等,则选Router ID最大的当选。选票就是HELLO报文,每台路由器将自己选出的DR写入HELLO中,发给网段上的每台路由器;
稳定压倒一切
由于网段中的每台路由器都只和DR建立邻接关系。如果DR频繁的更迭,则每次都要重新引起本网段内的所有路由器与新的DR建立邻接关系。 这样会导致在短时间内网段中有大量的OSPF协议报文在传输,降低网络的可用带宽。所以协议中规定应该尽量的减少DR的变化。具体的处理方法是,每一台新加入的路由器并不急于参加选举,而是先考察一下本网段中是否已有DR存在。如果目前网段中已经存在DR,即使本路由器的priority比现有的DR还高,也不会再声称自己是DR了。而是承认现有的DR。
快速响应:
如果DR由于某种故障而失效,这时必须重新选举DR,并与之同步。这需要较长的时间,在这段时间内,路由计算是不正确的。为了能够缩短这个过程,OSPF提出了BDR(Backup Designated Router)的概念。BDR实际上是对DR的一个备份,在选举DR的同时也选举出BDR,BDR也和本网段内的所有路由器建立邻接关系并交换路由信息。当DR失效后,BDR会立即成为DR,由于不需要重新选举,并且邻接关系事先已建立,所以这个过程是非常短暂的。当然这时还需要重新选举出一个新的BDR,虽然一样需要较长的时间,但并不会影响路由计算。
  注意:
1.        网段中的DR并不一定是priority最大的路由器;同理,BDR也并不一定就是priority第二大的路由器。
2.        DR是指某个网段中概念,是针对路由器的接口而言的。某台路由器在一个接口上可能是DR,在另一个接口上可能是BDR,或者是DROther。
3.        只有在广播和NBMA类型的接口上才会选举DR,在point-to-point和point-to-muiltipoint类型的接口上不需要选举。
4.        两台DROther路由器之间不进行路由信息的交换,但仍旧互相发送HELLO报文。他们之间的邻居状态机停留在2-Way状态。
7.9  NBMA和点到多点

NBMA(NonBroadcast MultiAccess)是指非广播多点可达的网络,比较典型的有X.25和Frame Relay。在这种网络中,为了减少路由信息的传递次数,需要选举DR,其他的路由器只与DR交换路由信息。
在上述描述中有一个缺省的条件:这个NBMA网络必须是全连通的(Full Meshed)。但这在实际情况中并不一定总能得到满足:例如一个X.25网络出于花费方面的考虑,并不一定在任何两台路由器之间都建立一条map;即使是一个全连通的网络,也可能由于故障导致某条map中断,使该网络变成不是全连通的。
在这种情况下会有什么问题呢?图二中是一个非全连通的X.25网络,但其中A、B、E三者是全连通的,假设E被选举为DR,其他为DROther(这里先不考虑BDR)。A、C、D三者也是全连通的,D是其中的DR。由于D、E之间不连通,所以DR的选举算法不能正确运行,D、E都坚持宣称自己是DR。对于A,则只能根据选举算法确定一个DR,假设是E,则A与E之间交换路由信息。A不承认D是DR,D无法与A交换路由信息,A,C之间也无法交换路由信息(两者都是DROther)。这样D、C就无法与网络中其他路由器交换路由信息。导致路由计算不正确。
由上述分析可知:错误产生的原因是因为在非全连通的网络中选举DR所至。为了解决这个问题,OSPF协议定义了一种新的网络类型:point-to-multipoint(点到多点)。点到多点与NBMA最本质的区别是:在点到多点的网络中不选举DR、BDR,即这种类型的网络中任意两台路由器之间都交换路由信息。在上面的图二中B、C可以通过A与网段中的其他路由器交换路由信息。一个NBMA的网络是否是全连通的需要网络管理人员去判断,如果不是,则需要更改配置,将网络的类型改为点到多点。
NBMA与点到多点之间的区别:
        在OSPF协议中NBMA是指那些全连通的非广播多点可达网络。而点到多点的网络并不需要一定是全连通的。
        在NBMA上需要选举DR、BDR,在点到多点上则不需要。
        NBMA是一种缺省的网络类型,例如:如果链路层是X.25、Frame Relay等类型,则OSPF会缺省的认为该接口的网络类型是NBMA(不论该网络是否全连通,因为链路层无法判断出来)。而点到多点不是缺省的网络类型,没有哪种链路层协议会被认为是点到多点。点到多点必须是由其他的网络类型强制更改的。最常用的是将非全连通的NBMA改为点到多点。
        NBMA用单播发送协议报文,需要手工配置邻居。点到多点是可选的,即可以用单播发送,又可以用多播发送报文。

7.10  区域划分

为什么需要划分区域?
随着网络规模日益扩大,网络中的路由器数量不断增加。当一个巨型网络中的路由器都运行OSPF路由协议时,就会遇到如下问题:
        每台路由器都保留着整个网络中其他所有路由器生成的LSA,这些LSA的集合组成LSDB,路由器数量的增多会导致LSDB非常庞大,这会占用大量的存储空间。
        LSDB的庞大会增加运行SPF算法的复杂度,导致CPU负担很重。
        由于LSDB很大,两台路由器之间达到LSDB同步会需要很长时间。
        网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“动荡”之中,为了同步这种变化,网络中会有大量的OSPF协议报文在传递,降低了网络的带宽利用率。更糟糕的是:每一次变化都会导致网络中所有的路由器重新进行路由计算。
解决上述问题的关键主要有两点:减少LSA的数量;屏蔽网络变化波及的范围。
OSPF 协议通过将自治系统划分成不同的区域(Area)来解决上述问题。区域是在逻辑上将路由器划分为不同的组。区域的边界是路由器,这样会有一些路由器属于不同的区域,(这样的路由器称作区域边界路由器——ABR),而一个网段只能属于一个区域。
划分成区域之后,给OSPF协议的处理带来了很大的变化。
        每一个网段必须属于一个区域,或者说每个运行OSPF协议的接口必须指名属于某一个特定的区域,区域用区域号(Area ID)来标识。区域号是一个从0开始的32位整数。
        不同的区域之间通过ABR来传递路由信息。

7.11  区域间路由计算

OSPF将自治系统划分为不同的区域后,路由计算方法也发生了很多变化:
        只有同一个区域内的路由器之间会保持LSDB的同步,网络拓扑结构的变化首先在区域内更新。
        区域之间的路由计算是通过ABR来完成的。ABR首先完成一个区域内的路由计算,然后查询路由表,为每一条OSPF路由生成一条Type3类型的LSA,内容主要包括该条路由的目的地址、掩码、花费等信息。然后将这些LSA发送到另一个区域中。
        在另一个区域中的路由器根据每一条Type3的LSA生成一条路由,由于这些路由信息都是由ABR发布的,所以这些路由的下一跳都指向该ABR。
划分区域后的好处:
        由于划分区域后ABR是根据本区域内的路由生成LSA,则可以根据IP地址的规律先将这些路由进行聚合后再生成LSA,这样做可以大大减少自治系统中LSA的数量。
        划分区域之后,网络拓扑的变化首先在区域内进行同步,如果该变化影响到聚合之后的路由,则才会由ABR将该变化通知到其他区域。大部分的拓扑结构变化都会被屏蔽在区域之内了。
7.12  骨干区域与虚连接

为何需要骨干区域?
OSPF划分区域之后,并非所有的区域都是平等的关系。其中有一个区域是与众不同的,它的区域号(Area ID)是0,通常被称为骨干区域(Backbone Area)。
由于划分区域之后,区域之间是通过ABR将一个区域内的已计算出的路由封装成Type3类的LSA发送到另一个区域之中来传递路由信息。需要注意的是:此时的LSA中包含的已不再是链路状态信息,而是纯粹的路由信息了。或者说,此时的OSPF是基于D-V算法,而不是基于链路状态算法的了。这就涉及到一个很重要的问题:路由自环。因为D-V算法无法保证消除路由自环。如果无法解决这个问题,则区域概念的提出就是失败的。
通过分析D-V算法中路由环的产生的原因可知,自环的产生主要是因为生成该条路由信息的路由器没有加入生成者的信息,即每一条路由信息都无法知道最初是由谁所生成。OSPF协议在生成LSA时首先将自己的Router ID加入到LSA中,但是如果该路由信息传递超过两个区域后,就会丧失最初的生成者的信息。
解决的方法是:所有ABR将本区域内的路由信息封装成LSA后,统一的发送给一个特定的区域,再由该区域将这些信息转发给其他区域。在这个特定区域内,每一条LSA都确切的知道生成者信息。在其他区域内所有的到区域外的路由都会发送到这个特定区域中,所以就不会产生路由自环。这个“特定区域”就是骨干区域。由上面的分析可知:所有的区域必须和骨干区域相连,也就是说,每一个ABR连接的区域中至少有一个是骨干区域。而且骨干区域自身也必须是连通的。
虚连接:
由于网络的拓扑结构复杂,有时无法满足每个区域必须和骨干区域直接相连的要求,例如图中的Area 19。 为解决此问题,OSPF提出了虚连接的概念。虚连接是指在两台ABR之间,穿过一个非骨干区域(转换区域——transit Area),建立的一条逻辑上的连接通道。可以理解为两台ABR之间存在一个点对点的连接。“逻辑通道”是指两台ABR之间的多台运行OSPF的路由器只是起到一个转发报文的作用(由于协议报文的目的地址不是这些路由器,所以这些报文对于他们是透明的,只是当作普通的IP报文来转发),两台ABR之间直接传递路由信息。这里的路由信息是指由ABR生成的type3的LSA,区域内的路由器同步方式没有因此改变。
  注意:
如果自治系统被划分成一个以上的区域,则必须有一个区域是骨干区域,并且保证其它区域与骨干区域直接相连或逻辑上相连,且骨干区域自身也必须是连通的。

7.13  与自治系统外部通讯


自治系统:
OSPF是自治系统内部路由协议,负责计算同一个自治系统内的路由。在这里“自治系统”是指彼此相连的运行OSPF路由协议的所有路由器的集合。对于OSPF来说,整个网络只有“自治系统内”和“自治系统外”之分。需要注意的是:“自治系统外”并不一定在物理上或拓扑结构中真正的位于自治系统的外部,而是指那些没有运行OSPF的路由器或者是某台运行OSPF协议的路由器中没有运行OSPF的接口。
ASBR(Autonomous System Boundary Router):
作为一个IGP,OSPF同样需要了解自治系统外部的路由信息,这些信息是通过ASBR(自治系统边界路由器)获得的,ASBR是那些将其他路由协议(也包括静态路由和接口的直接路由)发现的路由引入(redistribute)到OSPF中的路由器。同样需要注意的是:ASBR并不一定真的位于AS的边界,而是可以在自治系统中的任何位置。
计算自治系统外部路由:
ASBR为每一条引入的路由生成一条Type5类型的LSA,主要内容包括该条路由的目的地址、掩码和花费等信息。这些路由信息将在整个自治系统中传播(STUB AREA除外)。计算路由时先在最短路径树中找到ASBR的位置,然后将所有由该ASBR生成的Type5类型的LSA都当作叶子节点挂在ASBR的下面。以上的方法在区域内部是可行的,但是由于划分区域的原因,与该ASBR不处于同一个区域的路由器计算路由时无法知道ASBR的确切位置(该信息被ABR给过滤掉了,因为ABR是根据区域内的已生成的路由再生成Type3类型的LSA)。为了解决这个问题,协议规定如下:如果某个区域内有ASBR,则这个区域的ABR在向其他区域生成路由信息时必须单独为这个ASBR生成一条Type 4类型的LSA,内容主要包括这个ASBR的Router ID和到他所需的花费值。
路由分级管理:
OSPF将所引入的自治系统外部路由分成两类:type 1和type 2。第一类是指引入的是IGP路由(例如RIP,STATIC),由于这类路由的可信程度高一些,所以计算出的外部路由的花费与自治系统内部的路由花费的数量级是相同的,即到第一类外部路由的花费值 = 本路由器到相应的ASBR的花费值+ASBR到该路由目的地址的花费值。对于第二类外部路由是指引入的是BGP路由,由于这类路由的可信度比较低,所以OSPF协议认为从ASBR到自治系统之外的花费远远大于在自治系统之内到达ASBR的花费。所以计算路由花费时将主要考虑前者,即到第二类外部路由的花费值 = ASBR到该路由目的地址的花费值。如果该值相等,再考虑本路由器到相应的ASBR的花费值。如果加上前面所述的两种路由类型,OSPF一共将路由分为四级,按优先级从高到低排列:
        区域内路由
        区域间路由
        自治系统外一类路由
        自治系统外二类路由
其中前两种路由在路由表中的优先级是一样的,缺省值为10;后两种路由在路由表中的优先级是相同的,缺省值是150。
7.14  STUB区域与路由聚合

OSPF协议将整个自治系统划分成不同的区域。主要出于以下目的:减少路由信息在自治系统之中的传递;可以针对不同区域的拓扑特点采用不同的策略。
STUB区域
STUB区域是指那些不传播Type5类型(即引入的外部路由)的LSA的区域。在这些区域中路由器的路由表规模以及路由信息传递的数量都会大大减少。为了保证到自治系统外的路由依旧可达,由该区域的ABR生成一条缺省路由(0.0.0.0)传播到区域内,因为所有到自治系统外部的路由都必须通过ABR才能到达。STUB区域是一种可选的配置属性,但并不是每个区域都符合配置的条件。通常的,STUB区域位于自治系统的边界,是那些只有一个ABR的非骨干区域。或者该区域虽然有多个ABR,但这些ABR之间没有配置虚连接。图中的 Area 8 和 Area 19 符合配置成STUB区域的条件。
配置STUB区域的一些注意事项:
        骨干区域不能配置成STUB区域,虚连接不能穿过STUB区域。
        如果想将一个区域配置成STUB区域,则该区域中的所有路由器都必须都配置该属性。
        STUB区域内不能存在ASBR,即自治系统外部路由不能引入到区域内,区域的自治系统外部路由也不能在本区域内传播和传递到区域外。
NSSA(Not-So-Stubby Area)区域:
STUB 区域虽然为合理的规划 OSPF 网络描绘了美好的前景,但她在实际的组网中又不具备可操作性,因为实际网络中不可能每台路由、每个接口都运行 OSPF 路由协议,STUB 区域必然需要存在 ASBR 路由器。
为此协议设计者提出了一种新的概念 NSSA,并且作为 OSPF 协议的一种扩展属性单独在RFC 1587中描述。
NSSA 需要完成如下任务:
1)自治系统外的 ASE 路由(自治系统外部路由)不可以进入到 NSSA 区域中,但是 NSSA 区域内的路由器引入的 ASE 路由可以在 NSSA 中传播并发送到区域之外。即:取消了 STUB 关于 ASE 的双向传播的限制(区域外的进不来,区域里的也出不去),改为单向限制(区域外的进不来,区域里的能出去)。
2)由于是作为 OSPF 标准协议的一种扩展属性,应尽量减少与不支持该属性的路由器协调工作时的冲突和兼容性问题。
为了解决ASE路由(自治系统外部路由)单向传递的问题,NSSA 中重新定义了一种LSA——Type 7类型的 LSA,作为区域内的路由器引入外部路由时使用,该类型的 LSA 除了类型标识与 Type 5 不相同之外,其它内容基本一样。这样区域内的路由器就可以通过 LSA 的类型来判断是否该路由来自本区域内。但由于Type 7类的 LSA 是新定义的,对于不支持 NSSA 属性的路由器无法识别,所以协议规定:在 NSSA 的 ABR 上将 NSSA 内部产生的Type 7类型的 LSA 转化为Type 5类型的 LSA 再发布出去,并同时更改 LSA 的发布者为 ABR 自己。这样 NSSA 区域外的路由器就可以完全不用支持该属性。
从上述描述可以看出:在 NSSA 区域内的所有路由器必须支持该属性(包括NSSA的ABR),而自治系统中的其他路由器则不需要。
由于NSSA是由STUB区域的概念改进得来,所以她的名字叫做: "not-so-stubby" area ,本意是:不是那么STUB的区域。
路由聚合:
自治系统被划分成不同的区域,其主要目的是为了减少路由信息及路由表的规模。这主要是通过区域间的路由聚合来实现。ABR在计算出一个区域的区域内路由之后,查询路由表,将其中每一条OSPF 路由封装成一条Type3类型的LSA发送到区域之外。例如图中Area 19 内有三条区域内路由19.1.1.0/24,19.1.2.0/24,19.1.3.0/24,正常情况下RTA应该将这三条路由生成三条Type3类型的LSA。如果此时配置了路由聚合,即将三条路由聚合成19.1.0.0/16一条,在RTA上就会只生成一条描述聚合后路由的LSA。需要注意的是:路由聚合只有在ABR上配置才会有效。
7.15  LSA分类

OSPF是基于链路状态算法的路由协议,所有对路由信息的描述都是封装在LSA中发送出去。LSA根据不同的用途分为不同的种类,目前使用最多的是以下五种LSA:
Router LSA(Type = 1):
是最基本的LSA类型,所有运行OSPF的路由器都会生成这种LSA。主要描述本路由器运行OSPF的接口的连接状况,花费等信息。对于ABR,它会为每个区域生成一条Router LSA。这种类型的LSA传递的范围是它所属的整个区域。
Netwrok LSA(Type = 2):
本类型的LSA由DR生成。对于广播和NBMA类型的网络,为了减少该网段中路由器之间交换报文的次数而提出了DR的概念。一个网段中有了DR之后不仅发送报文的方式有所改变,链路状态的描述也发生了变化。在DROther 和BDR的Router LSA中只描述到DR的连接,而DR则通过Network LSA来描述本网段中所有已经同其建立了邻接关系的路由器。(分别列出它们Router ID)。同样, 这种类型的LSA传递的范围是它所属的整个区域。
Network Summary LSA(Type = 3):
本类型的LSA由ABR生成。当ABR完成它所属一个区域中的区域内路由计算之后,查询路由表,将本区域内的每一条OSPF路由封装成 Network Summary LSA 发送到区域外。 LSA中描述了某条路由的目的地址、掩码、花费值等信息。这种类型的LSA传递的范围是ABR中除了该LSA生成区域之外的其他区域。
ASBR Summary LSA(Type = 4):
本类型的LSA同样是由ABR生成。内容主要是描述到达本区域内部的ASBR的路由。 这种LSA与Type3类型的LSA内容基本一样,只是Type4的LSA描述的目的地址是ASBR,是主机路由,所以掩码为0.0.0.0。这种类型的LSA传递的范围与Type3的LSA相同。
AS External LSA(Type = 5):
本类型的LSA由ASBR生成。主要描述了到自治系统外部路由的信息,LSA中包含某条路由的目的地址、掩码、花费值等信息。本类型的LSA是唯一一种与区域无关的LSA类型,它并不与某一个特定的区域相关。 这种类型的LSA传递的范围整个自治系统(STUB区域除外)。
7.16  接口分类及路由器分类

OSPF协议根据链路层封装协议不同分为以下四种网络类型:
Broadcast:当链路层协议是Ethernet时,OSPF缺省认为网络类型是Broadcast。在这种类型网络中, 以组播地址(224.0.0.5,224.0.0.6)发送协议报文,需要选举DR,BDR。
NBMA
当链路层协议是Frame Relay、X.25时,OSPF缺省认为网络类型是NBMA。在这种类型网络中, 以单播地址发送协议报文,必须手工配置邻居的IP地址,需要选举DR,BDR。
Point-to-Multipoint
没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型,通常由NBMA的类型手工修改而来,如果NBMA类型的网络不是全连通的。 在这种类型网络中,以组播地址(224.0.0.5)发送协议报文,不需要选举DR,BDR。
Point-to-Point
当链路层协议是PPP,HDLC,LAPB时,OSPF缺省认为网络类型是Point-to-Point。在这种类型网络中, 以组播地址(224.0.0.5)发送协议报文,不需要选举DR,BDR。
路由器根据在自治系统中的不同位置划分为以下四种类型:
IAR(Internal Area Router):
区域内路由器,是指该路由器的所有接口都属于同一个OSPF区域。这种路由器只生成一条Router LSA,只保存一个LSDB。
ABR(Area Border Router):
区域边界路由器,该路由器同时属于两个以上的区域(其中必须有一个是骨干区域,也就是区域0)。该路由器为每一个所属的区域生成一条Router LSA,为每一个所属的区域保存一个LSDB。并根据需要生成Network Summary LSA(Type = 3)和 ASBR Summary LSA(Type = 4)。
BBR (BackBone Router):
骨干路由器,是指该路由器属于骨干区域(也就是0 区域)。由定义可知,所有的ABR都是骨干路由器,所有的骨干区域内部的IAR也属于BBR。
ASBR(AS Boundary Router):
自治系统边界路由器,是指该路由器引入了其他路由协议(也包括静态路由和接口的直接路由)发现的路由。需要注意的是ASBR并不一定在拓扑结构中位于自治系统的边界。ASBR生成AS External LSA(Type = 5)。
一个运行OSPF协议的接口状态根据接口的不同类型可划分为以下四种:
DR、BDR、DROther:
当接口的类型为Broadcast、NBMA时,需要在网段内选举DR、BDR,根据选举的结果不同,接口的状态可能是以上三种中的一种。
Point-to-Point:
当接口的类型为Point-to-Point、Point-to-Multipoint时,不需要在网段内选举DR、BDR,此时接口的状态是Point-to-Point。
  注意:
路由器的各种类型之间是可以“兼职”的(除了不能同时是IAR和ABR),例如:一台路由器可以同时是IAR、BBR、ASBR。而接口状态是指路由器的其中一个接口的状态,两者之间没有任何关系。
7.17  OSPF与路由自环

路由自环是指到某一个目的地址的路由在网络中形成了环路,一个最简单的例子:路由器A上有一条路由10.0.0.0/8下一跳是路由器B;而在路由器B的路由表中该路由的下一跳指向A;如果A收到一条到10.0.0.1的报文,它会转发给B,而B根据路由表又将该报文转发给A。于是该报文会在A、B之间不停的震荡,直至TTL=0才会将该报文丢弃,最坏的情况可能会震荡255次。路由自环对网络的危害是极大的,不仅导致路由不可达,而且浪费了大量的网络的带宽。路由自环是所有路由协议必须解决的问题,也是衡量一个路由协议好坏的重要标志。
D-V算法与路由自环:
D-V算法又称为“距离—向量”算法,其核心思想是网络中的每台路由器都将自己已知的路由表发送给相邻的路由器,每台路由器都会根据收到的所有路由确定最优路径的下一跳。这种算法(主要指RIP和IGPR所实现的D-V算法)的缺陷是:
        每台路由器对接收到的路由的可信度完全依赖于相邻的路由器。而一台路由器只能保证自己本地路由的正确性(指本路由器的接口路由),而对由其他路由器发送来的路由则无法保证。
        每一条路由信息中没有标明生成者的信息,该路由信息经过网络中多次传递之后,可能被传回给最初的生成者,而生成者无法知道该信息是否由自己所发布,这就为自环的产生埋下了隐患。
当网络拓扑结构发生变化时,一条已经无效的路由在未能彻底清除之前,可能仍旧在网络中传递,当它传递给该路由的生成者时,此时下一跳的计算可能会发生错误,导致路由自环的产生。
OSPF与路由自环:
OSPF是一种基于链路状态算法的协议,其核心思想是:每一台路由器将自己周边的链路状态(包括接口的直接路由、相连的路由器等信息)描述出来,发送给网络中所有的路由器。每台路由器在收到其他所有路由器的发送的链路状态信息之后,运行SPF算法计算路由。
OSPF计算出的路由不会有自环,主要有以下原因:
        每台路由器描述的是自己能够确保正确的信息——自己周边的网络拓扑结构。并且在生成的LSA中标记了该信息的生成者——写入自己的Router ID。其他的路由器只负责在网络中传输该信息,而不会有任何的更改。这一点保证了无论网络的拓扑结构如何,无论路由器位于网络中的什么位置,都可以准确无误的接收到全网的拓扑结构图。
        路由计算的算法是SPF算法。计算的结果是一棵树,路由是树上的叶子节点。从根节点到叶子节点是单向不可回复的路径。
        当网络的拓扑结构发生变化时(此时最易产生路由自环),会有一台(或多台)路由器感知到这一变化,重新描述网络拓扑结构,并将其通知给其他路由器。每个路由器接收到更新信息后,都会立即重新运行SPF算法,得到新的路由。
OSPF真的没有路由自环吗?
上文中描述的是指没有划分区域时的情况,或者说是在同一区域内OSPF的运行情况。当OSPF划分为不同的区域之后,ABR通过将区域内已计算好的路由封装成Type3类型的LSA发送出去。需要特别注意的是:此时ABR只是单纯的对路由进行描述,而不是描述链路的状态了。或者说,此时的OSPF计算区域间路由时使用的是D-V算法。这时就可能会产生路由自环,OSPF通过骨干区域解决了这个问题(详情见“骨干区域与虚连接”)。
但是当OSPF引入自治系统外部路由时,ASBR封装在Type5类型的LSA中的同样是路由信息,而不是链路状态。这时也同样会产生路由自环。这一次OSPF没有采取任何措施来避免自环的生成,因为引入的自治系统外部路由其本身就是不可靠的。它可能来源于RIP等不可靠的路由,或者是配置错误的静态路由等等,可能这些路由本身就存在路由环。划分区域时区域内计算出的路由都是正确无误的,所以应极力避免由于划分区域而生成新的环路。而引入的外部路由由于其来源即不可靠,所以就没必要再进行其他的操作了。
“OSPF协议不会产生路由自环”这句话的严格定义应该是:OSPF协议生成的自治系统内部路由是无自环的,引入的自治系统外部路由则无法保证。



第8章  BGP协议概述
8.1  基本概念

BGP(Border Gateway Protocol)是一种自治系统间的动态路由发现协议,它的基本功能是在自治系统间自动交换无环路的路由信息,通过交换带有自治系统号(AS)序列属性的路径可达信息,来构造自治区域的拓扑图,从而消除路由环路并实施用户配置的路由策略。与OSPF和RIP 等在自治区域内部运行的协议对应,BGP是一类EGP(Exterior Gateway Protocol)协议,而OSPF和RIP等为IGP(Interior Gateway Protocol)协议。BGP协议经常用于ISP之间。
BGP协议从1989年以来就已经开始使用。它最早发布的三个版本分别是RFC1105(BGP-1)、RFC1163(BGP-2)和RFC1267(BGP-3),当前使用的是RFC1771(BGP- 4)。 随着INTERNET的飞速发展,路由表的体积也迅速增加,自治区域间路由信息的交换量越来越大,影响了网络的性能。BGP支持无类别域间选路CIDR(Classless Interdomain Routing),可以有效的减少日益增大的路由表。BGP-4正迅速成为事实上的Internet边界路由协议标准。特性描述如下:
BGP是一种外部路由协议,与OSPF、RIP等的内部路由协议不同,其着眼点不在于发现和计算路由,而在于控制路由的传播和选择最好的路由。
通过携带AS路径信息,可以彻底解决路由循环问题。
为控制路由的传播和路由选择,它为路由附带属性信息。
使用TCP作为其传输层协议,提高了协议的可靠性。
BGP-4支持无类别域间选路CIDR(Classless InterDomain Routing),有时也称为supernetting,这是对BGP-3的一个重要改进。CIDR以一种全新的方法看待IP地址,不再区分A类网、B类网及C类网。例如一个非法的C类网络地址192.213.0.0(255.255.0.0)采用CIDR表示法192.213.0.0/16就成为一个合法的超级网络,其中/16表示子网掩码由从地址左端开始的16比特构成。CIDR的引入简化了路由聚合(Routes Aggregation),路由聚合实际上是合并几个不同路由的过程,这样从通告几条路由变为广告一条路由,减化了路由表。
路由更新时,BGP只发送增量路由,大大减少了BGP传播路由所占用的带宽,适用于在Internet上传播大量的路由信息。
由于政治的、经济的原因,每个自治系统希望对路由进行过滤、选择和控制, 因此,BGP-4 提供了丰富的路由策略,它使得BGP便于扩展以支持因特网新的发展。
与OSPF,RIP等IGP协议相比,BGP的拓扑图要更抽象和粗略一些。因为IGP协议构造的是AS内部的路由器的拓扑结构图。IGP把路由器抽象成若干端点,把路由器之间的链路抽象成边,根据链路的状态等参数和一定的度量标准,每条边配以一定的权值,生成拓扑图。根据此拓扑图选择代价(两点间经过的边的权值和)最小的路由。这里有一个假设,即路由器(端点)转发数据包是没有代价的。而在BGP中,拓扑图的端点是一个AS区域,边是AS之间的链路。此时,数据包经过一个端点(AS自治区域)时的代价就不能假设为0了,此代价要由IGP来负责计算。这体现了EGP和IGP是分层的关系。即IGP负责在AS内部选择花费最小的路由,EGP负责选择AS间花费最小的路由。
BGP作为EGP的一种,选择路由时考虑的是AS间的链路花费、AS区域内的花费(由BGP路由器配置)等因素。
如上所述,内部网关协议IGP需引入AS自治区域内部网络拓扑图其它各点的路由,同时向其它端点发送本端点(路由器)所知的路由,如直接路由、静态路由等。作为外部网关协议,BGP发送和引入路由的单位是整个AS自治区域,即BGP要发送本地路由器所在的AS内部的所有路由,引入其它AS自治区域的所有路由(假设不使用路由策略控制发送和引入)。其路由数量显然要远远大于IGP发送和引入的路由数量。因此,类似于IGP那样定时对外广播路由信息是不可取的。BGP采用发送路由增量(Incremental)的方法,完成全部路由信息的通告和维护:初始化时发送所有的路由给BGP对等体(BGP Peer),同时在本地保存了已经发送给BGP对等体的路由信息。当本地的BGP收到了一条新路由时(如通过IGP注入了新路由或加入了新的静态路由),与保存的已发送信息进行比较,如未发送过,则发送,如已发送过则与已经发送的路由进行比较,如新路由花费更小,则发送此新路由,同时更新已发送信息,反之则不发送。当本地BGP发现一条路由失效时(如对应端口失效),如此路由已发送过,则向BGP对等体发送一个撤消路由消息。
总之,BGP不是每次都广播所有的路由信息,而是在初始化全部路由信息后只发送路由的变化量(增量)。这样保证了BGP和对端的最小通信量,但同时也增加了BGP的复杂程度。因为对于IGP,本地路由协议只需发送发送时刻所知的全部路由,而不保存任何已发送信息,路由选择的工作由对端来完成;而BGP必须为每个BGP对端保存已经发送的路由信息,以便发送一条新路由前确认其是否真的应该发送。
为了减小路由表的体积和发送路由的通信量,BGP还支持CIDR(Classless InterDomain Routing)。它使用带有较短的掩码(相对于自然掩码)的路由来在一条路由中表达更多的路由信息。如从202.112.1.0/24-202.112.254.0/24可以使用202.112.0.0/16表示,从而减小了路由表的体积和发送路由信息时的网络流量。
同时,作为AS自治区域间的路由协议,由于政治的、经济的等原因,BGP需要按照不同的路由的属性控制路由的发送和引入。因此,BGP有丰富的路由策略控制手段。
8.2  自治系统

自治系统指的是:由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。每个自治系统都有唯一的自治系统编号,这个编号是由因特网授权的管理机构分配的。
引入自治系统的基本思想:就是通过不同的编号来区分不同的自治系统。这样,当网络管理员不期望自己的通信数据通过某个自治系统时,这种编号方式就十分有用了。或许,该网络管理员的网络完全可以访问这个自治系统,但由于它可能是由竞争对手在管理,或是缺乏足够的安全机制,因此,可能要回避它。通过采用路由协议和自治系统编号,路由器就可以确定彼此间的路径和路由信息的交换方法。
自治系统的编号范围是1到65535,其中1到64511是注册的因特网编号,64512到65535是专用网络编号。
8.3  BGP的工作机制

BGP系统作为应用层协议运行在一个特定的路由器上。系统初启时通过发送整个BGP路由表交换路由信息,之后为了更新路由表只交换更新消息(update message)。系统在运行过程中,是通过接收和发送keep-alive消息来检测相互之间的连接是否正常。
发送BGP消息的路由器称为BGP发言人(speaker),它不断的接收或产生新路由信息,并将它广告(advertise)给其它的BGP发言人。当BGP发言人收到来自其他自治系统的新路由广告时,如果该路由比当前已知路由好、或者当前还没有可接受路由,它就把这个路由广告给自治系统内所有其它的BGP发言人。一个BGP发言人也将同它交换消息的其它的BGP发言人称为同伴(peer),若干相关的同伴可以构成同伴组(group)。
一般情况下一条路由是从自治系统内部产生的,它由某种内部路由协议发现和计算,传递到自治系统的边界,由自治系统边界路由器(ASBR)通过EBGP连接传播到其它自治系统中。路由在传播过程中可能会经过若干个自治系统,这些自治系统称为过渡自治系统。如:AS5。若这个自治系统有多个边界路由器,这些路由器之间运行IBGP来交换路由信息。这时内部的路由器并不需要知道这些外部路由,它们只需要在边界路由器之间维护IP连通性。如:AS2、AS3、AS4。路由到达自治系统边界后,若内部路由器需要知道这些外部路由,ASBR可以将路由引入内部路由协议。外部路由的数量是很大的,通常会超出内部路由器的处理能力,因此引入外部路由时一般需要过滤或聚合,以减少路由的数量,极端的情况是使用默认路由。还有一种自治系统称为Stub AS,如:AS1、AS6、AS7。其内部只有一个ASBR通过EBGP连接外部,同外部其他AS的通信要靠过渡自治系统来转接。
对一个具体的ASBR来说,其路由的来源有两种:从对等体接收的或者从IGP引入的。对于接收的路由,根据其属性(如AS路径、团体属性等)进行过滤,并设置某些属性(如本地优先、MED值等),之后若需要的话,将具体的路由聚合为超网路由。BGP可能从多个对等体收到目的地相同的路由,根据规则选择最好的路由并加入IP路由表。对于IGP路由,则要经过引入策略的过滤和设置。BGP发送优选的BGP路由和引入的IGP路由给对等体。
8.4  BGP的两种邻居

BGP在路由器上以下列两种方式运行:
IBGP(Internal BGP)
EBGP(External BGP)
如果两个交换BGP报文的对等体属于同一个自治系统,那么这两个对等体就是IBGP对等体(Internal BGP) ,如RTB和RTD。
如果两个交换BGP报文的对等体属于不同的自治系统,那么这两个对等体就是EBGP对等体 (External BGP) ,如RTA和RTB。
虽然BGP是运行于自治系统之间的路由协议,但是一个AS的不同边界路由器之间也要建立BGP连接,只有这样才能实现路由信息在全网的传递,如RTB和RTD,为了建立AS100和AS300之间的通信,我们要在它们之间建立IBGP连接。
IBGP对等体之间不一定是物理上直连的,但必须保证逻辑上全连接。(TCP连接能够建立即可)。
一般的路由器(包括Quidway系列路由器)都默认要求EBGP对等体之间是有物理上的直连链路,同时他们一般也提供改变这个缺省设置的配置命令。
8.5  BGP路由通告原则

BGP 的路由通告原则:
多条路径时,BGP Speaker只选最优的给自己使用;
BGP Speaker只把自己使用的路由通告给相邻体;
BGP Speaker从EBGP获得的路由会向它所有BGP相邻体通告(包括EBGP和IBGP);
BGP Speaker从IBGP获得的路由不向它的IBGP相邻体通告;
BGP Speaker从IBGP获得的路由是否通告给它的EBGP相邻体要依IGP和BGP同步的情况来决定;
连接一建立,BGP Speaker将把自己所有BGP路由通告给新相邻体。
这些通告原则都是BGP的设计者在设计BGP 路由协议时硬性规定的,这里我们不深究其原因。
8.6  BGP同步

BGP协议规定:一个BGP 路由器不将从内部BGP对等体得知的路由信息通告给外部对等体,除非该路由信息也能通过IGP得知。若一个路由器能通过IGP得知该路由信息,则可认为路由能在AS中传播,内部通达已有了保证。
BGP的主要任务之一就是向其它自治系统发布该自治系统的网络可达信息。如图所示,RTB会把去往10.1.1.1/24 的路由信息封装在UPDATE报文中,通过由RTC、RTD建立的TCP 连接通告给RTE,如果RTE不考虑同步问题,直接接受了这样一条路由信息并通告给RTF。那么,如果RTF 或RTE有去往10.1.1.1/24 的数据报文要发送,这个数据报文要想到达目的地必须径过RTD和RTC,由于先前没有考虑同步问题,RTD和RTC的路由表中没有去往10.1.1.1/24 的路由信息,数据报文到了RTD就会被丢弃。因此,BGP必须与IGP(如RIP、OSPF等)同步。同步是指BGP必须等待直到IGP在其所在自治系统中成功传播该选路信息,才向其它自治系统通告过渡信息。也就是说,当一个路由器从IBGP对等体收到一个目的地的更新信息,在把它通告给其它EBGP对等体之前,要试图验证该目的地通过自治系统内部能否到达(即验证该目的地是否存在于IGP,非BGP路由器是否可传递业务量到该目的地。若IGP认识这个目的地,才接受这样一条路由信息并通告给EBGP对等体,否则将把这个路由当作与IGP不同步,不进行通告。
如图所示,RTE 通过IBGP邻居关系获得去往AS100内网络10.1.1.1/24的路由,RTE 不会马上将其添加到自己的路由表中,也不会向RTF通告。RTE看OSPF是否也能获得去往10.1.1.1/24 路由。如果OSPF能就说明IGP 和 BGP是同步的,RTE 就把该路由添加到路由表中,并通告给RTF。如OSPF没能获得去往10.1.1.1/24 路由,则IGP 和BGP不同步,RTE不会把去往10.1.1.1/24 的路由添加到路由表中,也不会向RTF 通告该路由。解决的方法有很多,最简单的办法是RTB把BGP路由信息引入到OSPF路由表中,再由OSPF 通告到RTE,这样就同步了。但是一般不建议这样做,因为BGP路由表很大,引入到OSPF中来会给系统带来很大负担。其它的解决办法如:可以在RTB上配置一条去往10.1.1.1/24 的静态路由,再把该静态路由引入到OSPF中,这样也可以达到同步。
实际上,同步和不同步是可以配置的。Quidway 系列路由器缺省情况下BGP与IGP是同步的。
虽然同步是可以取消的,但取消同步是有条件的。当AS中所有的BGP 路由器能组成IBGP全闭合网时,可以取消同步,在同步被取消以后,有一个新的问题需要考虑:RTB 去往10.1.1.1/24 的下一跳是s0:1.1.1.1/24 ,RTB在把该路由信息通告给RTE时,保持路由的下一跳不变,因为它们之间是IBGP。这样对于RTE来说,去往10.1.1.1/24 的下一跳是s0:1.1.1.1/24 。 下一跳s0:1.1.1.1/24 是否可达成为关键问题。对于RTE来说,如果下一跳s0:1.1.1.1/24 可达,RTE就接受去往10.1.1.1/24 的路由,如果下一跳s0:1.1.1.1/24 不可达,RTE就不接受去往10.1.1.1/24 的路由。怎样才能让下一跳可达呢?方法同样很多,通常可以通过配置强制改变下一跳来解决问题。因为AS中所有的BGP 路由器是IBGP全闭合连接,路由器在向IBGP邻居通告路由时强制下一跳为自己本身的接口,这样对于IBGP邻居来说,下一跳就是直连网段地址,可达性也就解决了。 图中讨论的情况是:建立IBGP邻居关系的两台路由器之间是TCP连接的,在这种情况下,一般不能取消同步,因为在TCP连接的情况下下一跳可达很难满足。
如图所示,可以在RTB上配置RTB在向RTE通告路由信息时会强制改变下一跳为它本身接口 2.1.1.2 。对于RTE来说2.1.1.2 是直连的、可达的。当然,也可以通过配置IGP 路由协议 和静态路由来解决下一跳可达的问题。
8.7  如何成为BGP路由

BGP 路由协议是运行在自治系统之间的路由协议,它的主要工作是在自治系统之间传递路由信息,而不是去发现和计算路由信息。发现和计算路由信息的任务由IGP (如:RIP、OSPF)路由协议来完成。BGP 的路由信息需要通过配置命令的方式注入到BGP中。
按照注入的方式可分为三类:纯动态注入、半动态注入、静态注入。
纯动态注入是指:路由器将通过IGP路由协议动态获得的路由信息直接注入到BGP中去。纯动态注入方式没有对路由信息做任何过滤和选择,它会把路由器获得的所有IGP 路由信息都引入到BGP系统中。从另一角度来说,这样一种路由注入方式配置简单,一次性引入了所有的路由信息。当然,在实际工程中可以根据需要选择。

半动态注入是指:路由器有选择性的将IGP发现的动态路由信息注入到BGP系统中去。它和纯动态注入的区别在于不是将IGP发现的所有路由信息注入到BGP中去。
如图所示,路由器B通过OSPF 协议动态地发现去往网络18.0.0.0/8的路由,再通过配置命令静态将其引入到BGP中,我们称这样一种路由注入方式为半动态注入。


静态注入是指:路由器将静态配置的某条路由注入到BGP系统中。
如图所示,路由器B首先,建立一条去往网络18.0.0.0/8 的静态路由,再通过配置命令将其静态引入到BGP中,我们称这样一种路由注入方式为静态注入。


第9章  BGP的报文和状态机
9.1  报文种类

BGP有4种类型的报文,分别为OPEN、UPDATE、NOTIFICATION和KEEPALIVE。
BGP对等体间通过发送OPEN报文来交换各自的版本、自治系统号、保持时间、BGP标识符等信息,进行协商。
UPDATE报文携带的是路由更新信息。其中包括撤销路由信息和可达路由信息及其路径属性。
当BGP检测到差错(连接中断、协商出错、报文差错等)时,发送NOTIFICATION 报文,关闭同对等体的连接。
KEEPALIVE报文在BGP对等体间周期地发送,以确保连接保持有效。
OPEN报文主要用于建立邻居(BGP对等体)关系,它是BGP路由器之间的初始握手消息,应该发生在任何通告消息之前。其他在收到OPEN消息之后,即以KEEPALIVE消息作为响应。一旦握手成功,则这些BGP邻居就可以进行UPDATE(更新)、KEEPALIVE(保持激活)以及NOTIFICATION(通知)等消息的交换操作。
9.2  报文内容及格式

BGP报文头的格式如图所示,每行的宽度为4个字节。
Marker 鉴权信息:16 字节,全1。这个标记的作用主要是用来检测BGP对等体之间的同步是否丢失,并对进来的BGP消息进行验证。
Length 消息的长度:2 字节,指示整个消息的长度,包括头标长度,最小的BGP消息长度是19字节(Keepalive报文),最大的长度是4096字节。
Type 消息的类型:1 字节,指示报文类型,如OPEN、UPDATE报文等。
1 :OPEN
2 :UPDATE
3 :NOTIFICATION
4 :KEEPALIVE

Version :(1字节) 发端BGP版本号
My Autonomous System :(2字节无符号整数) 本地AS号
Hold Time :(2字节无符号整数) 发端建议的保持时间 BGP Identifier :(4字节)发端的路由器标识符
Optional parameters Len :(1字节) 可选的参数的长度
Optional Parameters :(变长) 可选的参数
消息的开始部分包括BGP的版本号和发送方的自治系统编号。接下来是保持时间(HOLD TIME)字段,这是发送方提供建议的保持定时器的设定秒数。保持定时器规定了BGP邻居认为发送方信息有效的时间长度。再下一个字段是BGP标识(BGP ID),也就是BGP发送方的标识。该值是在BGP对等体之间进行握手操作的过程中确定的,并且在每个本地接口及每个BGP对等体之间是保持不变的。

KeepAlive 报文主要用于对等体路由器间的运行状态以及链路的可用性确认。KeepAlive 报文的组成只包括一个BGP数据报头。 KeepAlive 消息在对等路由器间的交换频度以保证对方保持定时器不超时为限。
当一台路由器与其邻居建立BGP连接之后,将以Keepalive-interval设定的时间间隔周期性地向对等体发送Keepalive 报文,表明该连接是否还可保持。
缺省情况下,发送Keepalive 的时间间隔为 60 秒。

Unfeasible Routes Len :(2字节无符号整数) 不可达路由长度
Withdrawn Routes :(变长) 撤消路由
Path Attribute Len :(2字节无符号整数) 路径属性长
Path Attributes :(变长) 路径属性(以下详细说明)
Network Layer Reachability Information :(变长) 网络可达信息(目标)
其中撤消路由和目标地址的表示方法为一 <length,prefix> 的二元组。length一个字节,指示地址前缀的长度。prefix为地址前缀,长度1至4字节。
UPDATE 报文是BGP系统中最重要的信息,用于在同伴之间交换路由信息,它最多由三部分构成:不可达路由(unreachable)、路径属性(path attributes)、网络可达性信息(NLRI,network layer reachability information)。
UPDATE 消息可以向BGP对等体通告一条路由,也可以撤消多条“行不通”的路由。不可达路由字段包括一个所撤消路由的IP地址前缀列表。路径属性字段是一个路径属性的列表,包括:属性类型、属性长度和属性值等。网络可达字段包括了BGP路由器所知道的且可到达的IP地址前缀列表。
一个UPDATE 消息一次只能通告一个路由,但它可以携带多个路径属性。
一个UPDATE 消息一次也可通告多条路由,但它的路径属性必须相同。
一个UPDATE 消息可以同时列出多个被撤消的路由。

Notification 报文主要在发生错误或对等体连接被关闭的情况下使用,该消息携带各种错误代码(如定时器超时等),包括错误代码、辅助错误代码及错误信息。
Errorcode :(1字节) 错误代码。