计算机网络——网络层:控制平面②
基于AS的路由选择:OSPF与BGP
迄今为止,我们都把网络视作是由许多地位平等路由器相互连接组成的。 然而,如果真的如此,那么每个路由器中无论是保存其他路由器的存储空间,还是计算路径所需的时间,都是极其恐怖的。 为此,我们使用简单的分治策略,把路由器组织成自治系统(Autonomous System,AS)。
自治系统通常代表一个ISP或组织,在一个AS中,所有路由器使用相同的路由策略。 有些ISP维护一个巨大的AS,而有些将其网络划分为多个AS。 每个AS由全局唯一的AS号(ASN)标识,这个序号由ICANN分配。
AS之间也有链路连接,而在AS之中和AS之间使用不同的路由选择算法,分别称为自治系统内部路由选择协议和自治系统间路由选择协议。 目前最常见的AS中和AS间协议分别为OSPF和BGP。
根据AS使用两种不同的路由选择协议是基于以下考虑:
- 策略与性能:在AS间进行路由时,我们更加关心选择AS另一个的策略,比如,一个AS可能希望其流量必须经过或必须不经过某一组AS,而不考虑这种路径选择导致的性能问题;而在AS中路由时,性能是最主要的问题,我们只希望选择性能最好的路径。
- 规模:在AS间进行路由时,我们不得不考虑互联网的巨大规模;而在AS中路由时,这种问题可以得到缓解,因为如果AS过大,组织总是可以将其拆分成多个AS。
开放最短路优先
目前常用的AS内部路由选择协议为开放最短路优先(Open Shortest Path First,OSPF)和中间系统到中间系统路由协议(Intermediate System to Intermediate System,IS-IS),分别规定在RFC 2328和RFC 1142中。 本节主要介绍OSPF协议。
OSPF是一种链路状态协议,其通过洪泛链路状态信息进行通告,并使用Dijkstra算法求解路由。 和其他LS算法一样,其每个路由器内部都要维护整个自治系统的完整路由图,并在此图上运行算法。 Dijkstra是一个单源最短路径算法,因此其可以求出从该路由器出发到所有AS内部路由器的最短路径。 这些最短路径构成了以本路由器为根节点的一棵树,称为最短路径树(这与最小生成树不同)。
在OSPF中链路的权重是由网络管理员手动配置的。 如果设定所有权重相等,那么该算法就会找出跳数最短的路径; 如果设定权重反比于容量,那么算法就会避免易拥堵的链路。
OSPF向自治系统中所有其他路由器广播路由选择信息,而非仅仅向邻居发送信息。 当相邻链路发生变化或定时器到达时间(至少30分钟一次)时,就会进行广播。 OSPF报文直接承载在IP协议之上,而不使用TCP之类的运输层协议,其协议号为89。 因此,OSPF必须自己实现可靠通信等运输层服务,此外,OSPF还需要自己确定链路的情况。
OSPF有以下优点:
- 安全:OSPF可以鉴别路由器之间的交换,阻止伪造的路由信息;
- 多路:当存在多条开销相同的路径时,OSPF可以使用所有路径进行路由;
- 多播:OSPF通过简单的拓展即可进行多播路由选择,扩展后的协议称为多播OSPF(MOSPF);
- 分区:OSPF支持对一个AS内进行分区,每个区域内使用OSPF进行路由,然后通过区域边界路由器(Area Border Router,ABR)为流向区域外的分组进行路由。分区中最重要的是主干区域(Backbone area),所有区域必须连接至主干区域,穿越区域的分组必须先发送至主干区域以防止路由环路,因此该区域包含所有区域边界路由器。
OSPF直接使用IP数据报,因此其早期版本不支持对IPv6的路由。 定义在RFC 5340中的OSPF v3才加入了对IPv6的支持。 相对地,IS-IS直接工作在连接层,因此对网络的性质不敏感。
边界网关协议
目前最常用的AS间路由选择协议为边界网关协议(Border Gateway Protocol,BGP),考虑到当下互联网的结构,这个协议可以说是最重要的协议之一。
BGP负责为AS之间的分组进行路由计算,在这种计算中,BGP并不路由到一个具体的IP地址,而是路由到一个CIDR前缀,即路由到一个子网之中。 这和我们此前介绍的转发表格式相同,其中也是使用前缀进行匹配的。
为了达成计算转发表的任务,BGP提供两项服务:
- 获得可达性信息:BGP允许每个子网向互联网的其他部分通告自己的存在,从而允许其他AS知道一个子网可达;
- 确定最优路由:收到到达某个子网的通告之后,如果存在多条到达子网的路径,BGP必须决定使用哪些路径。
值得注意的是许多家用路由器并不具有BGP的实现,因为其不需要负责AS之间的路由。
通告路由信息
对每个AS中的路由器,其要么是网关路由器(Gateway Router),即连接到其他AS中路由器的路由器,要么是内部路由器(Internal Router),即仅连接到同AS内路由器的路由器。
为了传播可达性信息,路由器使用BGP连接上的BGP会话。 在BGP中,每对路由器使用179端口上的TCP连接进行通信,这种连接(以及其上发送的所有报文)称为BGP连接。 跨越两个AS的网关路由器之间的BGP连接称为外部BGP连接(eBGP),而相同AS中任何路由器之间的连接称为内部BGP连接(iBGP)。 通常由物理链路直接连接的两个不同AS的网关路由器之间就会有一条eBGP连接; 而AS内部的路由器,两两之间都存在iBGP连接,如果由于规模过大而导致这种连接不可行,则可以使用路由反射器(Route reflector)或路由器联合(Router confederation)。 即使两者之间不存在物理链路,AS内路由选择协议允许两者建立逻辑连接。
BGP按以下规则传播通告报文: 从iBGP接收的报文仅会转发至eBGP连接; 从eBGP接收的报文既转发至iBGP连接,又会转发至eBGP连接。 从网关路由器发送至其他AS的BGP报文中会附加自己所在的AS信息,以确定路径。
BGP报文由一个前缀和多个属性组成,其中最重要的属性为AS-PATH
和NEXT-HOP
。
AS-PATH
指明了当前报文的传播路径,每当该报文被网关路由器转发至其他AS,就会在其中附上自己的AS信息;
NEXT-HOP
指明了AS-PATH
起始的路由器接口的IP地址,也就是上一个转发的网关路由器所用接口的IP地址,这个信息用来确定向哪个路由器发送被路由的分组。
AS-PATH
也用来检测并组织环路。
具体而言,如果接受报文的路由器发现自己所在的AS已经出现在该属性中,就会拒绝转发此报文。
假设存在三个互相连接的AS,即AS 1连接至AS 2,AS 2连接至AS 3,AS 3又连接至AS 1。
如果AS 3中存在一个子网x
,那么AS 3的网关路由器会向AS 2和AS 1的相邻网关路由器发送BGP报文x; AS-PATH: AS3
,以告知它们子网x
可通过AS 3路由达到。
此外,每个发送此报文的网关路由器还要将所用接口的IP地址附加在NEXT-HOP
属性中。
AS 2的网关路由器接受的这个报文后,把这个报文通过iBGP向所有同AS的路由器(包括网关和内部路由器)转发,因此所有路由器都有这条链路的信息了。
然后,AS 2到AS 1的网关路由器通过iBGP收到这个报文并通过eBGP转发至AS 1中。
转发之前其会在AS-PATH
中附加AS2
,同时修改NEXT-HOP
为自己转发所用接口的IP地址。
对AS 1,其也会收到AS 3直接发送的报文,因此所有AS 1中的路由器都知道两条到达子网x
的路径:
- 通过AS 2与AS 1相连的网关路由器到达AS 2,然后再到达AS 3;
- 通过AS 3与AS 1相连的网关路由器直接到达AS 3。
路由选择
现在我们考虑如何构造转发表。 我们先以最简单的路由选择算法,即热土豆路由选择(Hot potato,意为“烫手山芋”)开始。
正如其名暗示,热土豆路由选择把分组看作“烫手山芋”,除非自己就是目的地,否则尽快地(使用最低耗费)将分组送出自己所在的AS。 不难发现,为了尽快送出分组,我们需要使用AS内部路由选择协议。 具体而言,整个转发表的构造使用以下四步:
- 从AS间协议获取到达子网的路径信息;
- 从AS内协议获取到达其他AS中的网关路由器的链路信息;
- 利用热土豆路由选择,选择其中耗费最低的网关作为出口;
- 利用自己的转发表(由AS内协议构造)确定通往该网关的出口接口,然后填入转发表中。
在确定路由之前,路由器必须保证NEXT-HOP
中的那个网关路由器是可达的,即其已经存在与自己的路由表中。
这通常需要手动配置。
根据使用的AS内部路由选择协议,可能只需要配置网关路由器即可。
假如使用OSPF,则仅需要把NEXT-HOP
中的网关路由器加入骨干网。
也可以让收到NEXT-HOP
中的那个网关路由器在通过iBGP传播报文时将NEXT-HOP
修改为自己,这样内部路由器都会转发至同AS的网关路由器。
实际上的BGP路由选择必须考虑的策略(Policy)问题。
有些网络通常只作为流量的起点或终点,比如一个家庭或企业的内部网络,这种网络称为桩网络(Stub network)。 假设一个桩网络同时接入多个ISP,即构成多宿接入桩网络(Multi-homed stub network)。 显然,多宿接入的网络可以作为分组路由的途径,两个ISP之间的流量原则上可以经过这种网络。 但是我们并不希望如此做,首先这种网络的承载能力有限,其次可能是出于商业上或是安全上的考量。
除此之外,当两个ISP之间存在多个路径时,如果选择这些路径也是值得考虑的问题。 这些路径会经过不同的AS,这些AS可能属于不同的ISP,因此会带来商业上的问题。 目前通用的经验法则是不将流量路由到非源或目的地所在的ISP中,但两个ISP之间具体使用什么方式进行路由则更多的是一个商业问题而非技术问题。
回到BGP来,为了将策略纳入考虑,简单的路由选择算法显然是不足的,实际上,BGP依次使用以下方法确定路由:
- 使用本地偏好(Local preference)属性;
- 使用距离向量算法选择
AS-PATH
最短的路径; - 使用热土豆路由选择算法;
- 使用BGP标识符进行选择。
IP任播
BGP可用于实现IP任播。 在这种情况下,多个服务器使用相同的IP地址,而根据路由不同,从不同地点出发的流量将进入任何一个服务器之中。 由于BGP算法原则上会选择最优的路由路径,利用其实现的IP任播可以用来为不同的地理位置提供不同的内容,或是为每个用户提供速度最优的内容。
这种IP任播方式实际上用于实现DNS根服务器的镜像。 我们知道根服务器只有13个不同的IP地址,而通过IP任播,任何组织实际上都可以搭建一个DNS根服务器的镜像。
软件定义网络的控制平面
SDN体系结构具有四个关键特征:
- 基于流的转发:SDN控制的交换机可以基于运输层、网络层或链路层进行转发,称为基于流的转发。SDN控制平面负责计算和管理流表项。
- 数据与控制平面分离:SDN控制的交换机位于数据平面,而控制平面则由远端的服务器和其上的软件完成。
- 网络控制位于数据平面外部:网络控制软件运行在服务器的网络操作系统(又称SDN控制器)上,就像应用程序运行在Linux之类的操作系统上一样。这些程序概念上运行在集中的控制器上,实际上通常采用分布式的方式在多个物理机器上实现。
- 可编程的网络:正如一般的应用程序调用操作系统的接口以控制计算机一样,可编程的网络控制软件也通过由SDN控制器暴露的接口控制网络。
SDN控制平面可分为两个部分:SDN控制器和SDN网络控制应用程序。
SDN控制器按自底向上的方式分为三层:
- 通信层:又称南向接口,负责SDN控制器与受控网络设备之间的通信。
- 网络范围状态管理层:负责维护网络的状态,以便网络控制应用程序查看或修改。可能会维护一个流表的副本。
- 应用程序接口:又称北向接口,负责控制器与网络控制应用程序的交互。
OpenFlow协议运行在SDN控制器与交换机之间,充当通信层的作用。 这一协议运行在TCP上,使用的端口号为6653。 其交换的报文主要有:
- 由控制器发出的报文:
- 配置:查询并设置交换机的配置;
- 修改状态:增删改交换机流表的表项;
- 读状态:读取计数器之类的状态;
- 发送分组:让指定交换机从指定端口发送一个指定的分组。
- 由交换机发出的报文:
- 流删除:通知控制器删除一个流表项,可能是交换机自发的,也可能是作为修改状态报文的回复;
- 端口状态:通知控制器一个端口的状态发生变化;
- 分组入:有些分组可能需要发送至控制平面以进行进一步处理,此时交换机会使用分组入报文把它交给控制平面,控制平面则使用发送分组报文进行转发。
使用SDN的ISP能够非常容易地将任何路由选择算法应用于其控制的交换机上,因为控制器可以随心所欲地控制它的流表。
因特网控制报文协议
在RFC 792中定义的因特网控制报文协议(Internet Control Message Protocol,ICMP)被主机和路由器用来沟通网络层的信息。 ICMP最典型的用途就是用来进行差错报告,常见的如网络不可达之类的错误就是由它传递的。
通常把ICMP看作IP协议的一部分,但是从技术上说它是工作在IP协议之上的,因为它实际上是以IP数据报的载荷出现的。 如果ICMP报文IP数据报的载荷,那么此时IP首部的协议编码为1。
其报文由类型号、编码号和校验和等部分组成,其中最重要的时类型和编码,这两个数字指明了报文的实际意义。 常见的类型和编码如下。
ICMP类型 | 编码 | 描述 |
---|---|---|
0 | 0 | 回显回答 |
3 | 0 | 目的网络不可达 |
3 | 1 | 目的主机不可达 |
3 | 2 | 目的协议不可达 |
3 | 3 | 目的端口不可达 |
3 | 6 | 目的网络未知 |
3 | 7 | 目的主机未知 |
4 | 0 | 源抑制 |
8 | 0 | 回显请求 |
9 | 0 | 路由器通告 |
10 | 0 | 路由器发现 |
11 | 0 | TTL过期 |
12 | 0 | IP首部损坏 |
类型0和8就是ping
命令工作所用。
类型3通称目的不可达(Destination Unreachable)。
类型4是拥塞控制的一部分,但由于TCP自己的拥塞控制机制而不常用。
类型11则是traceroute
命令工作所用。
调用traceroute
命令的主机向目的主机的一个不可达端口发送TTL递增的UDP报文段。
由于TTL每次经过一个路由器就会减一,然后减到零之后就会停止转发并发送ICMP报文,把接收到的11类ICMP报文的发送IP顺序结合在一起就构成了路由链路。
而到达目的主机后,由于端口不可达,主机就会发送类型3的报文,因此可以区别路由器和目的主机。
RFC 4443中为IPv6定义了ICMP的新版本,其中包含一个分组太大报文。 我们知道IPv6不在路由器上提供分片,因此分组太大报文用来指示源进行分片。