关于网络的一次推演(续)

本文用一个连续的思路对网络做了推演,为上一篇文章的延续。旨在最终解构复杂网络架构。包含:RIP、OSPF、EIGRP、BGP和常用的数据中心网络架构等。上一篇文章详见《关于网络的一次推演》

1 需要先了解的知识

1.1 通用数据包格式

1.2 二层协议的数据格式

1.2.1 多对多局域网

1.2.2 一对一局域网

1.3 三层封装的数据格式

1.4 四层封装的数据格式

1.5 其他常用协议数据包格式

1.5.1 VXLAN

2 关于网络的一次推演

2.1 两台主机互联

2.2 多台主机互联

2.2.1 总线型(bus)拓扑

2.2.2 环型(ring)拓扑

2.2.3 多互联(mesh)拓扑

2.3 多主机互联最通用的星型(star)拓扑

2.3.1 环型拓扑的优缺点

2.3.2 多互联拓扑的优缺点

2.3.3 星型拓扑

2.4 多主机互联-使用集线器

2.5 多主机互联-使用交换机

2.5.1 二层地址缓存

2.5.2 网络隔离

2.6 两台交换机互联

2.6.1 两台交换机-使用vlan

2.6.2 两台交换机-简化结构

2.6.3 两台交换机-链路捆绑

2.7 多交换机互联

2.8 多交换机互联-星型拓扑

2.9 多交换机互联-转化成树型拓扑

2.9.1 Dijkstra/Prim算法

2.9.2 生成树协议(STP)

2.9.3 生成树协议相关链接

2.10 多交换机互联-选路

2.10.1 数据包可不可以原路返回?

2.10.2 二层数据环路是如何产生的?

2.10.3 如何避免数据环路?

2.10.4 二层选路为什么不用静态规则?

2.10.5 二层选路为什么不用动态生成的规则?

2.10.6 二层选路为何不再培养一个情报头子?

2.10.7 存在多路径时,二层能不能多路径做负载?

2.10.8 二层通用的组网和选路

2.11 接入、汇聚、核心三层网络架构

---------------------------------------------------------------分割线---------------------------------------------------------------------------

2.12 多交换机互联-使用路由器

2.12.1 二层网络的局限性

前面有提到,二层交换机在有对应mac地址表项的时候从特定接口发出数据包,在没有对应表项的时候则泛洪。而泛洪有可能会带来的环路,所以一般(多互联型拓扑)会引入生成树。

随着网络规模的逐渐庞大,这种纯二层的组网方式会存在一定的局限性。这种局限性主要来自于二层地址的不易汇总和交换机二层地址缓存的数目有限。

二层地址不易汇总

mac地址本身可以看成一个48位的无符号数(ip地址则是32位无符号数),为了人工易读,一般会写成“xx-xx-xx-xx-xx-xx”、“xxxx-xxxx-xxxx”、“xxxxxxxx”这三种形式的十六进制字符串中的一种(有时候也会使用冒号),字符串形式和int形式的mac地址的互转可以用以下python代码实现。

#encoding=utf-8

def int2Mac(num, kind="0"):
    """int数转为mac地址"""
    a,b,c,d,e,f = (num>>40)&0xff, (num>>32)&0xff, (num>>24)&0xff, (num>>16)&0xff, (num>>8)&0xff, num&0xff,
    trans = lambda s:hex(s).replace("0x",'')
    if kind == "0":
        return "{}{}{}{}{}{}".format(trans(a),trans(b),trans(c),trans(d),trans(e),trans(f))
    elif kind == "3-":
        return "{}{}-{}{}-{}{}".format(trans(a), trans(b), trans(c), trans(d), trans(e), trans(f))
    elif kind == "3:":
        return "{}{}:{}{}:{}{}".format(trans(a), trans(b), trans(c), trans(d), trans(e), trans(f))
    elif kind == "6-":
        return "{}-{}-{}-{}-{}-{}".format(trans(a), trans(b), trans(c), trans(d), trans(e), trans(f))
    elif kind == "6:":
        return "{}:{}:{}:{}:{}:{}".format(trans(a), trans(b), trans(c), trans(d), trans(e), trans(f))

def mac2Int(s):
    """mac地址转化为int数"""
    s = s.replace("-","").replace(":","")
    return int(s,16)

假如我们要汇总mac地址,我可以采取前缀相同汇总或后缀相同汇总,通常地我们使用前缀相同汇总。比如说“aa-bb-cc-dd-e1”到“aa-bb-cc-dd-ef”我们可以汇总成“aa-bb-cc-dd-e”,“”代表后面是任意十六进制字符(1,2,3,4,5,6,7,8,9,a,b,c,d,ef)。通过类似的操作我们可以将连续的mac地址可以汇总成更大的连续mac地址,后面的ip地址汇总也是这个思路,区别在于引入了掩码,可以参考笔者的另一篇文章《防火墙自动化(一) 防火墙的配置解析》的2.2.3节以及后面的地址汇总节。但由于历史原因,我们很难在一个局域网找到一整片连续的mac地址,大多数都是离散的没办法做汇总,这导致了二层交换机的mac地址表只能实打实地一个mac一条表项。

单交换机二层地址缓存数目有限

二层网络中,越是核心的交换二层地址缓存越多,但单台交换机的二层地址缓存不可能无限上涨,mac地址表肯定要有数量限制。这个数量限制大概是什么量级呢?下面的内容可以作为参考。在现代数据中心中,一般中端型号交换机的最大mac地址表条目约在50K-100K条,比如Cisco Nexus 9364C的最大mac地址数约为92K;高端型号交换机的最大mac地址表条目约在500K-600K,比如说Juniper QFX10002-72Q的最大mac地址数约为512K。还有一些内部用CLOS架构交换矩阵、能插8/16张线卡的“怪物”交换机,比如Cisco Nexus 9508、Juniper QFX10008、Juniper QFX10016,其中 Nexus 9508单张线卡就能支撑750K条mac地址,QFX10008单张线卡能支持多达1000K的mac地址。汇总内容如下表,其中参考价格信息来自于此链接,实际购买价格以供应商提供的为准。

2.12.2 路由器如何摆除上述局限性

路由器是在交换机的基础上新引入的一种设备,主要功能就是根据三层首部中的目的ip地址进行数据包转发,而非根据二层首部中的目的mac地址进行转发。如下图所示,不同层级转发使用到的字段不同。

路由器可以分为两种,一种是需要对接二层交换机的,姑且称之为边缘路由器,另一种则是不需要对接二层交换机的,姑且称之为非边缘路由器。对于非边缘路由器来说,数据包可以完全依靠三层转发,二层的mac地址它完全可以不用理会,所以有时会使用ppp格式而非以太网格式(不需要源目mac)。但是对于边缘路由器来说,由于它连接了二层交换机,而二层交换机又只看二层首部,所以它是处在二三层边缘的组件。此时路由器则必须承担起建立三层到二层的映射职责,它依靠目IP地址到目mac地址的映射(arp表),确保自己的数据包发送到二层网络也能被顺利转发。

路由器使用路由表(routing table)或称路由择域信息库(RIB, Routing Information Base)进行转发。路由表的表项一般称之为路由,用于指明数据包该往哪个接口或对端ip发,当没有路由的时候,不同于二层网络的泛洪,路由表引入了默认路由,会往默认路由对应的接口单独发送数据包。二层转发使用的mac地址表,和三层转二层使用的arp表,三层转发使用的路由表通常包含的表项如下图所示。关于如何建立APR表可参看ARP协议

以上是路由器的一些基础功能说明,具体是怎么摆脱2.12.1中的局限性的呢?下面是对应的改进。

使用容易汇总的三层地址来解决二层地址不易汇总

如下图2.12.2-4所示,局域网1和局域网2都使用了接入汇聚核心三层架构进行组网,在此之上使用了一台路由器A连接了两个局域网的核心交换机1和2。局域网1中的主机(未画出)使用了10.10.0.0/16中的ip地址,局域网2中的主机使用了10.11.0.0/16中的ip地址。

在图2.12.2-4中,路由器相当于图2.12.2-2的边缘路由器,处理数据包时,会先通过目的IP地址确定往哪边发,然后查arp表修改二层首部,最后将数据包发到对应的核心交换机上。在处理三层转发时,我们只需要 “10.10.0.0/16往核心交换机1发”,“10.11.0.0/16往核心交换机2发”这样下两条静态规则(静态路由),就可以实现数据包的正确发送。二层转发里成千上万条规则(mac地址表项),在三层用两条汇总的静态规则即可等效完成。当然,这两条静态规则还需要其他东西做支撑,需要建立在成千上万条arp表项的基础上,但幸运的是,只有边缘路由器才会有这么多arp表项,如果上图中还有其他路由器,非边缘路由器上是没有或只有少量arp表项的,写两条静态规则即可。通过给不同的局域网规划分配连续的三层地址,我们就能在路由器上以汇总的三层地址进行规则编写,实现规则规模的最小化。(注:此节的图的“全部”是不太严谨的说法,全部是理论可能拥有的范围,但大多数时候并非全部)

多路由器分布式分担职责来解决单交换机二层地址缓存数目有限

假设我们现在使用Juniper QFX10002作为核心交换机,并使用三层架构组网。假设我们总共有1000k台主机/虚拟机,现在一台QFX10002总共能支撑512K的mac地址表,是不是就要分成两个局域网呢?分成两个局域网之后又通过什么来连接?如果使用单台二层交换机连接,那么这个二层交换机的mac地址容量就要超过1000K;如果使用单台路由器连接,那就需要路由器的arp表容量要超过1000K;不然就有可能引起严重的全网广播或泛洪。此时尚有这种容量的设备,比如CLOS架构的交换机尚可满足1000K条mac地址表的需求,只不过价格有些昂贵,但如果我们再扩大点范围呢?比如说整个中国的主机,如果我们想让它们可以通信,有没有一台可以缓存这么多mac地址(或arp表)的二层交换机(或路由器)呢?答案是目前没有。所以一台设备作为核心的方式是行不通的,得有多台设备。对于二层交换机来说,永远是越核心的节点mac地址表越多,mac地址表不会分布式存储;而对于路由器来说,只有边缘路由器会有大量arp表,且边缘路由器只有直连的局域网的arp表,arp表项被分布式存储在每一个边缘路由器上。那么,我们可以利用多台路由器来分担核心节点的职责。如下图所示。

在图2.12.2-5中,路由器A,B上分别有关于局域网1,2的arp表。图2.12.2-4的路由器A的arp表在这里分布式存储在了不同的路由器A,B上,每台边缘路由器都只有一部分arp表项,这样就避免了类似于二层地址缓存数目有限的问题。

2.12.3 两数据中心相连的一般结构

实际环境下,一般不会直接使用二层交换机作为核心交换机,取而代之的是三层交换机。三层交换机是同时具有二层转发和三层转发功能的组件,一般用于二三层网络的边缘。既可以看成路由器,当跑路由协议时;又可以看成二层交换机,当跑STP时。那么如何去通俗地理解三层交换机呢?打个比方:

将两个局域网看成旺角的两个“社团”,两个“社团”老大(核心交换机)因为“战争血统”(STP协议),一碰面就要一决雌雄,分出谁是真正的老大(根交换机),所以没办法直接碰面,后面他俩分别找了一个律师(路由器),传递信息全靠律师,用律法知识(三层)进行沟通,这样既不会打起来也可以正常传递信息。后面两个“社团”老大为了省钱(减少开销),嫌找律师麻烦,自学了律法知识,从此“老大”之间可以直接用律法知识沟通,压抑住了“战争血统”,变成了会讲法律的老大(三层交换机)。再往后,大部分交换机(社团成员)都学了律法知识,虽然不一定用得到,但都拥有了当律政先锋+老大的潜质(大部分现代交换机都实装了三层功能),可以选择性使用某些功能。

使用三层交换机,我们可以将图2.12.2-5简化成下图。

一个简化拓扑的方法

在路由器的视角里,每一个接口都对应着一个局域网,即使这个接口接的是一条直接到其他路由器的直连线。反过来说,不管路由器与路由器之间接了多少二层交换机,都可以近似将这些二层交换机看作直连线。在后面的推演中,我们都可能会用到类似的方法化简掉路由器网络中的某些交换机。

一般结构-使用裸光纤连接两个数据中心

企业内部的两个数据中心,如果经费允许的话,可以使用裸光纤进行互联。使用裸光纤时,一般需要用到DWDM设备做光信号的波分复用,DWDN设备和之间的裸光纤可以看成一条直连线。DWDM设备一般可以直接连到核心三层交换机上,但也有时候会在核心与DWDM之间加一台二层交换机,这是因为DWDM接口速率一般只有10Gbps,高级一点的用作核心的三层交换机的接口都是40Gbps,两者的接口速率不匹配,所以拿了一台有40Gbps上连和10Gbps下连接口的交换机作为中介。

由于路由器之间的交换机可以近似看成直连线,DMDM设备和裸光纤也可以看成直连线,所以下图实际上和图2.12.3-1中的两台三层交换机直连是等效的。

一般结构-使用普通专线连接两个数据中心

而裸光纤的价格比较昂贵,一般只用于部分要求超低时延的机房之间,大多数机房都是通过普通的专线互联起来的。无论是走企业专线还是互联网专线,无论是MSTP、SDH、MPLS VPN、ATM、DDN,还是CN2线路,中间都有可能经过大量的交换路由设备,经过化简可以得到下图。上面的两个路由器为运营商的路由器,它们不需要大量的arp表项,可以专心跑三层转发,在此图中局域网1,2的arp表止于两台三层交换机。通常地,我们还会在核心三层交换机和运营商路由器之间多加一台路由器,不会让运营商路由器直连到核心三层交换机。(注:其实专线直接跑三层转发的概率不大,到了运营商内部更有可能使用的是MPLS或帧中继这样的标签转发,但这里为了说明这种情况直接简化掉了)

 

2.13 多路由器互联-拓扑和接口网络类型

仿照2.2节、2.3节和2.7节、2.8节的内容,我们可以得出多路由器互联的一般拓扑。基础的拓扑仍为mesh、ring和bus,其中ring现在一般不会被使用,原因同2.3.1节内容;bus一般不会直接存在在现代网络中,而是衍生出star拓扑。star拓扑可以以不同的元件作为中心,从而区分出一系列的路由器接口网络类型。

对于mesh或以路由器为中心的star拓扑,对于任意路由器接入网络的接口,发送的数据包只能抵达一台路由器,这种接口网络类型被称为Point-to-Point(P2P)

对于bus或以以太网交换机(或集线器)为中心的star拓扑,对于任意路由器接入网络的接口,发送的数据包都会抵达其他所有路由器,这种接口网络类型被称为Multi Access(MA)或者Broardcast。(注:①10M以太网用的CSMA/CD中的MA和这个MA是同一个意思。 ②交换机在没有二层地址缓存前收到数据会发给其他所有的接口,所以此处中心使用以太网交换机也算MA网络。)

对于以帧中继交换机为中心的star拓扑,对于任意路由器接入网络的接口,发送数据的包可以抵达其他所有路由器,但可以抵达不意味着会往所有路由器发,这种接口网络类型被称为NonBroadcast Multi Access(NBMA)。特殊地,当我们将帧中继网络配置成HUB-SPOKE时,HUB路由器的接口网络类型为Point-to-MultiPoint(P2MP),SPOKE路由器的接口网络类型为Point-to-MultiPoint NonBoardcast(P2MP NB)。帧中继技术常用于广域网,简单介绍可参考此链接.

下面的OSPF协议将会用到这5种路由器接口网络类型进行流量优化。

2.14 多路由器互联-选路

默认不使用帧中继交换机的情况下,让我们回到2.10,查阅多交换机互联是如何一步步确定选路的,仿照交换机的思路,继续将我们的路由器看成驿站,为了让驿站能够传递情报,我们仍然有四种方法可以备选。如下:

  • 泛洪。
  • 静态规则。
  • 动态生成的规则。
  • 在2的基础上再培养一个副情报头子
    其中,泛洪已经被默认路由取代,应该不会再使用了;静态规则和动态规则,在二层中受限于mac地址的不易汇总故未被使用,但2.12.2节中已经说明了路由器是使用ip地址进行转发的,所以这两种思路都可以使用且已经被使用在了路由器上;再培养一个副情报头子属于SDN的范畴,在2.10中有说明,不在本次推演的范围内。

在路由器中,静态规则包含静态路由和策略路由两种,由人工配置指定;动态规则被称为动态路由,通过动态路由协议生成。

2.14.1 静态路由

简单不讲,重点了解一下静态路由的配置和浮动路由的配置即可。

2.14.2 策略路由

一般会配合BGP路由的各种团体属性使用,属于高级的静态路由,读者可以自行了解。

2.14.3 动态路由协议

具体设备上的策略路由/静态路由/动态路由的配置方法,读者可以自行根据厂商品牌自行搜索,我们这里仅关各种动态路由协议的共性和特性。

  • 数据包往哪儿发?
  • 路由器如何度量远近?
  • 能不能同时走多路径?
  • 多路径时优先走哪一条?
  • 如何优化协议的流量?
  • 多种路由协议产生的路由优选哪条?

这里我们可以先回答“多种路由协议产生的路由优选哪条?”,答案是管理距离。通过给不用路由协议产生的路由赋予管理距离这一优先级,管理距离最小的路由将被采用。常用管理距离如下。

动态路由协议一般分为距离向量协议和链路状态协议,两种协议并非泾渭分明,往往有着许多的相似性,特别是后面发展的协议,往往会两种协议的长处都会借鉴。下面的2.15和2.16讲分别讨论这两种协议。

2.15 多路由器互联-距离向量协议

距离向量协议是使用距离向量算法进行路由选路的协议。距离向量算法则是以R.E.Bellman,L.R.Ford和D.R.Fulkerson所做的工作为基础的,称为Bellman-Ford或者Ford-Fulkerson算法。距离矢量名称的由来是因为路由是以矢量(距离,方向)的方式被通告出去的。

下面是到目前为止发展的基本距离向量算法的一般规则(RIP、EIGRP、BGP都适用)。每个参与路由协议的节点都要执行以下过程:

  • 每个节点为每个可能的目的地保留至少一个表项。该表项包含到目的地的距离D,以及到达该网络的下一个路由器G。(注:此表项非路由表项)
  • 定期向每个邻居发送路由更新报文。更新是一组消息,包含来自路由表的所有信息。它包含每个目的地的条目,并显示到该目的地的距离。
  • 当从邻居G '收到路由更新时,添加与G '共享的网络相关的开销。开销在这里是自己到上一条的距离,距离可以用多种方式来衡量,最简单的是跳数,复杂的则需要转发延迟、吞吐量等多个指标加权计算得出。

以下图为例,对上述过程进行说明。如图所示,10.1.1.0/24网段连在路由器A上。初始时,B、C、D三台路由器是不知道如何转发目的地址为10.1.1.0/24的数据包的,需要通过距离向量算法从A处获取到目的为10.1.1.0/24的路由。这个过程是这样的:A发送路由更新报文到C、D,通告自己到10.1.1.0/24的距离是0;C收到A的更新报文后会更新距离并往B、D转发更新报文,通告自己到10.1.1.0/24的距离是0+a;B收到A的更新报文后会更新距离并往C、D转发更新,通告自己到10.1.1.0/24的距离是0+b;每台路由器都会重复这样“收到更新后,更新距离往其他所有路由器转发更新,同时保留这些距离信息表项”的操作,最终用这些距离信息表项可以用来生成路由表项。

但这样的距离向量算法并不完善,要使这种算法能投入使用,最紧要解决的是,上图中距离表项,特别是红色方框圈起来的表项,所对应的相关问题:

  • 为一个目的保留多少个条距离信息表项?
  • 需不需要经过某个节点多次的距离信息表项?
  • 如何知道收到的更新(距离信息)有没有多次经过某节点?
  • 如何保证收到的更新(距离信息)没有多次经过某节点?

除此之外,还需要完善更多的细节:

  • 每条距离信息表项的有效期一般是多久?
  • 定期更新对应一般选择多长的时间间隔?
  • 是否一定要定期更新,可否其他方式如触发更新?
  • 可以使用哪些指标来衡量距离,怎样计算距离?
  • 流量能否做负载均衡?如何做负载均衡?
  • 使用怎样格式的数据包来承载上述指标、过程?

下面是其中一部分问题的讲解。

2.15.1 为一个目的保留多少个条距离信息表项?

不同的距离向量协议为某个目的保留的距离信息表项数量是不同的。对于RIP来说,这个数量为1;对于EIGRP来说,这个数量是可行中继(FS,feasiable successor)的数量;对于BGP来说,则是收到的全部的数量。

在RIP的处理中,路由器只记住迄今为止看到的最好的metric,以及发送它的邻居的身份。每当他们看到更好(更小)的metric时,他们就替换这些信息。这使得它们可以增量地计算最小值,而不必存储所有邻居的数据。这样使得拓扑变动或路由变动时,需要发送路由更新到整个路由器网络,使得每一条路由器都做出相应的变化,这导致收敛时间会比较长。

在EIGRP的处理中,路由器除了记住看到的最好的metric,还会记下“次优”的metric。这个次优的metric来自可行中继(后面讲可行中继如何判定)。路由器会用最小metric的距离信息表项生成路由表项,当这条最小metric值的路径出现故障时,路由器会立刻切到“次优”metric的路径,收敛范围会相对较小,大部分时间并不需要整个网络参与,收敛速度较快。

在BGP中,路由器会记住所有metric,也就是收到的全部的距离信息表项。但是这里的metric改换成了另一种形式,变成了多条判断条件,但本质上还是metric,后面会进行说明。

2.15.2 需不需要经过某个节点多次的距离信息表项?

经过某个节点多次,证明这个路由路径中必定出现了环路。环路在网络中是不可接受的,一个路由更新(距离表项)完全可能在环路的堆积下,使得metric不断累加直至趋近于无穷大,虽然这种路由更新不会被接受,但仍会造成两个问题:

  • 数据环路中不断循环的路由更新,在传输路径中不断累积,占用带宽
  • metric实际不能无限增大,因为代码实现时metric所占的bit数一般是固定的。当metric达到某个值时是会数值溢出的,变成负数(int)或0(uint),至使算法整体发生错误。
    所以,我们不需要经过某个节点多次的距离信息表项,在一个距离信息表项中,每个节点最多只能经过一次。

2.15.3 如何知道收到的更新报文(距离信息)有没有多次经过某节点?

我们很难知道这一点,除非我们在更新包中将每一个经过的节点都记录下来,不然我们没办法得知收到的更新包是否有没有多次经过某个节点。这个可以类比成寄信,如果没有没有在信封上写上经过的每一个邮局的名字,我们怎么知道这封信是经过哪些邮局寄过来的,中间有没有在两个邮局之间打转过呢?

所以除了在更新报文中记录经过的节点,我们一般不知道更新报文有没有经过多次经过某节点

2.15.4 如何保证收到的更新包(距离信息)没有多次经过某节点?

如何保证收到的更新报文没有多次经过某节点,本质上就是防止环路。

最直观的方法就是在更新报文上直接就可以看出有没有环路,这就要用到2.14.2.3中提到的。

  • 携带路径信息。每经过某个节点,就添加一条关于该节点的记录。这个方法好用是好用,但是跳数一上去,报文就变得很庞大了,所以即使使用,也不会记录每个节点,只会记录更有限的信息,比如BGP的as-path记录的是经过的as号。

其他的方法在2.10.3节中有总结,我们在这里列出与距离向量协议有关的部分,并补充一部分说明:

  • 设定最大跳数。在数据包ip首部设定某个TTL值,每经过一个节点TTL-1,当TTL=0时,数据包自然被丢弃。这个方法可以有效防止数据包的无限循环,但是并没有阻止环路的发生,只是提前结束了循环,并且使得网络规模不得不受限于TTL值。
  • 水平分割。从一个接口接收到的更新,不会从这个接口发出去,这是最基础的防环策略,从二层到三层都会有应用。
  • 不转发更新。只要节点收到更新报文后不转发,就肯定不会出现经过某个节点多次的情况,因为在第一跳就停止转发了,这是一个非常严格的防环设定,一经正确采用配合上面的水平分割必定无环,但这个需要建立源节点到目节点只有物理或逻辑的一跳的基础上(full-mesh组网)。比如在BGP中,从一个IBGP邻居接收到的不会发给另一个IBGP邻居。注:很多资料将BGP的此特性也称之为水平分割,但笔者查阅了BGP对应的标准文档RFC 4271,没有看到split horizon相关的字眼,所以暂不将之归类到水平分割。
  • 划分区域。网络规模很大时,可能会面临节点的信息不一致的问题,可能有些节点没有收到合适的信息。所以会将完整的大的网络划分成更小的单位-区域,以缩小网络范围。区域里内部仍执行对应的协议规则,区域之间则各自作为一个完整实体执行与前者略有差异的规则,如BGP的AS内执行IBGP,AS之间执行EBGP。

2.15.5 每条距离信息表项的有效期一般是多久?

不同协议的实现细节不同,读者可以自行去查阅,一般由一个叫做失效计时器或类似的计时器进行控制,在RIP这个时间是180s,经过这个时间没收到更新报文会导致路由失效。

2.15.6 定期更新对应一般选择多长的时间间隔?

不同协议的实现细节不同,有的协议甚至不采取定期更新的形式,一般由叫做更新计时器的进行控制,在RIP中这个时间是30s,经过这个时间会自动发送路由更新。

2.15.7 是否一定要定期更新,可否其他方式如触发更新?

不一定,实际上所有距离向量协议在实现的时候都实现了定期更新和触发更新。触发更新用于网络发生变化时,主动发起对应的更新包,通告其他的路由器网络已经发生了变化,以实现更快的收敛。实际上当路由器的一条路由表项失效但是其它路由器的失效计时器没有到期时,很有可能导致网络产生环路,如下图所示。

所以触发更新也有防止环路的作用,因为这种方式可以主动通告其他路由器某条路由器已经失效,而非等待失效定时器到期后才发现路由失效,从而有效防止路由失效期间产生的环路。在RIP中管这种方式叫做路由中毒和毒性逆转

2.15.8 可以使用哪些指标来衡量距离,怎样计算距离?

衡量距离的指标有很多,网络跳数,带宽,延迟,负载,可靠性,MTU,权重,本地优先级,起源属性...,这些都可以用来衡量距离。常见距离向量协议的使用的距离指标如下:

常见距离向量协议的metric值计算如下,一般理解成加权计算即可。公式的具体含义可以后续自行去了解。其中BGP仅为一个笔者提供的类似的公式,实际上BGP并不会直接用上面的指标计算出一个metric值,然后比较大小进行选路,而是将之拆分成了11(或13)条从上而下的判断条件,当前一个判断条件可以衡量出metric的好坏时,就不会再进行后面的判断。我们也可以设计一个加权公式来进行计算metric,前一个判断条件诚乘以一个大量级的权重,后一个判断条件乘以一个小量级的权重,计算时前一个判断条件具有决定性的量级地位,这个过程类似于微分中的当Δx->0时,Δx+Δx^2+Δx^3可以忽略后面的Δx^2+Δx^3,化简成Δx一样。

下面是brid实现的BGP协议中,衡量两个BGP路由表项优劣的函数,里面就用到了上面提到的11种判断条件(BGP称之为选路原则),供读者参考和理解。

/*rte=route table entry,这个函数输入两个路由表项或距离表项 */
int bgp_rte_mergable(rte *pri, rte *sec)
{
  struct bgp_proto *pri_bgp = (struct bgp_proto *) pri->attrs->src->proto;
  struct bgp_proto *sec_bgp = (struct bgp_proto *) sec->attrs->src->proto;
  eattr *x, *y;
  u32 p, s;

  /* Skip suppressed routes (see bgp_rte_recalculate()) */
  if (pri->u.bgp.suppressed != sec->u.bgp.suppressed)
    return 0;

  /* RFC 4271 9.1.2.1. Route resolvability test */
  if (rte_resolvable(pri) != rte_resolvable(sec))
    return 0;

  /* LLGR draft - depreference stale routes */
  if (rte_stale(pri) != rte_stale(sec))
    return 0;

  /* Start with local preferences 本地优先级*/
  x = ea_find(pri->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_LOCAL_PREF));
  y = ea_find(sec->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_LOCAL_PREF));
  p = x ? x->u.data : pri_bgp->cf->default_local_pref;
  s = y ? y->u.data : sec_bgp->cf->default_local_pref;
  if (p != s)
    return 0;

  /* RFC 4271 9.1.2.2. a)  Use AS path lengths  AS-PATH*/
  if (pri_bgp->cf->compare_path_lengths || sec_bgp->cf->compare_path_lengths)
  {
    x = ea_find(pri->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_AS_PATH));
    y = ea_find(sec->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_AS_PATH));
    p = x ? as_path_getlen(x->u.ptr) : AS_PATH_MAXLEN;
    s = y ? as_path_getlen(y->u.ptr) : AS_PATH_MAXLEN;

    if (p != s)
      return 0;

//    if (DELTA(p, s) > pri_bgp->cf->relax_multipath)
//      return 0;
  }

  /* RFC 4271 9.1.2.2. b) Use origins 起源属性*/
  x = ea_find(pri->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_ORIGIN));
  y = ea_find(sec->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_ORIGIN));
  p = x ? x->u.data : ORIGIN_INCOMPLETE;
  s = y ? y->u.data : ORIGIN_INCOMPLETE;
  if (p != s)
    return 0;

  /* RFC 4271 9.1.2.2. c) Compare MED's MED */
  if (pri_bgp->cf->med_metric || sec_bgp->cf->med_metric ||
      (bgp_get_neighbor(pri) == bgp_get_neighbor(sec)))
  {
    x = ea_find(pri->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_MULTI_EXIT_DISC));
    y = ea_find(sec->attrs->eattrs, EA_CODE(PROTOCOL_BGP, BA_MULTI_EXIT_DISC));
    p = x ? x->u.data : pri_bgp->cf->default_med;
    s = y ? y->u.data : sec_bgp->cf->default_med;
    if (p != s)
      return 0;
  }

  /* RFC 4271 9.1.2.2. d) Prefer external peers  EBGP优于IBGP*/
  if (pri_bgp->is_interior != sec_bgp->is_interior)
    return 0;

  /* RFC 4271 9.1.2.2. e) Compare IGP metrics */
  p = pri_bgp->cf->igp_metric ? pri->attrs->igp_metric : 0;
  s = sec_bgp->cf->igp_metric ? sec->attrs->igp_metric : 0;
  if (p != s)
    return 0;

  /* Remaining criteria are ignored */

  return 1;
}

2.16 多路由器互联-链路状态协议

链路状态路由选择协议又称为最短路径优先协议或分布式数据库协议,它基于Edsger Dijkstra的最短路径优先(SPF)算法。链路状态协议从网络或者网络的限定区域内的所有其他路由器处收集信息,最终每个链路状态路由器上都有一个相同的全局拓扑信息,并且每台路由器都可以独立的计算各自的最优路径。下面是到目前为止发展的基本链路状态算法的一般规则。每个参与路由协议的节点都要执行以下过程:

  • 收集邻居信息和链路状态信息。每个节点需要了解附近有哪些邻居节点,同时将这些信息作为链路状态信息的一部分通告出去,链路状态信息很大一部分的作用是建立全局的拓扑,利用这个全局拓扑能快速计算出对应的路径。
  • 独立计算最短路径树并生成路由。利用Dijkstra算法和已经收集好的链路状态信息,可以快速计算出最短转发路径树,从而为每一个目的地寻找到最短的转发路径,最后生成用于转发路由条目。

以下图为例,对上述过程进行说明。如图所示,10.1.1.0/24网段连在路由器A上。初始时,B、C、D三台路由器是不知道如何转发目的地址为10.1.1.0/24的数据包的,需要通过链路状态协议从A处获取到目的为10.1.1.0/24的路由。这个过程是这样的:每个节点独立地将自己的邻居节点记录到邻居表(可以用lldp协议实现),然后各自发送信息通告自己的邻居表项,每个节点拿到其他节点的邻居表后可以拼成完整的拓扑信息-链路状态信息表(学过数据结构的同学请自行回忆图的数据结构是否就是图里的链路状态信息表这样),接着,以这个完整的拓扑信息,运行Dijkstra's SPF算法,生成最短路径树,最终实现的效果是每个节点到10.1.1.0/24都按最短路径转发。

让我们仿照上面的距离向量算法,提出一些问题并完善一些细节。

  • 如何保证计算出的最终路径没有多次经过某节点?
  • 可以使用哪些指标来衡量距离,怎样计算距离?

2.16.1 如何保证计算出的最终路径没有多次经过某节点?

不同于距离向量协议,链路状态协议计算路由的时候,是拥有全局拓扑信息的,利用这个拓扑信息以及Dijkstra's SPF算法(本文2.9.1节)是可以很轻松地计算出一条无环的路径的,所以链路状态协议在算法上就避免了环路的发生。下面是链路状态协议的防环方法,部分2.10.3节已经给出。

  • 划分区域。同2.15.4节中的划分区域。
  • 以区域为单位建立树。如OSPF协议划分了多个area,不同area之间的互访都需要经过area 0,所有区域形成了一棵树,树根是area 0,其他区域都是树叶,区域之间也是无环的。
  • 建立以自己为树根的树。每个节点都以自己为树根计算出一棵树,而且一般是最短路径树。每个节点转发数据时,都会根据这棵树进行转发,即算法防环。

2.16.2 可以使用哪些指标来衡量距离,怎样计算距离?

在链路状态协议中,也有距离这个概念,只不过大部分时候大家都将之称之为开销(cost)。大致同2.15.8节是一致的,此处列出OSPF的开销计算方式:cost=带宽参考值/接口带宽。其中,带宽参考值是可以配置的,缺省值为100M。

2.17 多路由器互联-常见动态路由协议

2.17.1 RIP协议

RIP(Routing Information Protocol,路由信息协议)是使用最久的协议之一。2.15讨论的内容基本上就涵盖了RIP的各个方面,RIP算是基础款的距离向量协议,没有什么更多的特殊的东西需要提及,具体的配置方法网上有很多,本文暂不提及,详细的协议细节可以参考RFC2352。RIP协议工作在运输层,使用的是UDP的520端口,下面是RIP协议的一般报文格式。

2.17.2 EIGRP协议

EIGRP(Enhanced Interior Gateway Routing Protocol) 即 增强内部网关路由协议,是Cisco公司的私有协议(2013年已经公有化)。

EIGRP类似于RIP,但报文格式会复杂很多,所以本文暂不列出报文格式,具体的协议细节可以参考RFC7868。其相较于RIP来说最大的改变是它寻找出了一个充分条件,只要满足这个条件可以保证“次优路径”无环。基于这个充分条件,才发展出后面所谓“快速收敛”,“优雅关闭”等特性,所以我们先在这里介绍一下这个充分条件,再来来证明一下这个充分条件。

对于某个节点P来说,如果访问一个目标网络,有多个下一跳节点Pn(P1,P2,P3...),P到Pn的最短距离为Sn(S1,S2,S3...),下一跳节点到目标网络的最短距离为S'n(S'1,S'2,S'3...),记最短路径min({Sn+S'n|n=下一跳节点数})为Smin。如果满足S'n<Smin,则经过下一跳节点Pn到目标网络的路径是无环的

为了证明:$S'<Smin$ => “经过Pn到目标网络的路径是无环的”。下面构造了3个包含环路的特殊场景,都是想从B访问到A上的10.1.1.0/24网段,数据包一旦抵达A就不会再转发到其他路由器。下面的讲解中,*n代表重复了n次。

① B有上有一条到自身的环路。B->10.1.10.0/24,可以有2种路径B->A或(B->B)*n->A。(1) 当按B->A转发时,下一跳Pn为A,S'n = 0 , Smin = a,S'n <Smin = a,此时Pn到10.1.1.0/24确实无环;(2) 当按(B->B)*n->A转发时,仅讨论n=1的情况,Pn=B,S'n = a+b , Smin = a , 因距离一般不为负,所以a>0且b>0,a+b>a,S'n > Smin , 而此时存在环路。

② B有上有一条到自身的环路,且这条环路上还有一个中间节点C。B->10.1.10.0/24,可以有2种路径B->A或(B->C->B)*n->A。(1) 按B->A转发时,同① ;(2) 当按(B->C->B)*n->A转发时,仅讨论n=1的情况,Pn=C,S'n = a+b , Sn = a , S'n > Sn , 而此时存在环路。

③ B有上有一条到自身的环路,且这条环路上有一个中间节点C,且C还有其他路径到达A。B->10.1.10.0/24,可以有

5种路径:B->A 、B-c->C->A、B-b->C->A、(B-b/c->C-b/c->B)*n ->A、(B-b/c->C)*n -> A。使用上面类似的方式逐个讨论,但都可以得到 S'n < Sn时,经过下一跳节点Pn到目标网络的路径是无环的,此处便不逐个给出计算结果了。

通过讨论和归纳,我们确实可以得出,如果满足S'n<Smin,则经过下一跳节点Pn到目标网络的路径是无环的。但S'n< Smin是一个充分条件,即“下一跳节点Pn到目标网络的路径是无环的”并不能回推出"S'n< Smin",所以使用这个充分条件有时会漏掉一些没有环路的路径和下一跳节点。

2.15.1节提到的EIGRP会保存多个距离表项,就是利用"S'n< Smin"筛选出的这些距离表项。利用这个,EIGRP收敛的时候只需要局部收敛,当最优的路径挂掉的时候,因为已经保存了次优路径的信息,立刻就可以切到次优的无环路径,不需要将这个信息发送到所有路由器进行收敛,所以收敛速度会很快。同时所谓的优雅关闭,也是收到消息后切换次优路径。

2.17.3 BGP协议

边界网关协议(BGP)是运行于TCP上的一种自治系统的路由协议。有时候,在网络边缘节点上的某些路由,在传播给其他节点时,并不希望被中间经过的节点学习到,我们希望这些路由能被隔空传递,即经过多个节点,不会在这些节点上留下痕迹,此时便要用到BGP协议。

一般情况下,BGP还会划分不同的区域(AS),我们以一个实例进行分析。如下图所示,从左到右是BGP逻辑上的等效拓扑图。我们可以看到蓝色的路由器同处于AS20,绿色的路由器同处于AS10,两个AS直接通过RT1和RT4相连。

在上面例子的最终拓扑图中,同一个AS中的两台直连路由器互相把对方当成IBGP邻居,不同AS之间的两台路由器互相把对方当EBGP邻居。传递给IBGP邻居的路由传播一般为1跳或1+m+n跳;传递给EBGP邻居的路由传播一般为m+n跳;m为经过的经过的AS数量,n为1或0(最终经过的边缘路由器有IBGP邻居则为1,不然为0)。在下图的例子中,m为1,n也为1。特殊地,当传递给IBGP邻居的路由传播只有1跳时,即2.15.4所说的不转发更新的方式。

传递给IBGP邻居的路由,如果对方不是AS边缘路由器,那传播只有1跳。这会带来一些问题,即如果想IBGP的路由被同一个AS中的其他所有节点学习到,则不可避免地需要full-mesh这种组网,也就是节点之间两两建立TCP连接,这会导致配置麻烦和路由信息流量过多的问题,在这个基础上,引入了一个反射器技术,类似于下面的OSPF提供的DR和Dother,通过配置一个反射器,来无环地传递路由给其他所有反射器客户端节点。

在BGP的反射器概念中,将路由器的角色分成了RR、RRC、Non-RRC三种,三种角色会导致反射的效果不同,详细如下。

BGP的其他知识诸如路径属性,团体属性,此处受限于篇幅不便展开,有兴趣的读者可以阅读此系列

2.17.4 OSPF协议

OSPF路由协议是用于网际协议(IP)网络的链路状态协议。该协议为使用链路状态路由算法的内部网关协议(IGP),在单一自治系统(AS)内部工作。适用于IPv4的OSPFv2协议定义于RFC2328RFC5340定义了适用于IPv6的OSPFv3。

OSPF是链路状态协议的典型代表,具有收敛速度快,严格无环的特点,主要实现思路如2.16节所描述。下面是一个每个节点独立用拓扑图以自己为根计算出最短路径树的例子。

OSPF有多种传递信息的包类型和LSA类型,下面是来自Bird实现的OSPF协议描述的包类型和LSA类型,具体释义网上已有很多类似资料,此处不再赘述。

/* Packet types */
#define HELLO_P		1	/* Hello */
#define DBDES_P		2	/* Database description */
#define LSREQ_P		3	/* Link state request */
#define LSUPD_P		4	/* Link state update */
#define LSACK_P		5	/* Link state acknowledgement */


#define DBDES_I		4	/* Init bit */
#define DBDES_M		2	/* More bit */
#define DBDES_MS	1	/* Master/Slave bit */
#define DBDES_IMMS	(DBDES_I | DBDES_M | DBDES_MS)


/* OSPFv3 LSA Types / LSA Function Codes */
/* https://www.iana.org/assignments/ospfv3-parameters/ospfv3-parameters.xhtml#ospfv3-parameters-3 */
#define LSA_T_RT		0x2001
#define LSA_T_NET		0x2002
#define LSA_T_SUM_NET		0x2003
#define LSA_T_SUM_RT		0x2004
#define LSA_T_EXT		0x4005
#define LSA_T_NSSA		0x2007
#define LSA_T_LINK		0x0008
#define LSA_T_PREFIX		0x2009
#define LSA_T_GR		0x000B
#define LSA_T_RI_		0x000C
#define LSA_T_RI_LINK		0x800C
#define LSA_T_RI_AREA		0xA00C
#define LSA_T_RI_AS		0xC00C
#define LSA_T_OPAQUE_		0x1FFF
#define LSA_T_OPAQUE_LINK	0x9FFF
#define LSA_T_OPAQUE_AREA	0xBFFF
#define LSA_T_OPAQUE_AS	 	0xDFFF

#define LSA_T_V2_OPAQUE_	0x0009
#define LSA_T_V2_MASK		0x00ff

OSPF也采取了BGP中路由反射器类似的方法进行流量的优化,只不过角色由RR和RRC换成了DR(BDR)和Dother,实现的功能是类似的。在BGP中,为了全区域的路由器都有某路由,但又不想full-mesh这种组网,就可以利用RR和RRC将之改造成了树状组网。DR和Dother也类似于RR和RRC,针对full-mesh拓扑(准确来说是非树拓扑)进行优化,所以一般遇到full-mesh拓扑这种情况最好是选举DR和Dother来缩减流量。在上面2.13中,我们有介绍5种接口网络类型,其中有两种MA接口类型(MA和NBMA),OSPF在MA网络类型下一般也要选DR和Dother,这是为什么呢?因为MA网络实际上也等价于full-mesh,如下图所示。在full-mesh或等价于full-mesh的拓扑中,DR和Dother一旦被选定,DR将会对流量执行类似的“反射”功能以缩减流量。

OSPF的其他内容如认证,各种区域还请读者自行去了解,系统学习OSPF可以参看此系列

2.18 常见数据中心网络技术

2.18.1 堆叠

堆叠技术,通俗地来讲,就是将多台物理设备相连后虚拟成为一台逻辑设备,在这台逻辑设备上的操作将会自动在对应的物理机上生效。在网络中,堆叠技术一般用在交换机上,堆叠的交换机之间一般会用多条链路做链路捆绑后相连(有的还会区分心跳线和数据线)。如果两台交换机做了堆叠,在进行生成树等计算的时候会视为一台设备,下面提供了多个使用堆叠技术的例子,以及它们对应的等价拓扑,红色虚线框标示出哪些设备使用了堆叠技术。

2.18.2 跨设备链路聚合

跨设备链路聚合建立在堆叠的基础上,属于链路聚合和堆叠技术的有机结合结合。不同的供应商为此使用了不同的名称。思科将其称为虚拟端口通道Virtual Port Channel(VPC),Arista将其称为多机箱链路聚合协议MultiChassis Link Aggregation Protocol(MLAG),Cumulus称之为CLAG,Juniper称之为MC-LAG。“跨设备”指的是跨物理设备,但所跨的物理设备还是要用堆叠形成一台逻辑设备的。如下图中,一台接入交换机两条上连线分别接两台汇聚交换机,然后在这两条线画个圈,就代表跨设备链路聚合,这样聚合的多条线也可以看成一条线。

2.18.3 虚拟化

堆叠提供了多台物理设备堆叠成逻辑设备的能力,虚拟化则反其道而行之,可以将一台物理设备虚拟成多台逻辑设备。在网络中,二层交换机可以借助vlan技术虚拟成多台虚拟交换机;三层路由器可以借助vrf技术虚拟成多台路由器;防火墙也可以virtual firewall等技术虚拟成多台防火墙。一般来说,虚拟出来的逻辑设备都是相互隔离的,网络是天然不通的,需要通过引入其他的技术或组件来进行逻辑设备之间的相互通信。下面3张图对网络设备的虚拟化做了一个简短的总结,就不逐张讲解了,有疑惑或指正意见的读者欢迎在评论区留言。另,下面的PC服务器也能做对应的虚拟化,读者可以仿照②想象单台服务器上跑多台虚拟机和单台交换机连接的情景。

2.18.4 VXLAN

VXLAN用于扩充VLAN,VLAN仅支持4096个标签,而VXLAN约支持1677万个标签。为了满足在云网络中海量虚拟机迁移前后业务不中断的需要,要求虚拟机迁移前后的IP不能变化,继而要求网络必须是大二层结构。传统的二层网络技术,在链路使用率、收敛时间等方面都不能满足需要。随着云业务的运营,租户数量剧增,传统交换网络用VLAN来隔离用户和虚拟机,但VLAN理论上只支持最多4096个标签,已无法满足需求,此时就要用到VXLAN。下图为使用VXLAN封装的数据包示例:

假如现在因为某些原因,某台虚拟机假如从上海机房迁到深圳机房,我们希望迁移过程对这台虚机的用户来说是透明的,最起码的虚拟机的IP不能产生变化,不然用户用IP访问自己的虚机时会产生问题,同时还要保障用户能正常访问上海机房的其他同网段主机。为了应对这种场景,出现了多种overlay技术,可以让相隔很远的两个机房变成逻辑上的一个机房(是不是有点像堆叠?),常用的二层overlay技术有VXLAN、NVGRE、STT,它们都可以让二层局域网跨机房。下面演示了使用VXLAN是如何将两个异地的局域网统一成一个局域网的。

VXLAN会在边缘路由器重新封装二三四层头部,二层头部的目标mac只要写入邻居路由器的接口mac即可,但三层头部的目标ip地址,该如何去确定呢?换句话说,上图中的RT1(1.1.1.1)怎么知道将流量封装后发往RT2(2.2.2.2)呢?站在上帝视角,最简洁的解决思路是写一条静态规则:收到的特定包封装后往2.2.2.2发,问题解决。但是如果有多个边缘路由器,如下图所示。在这种情况下,自行写静态规则可能面临条目过多的情况,而且迁移虚拟机这种情况也会需要修改静态规则,所以最好有一个方法可以动态传播这些规则。这个动态传播的方法一般是使用MP-BGP和BGP的反射实现,在这种情况下,BGP控制了规则的传递和计算,被称为“控制平面”;VXLAN实现了底层数据的互访,被称为“控制平面”。

注:①学习过NAT的同学,可以把VXLAN当成不直接修改原始报文,另外新建首部存放转换后的地址的NAT。

② VXLAN的详细知识可以参看此文章 ( ps:建议这个系列都可以学习下,也是浓浓的ppt作图风哈)。

2.18.5 EVPN

EVPN(Ethernet Virtual Private Network),由RFC7432(BGP MPLS-Based Ethernet VPN)定义。原本是BGP+MPLS的L2 VPN,后面发展为BGP+(MPLS/PBB/VXLAN)的L2 VPN,其中BGP+VXLAN较为通俗流行。2.18.4节中有提到“控制平面”和“数据平面”的概念,一般MPLS/PBB/VXLAN为“数据平面”,BGP为“控制平面”,控制平面负责发布路由信息,数据平面负责转发报文。

通俗来说,EVPN可以理解为一条条虚拟的连线,通过这些连线,即使是两个远隔天南地北的(虚拟)局域网,都可以因这条“直连线”变成同一个局域网,这些“直连线”由BGP来进行控制发布(控制平面),“直连线”这种效果由MPLS/PBB/VXLAN等技术来提供(转发平面)。EVPN的内容可以参见此文章(还是2.18.4节同一个系列)。

2.19 常见数据中心组网

上面的知识铺垫已经足够多,让我们来思考一下,数据中心的组网应该是怎样的。上面的内容中笔者已经介绍了二层网络(二层交换机转发)和三层网络(路由器转发),关于如何在数据中心使用它们,我们一般会有下面三种选项:

  • 只用二层网络
  • 只用三层网络
  • 同时使用二三层网络

2.19.1 只用二层网络的情况

只用二层网络的网络拓扑比较简单,可以采用mesh或者tree/star的组网方式。如果使用tree/star,则不需要运行生成树协议;如果使用mesh,则需要运行生成树协议。关于一个拓扑到底属于mesh还是tree/star,一个比较好的辨别方法是:查看逻辑上的节点m和逻辑上的线路数n是否满足m-n=1且有无出现独立节点,满足m-n=1且无独立节点的为tree/star拓扑,不然则为mesh。只用二层的网络的缺陷十分明显:首先,只用二层网络的局限性在2.12.1中已有提及,二层地址无法有效汇总和单交换机的二层地址缓存数目有限都局限了它的扩张。然后,如果只用二层网络并且使用的是mesh拓扑,还会因运行生成树协议浪费一部分线路的可用。最后,如果只用二层网络,它可以作为一个内部沟通网络或计算网络,但是没办法和现在互联网沟通的(需要用ip访问),属于“孤岛网络”。

2.19.2 只用三层网络的情况

只用三层的网络拓扑同只用二层,只需要将二层网络中的二层交换机全部换成路由器即可。在只用三层的网络中,不管是mesh还是tree/star拓扑,都不需要运行生成树协议,可以做多线路的负载。但路由器相对于交换机来说,接口一般会比较少,能接入的主机数比较少;三层交换机虽然接口比较多,但是属于二三层混用的设备,不算只用三层的设备。理论上数据中心是可以跑只用三层的网络的,但奈何见到的例子比较少,属于后续可以做文章的方向。

2.19.3 同时使用二三层网络的情况

实际上,现有的数据中心基本都是同时使用二三层网络。同时使用的两种网络之间一般会有个边缘,我们暂将之称为二三层边缘,这个边缘隔开了二层和三层网络。在2.11节接入、汇聚、核心三层架构的基础上组网,我们可以用下面三个问题来区分各种数据中心网络组网。

  • 二三层边缘在三层架构的哪一层?
  • 二层网络节点用什么拓扑?
  • 三层网络部分用什么拓扑?

下面将以几个实例进行说明,本文暂将单个节点或多节点之间没有连线的拓扑称为isolated,为简化作图,默认下面所有交换机都带三层功能,所有交换机图标的都为三层交换机。

边缘在核心交换机上的情况

下面的拓扑图使用了堆叠技术和跨设备链路捆绑技术,实际拓扑如左,逻辑拓扑如右。其中,二层网络为mesh拓扑;三层网络只有一个节点,属于isolated拓扑。因为二层为mesh拓扑所以需要运行生成树;但生成树不一定要全二层网络范围运行,可以缩小范围,只在核心和汇聚之间运行,因为这一块才是整体为mesh拓扑的原因。

边缘在核心交换机时,核心层一般只有一个节点,如果出现两个或更多节点,会发生什么?图笔者已经画出来了,首先声明这个拓扑一般不会在生产中使用,至于为什么请读者自行想象。

边缘在汇聚交换机的情况

下面的拓扑图仍使用了堆叠技术和跨设备链路捆绑技术,实际拓扑如左,逻辑拓扑如右。其中,二层网络为tree/star拓扑,三层网络为mesh拓扑。因为二层为tree/star,所以不需要跑生成树。

边缘在接入交换机的情况

下图包含两张图,均没有使用堆叠技术和跨设备链路捆绑技术,(因为三层网络中一般不使用这两种技术,原因请自行分析),实际拓扑和逻辑拓扑一致均。其中,二层网络均为isolated拓扑,三层网络均为mesh拓扑。下图左是由三层架构直接转化成的边缘在接入交换机的情况,但因为三层网络实际上跑的是路由,分多个层级的意义不大,所以这种情况下一般会将三层网络扁平化,形成下图右的spine-leaf架构。当然,实际生产环境一般由于各种原因两者兼有,然后实际组网跟下面的也会有一定的差异。

综合上面的内容可知,在接入、汇聚、核心三层架构的基础上,

  • “二三层边缘在三层架构的哪一层?”,可以提供上面至少3种可能性。
  • “二层网络节点用什么拓扑?”,可以提供至少isolated、mesh、tree/star三种可能性。
  • “三层网络部分用什么拓扑?”,可以提供至少isolated、mesh、tree/star三种可能性。

利用这些可能性进行排列组合,可以得到多种多样的数据中心网络架构。在这些不同的网络拓扑上我们可以施加不同的网络技术/协议,形成一个个可用的网络。然而多种网络架构叠加多种网络技术终究还是个有限集合,即使现在看上去有些麻烦,但终归还是很快就可以穷尽的,所以学习网络还是得保持信心。

再说二层网络技术其实不太多,网络技术的多样性其实大半落在了三层上。所以二三层边缘在汇聚或接入交换机上,三层网络可以使用多种拓扑时,网络就可以玩出许多花样。比如利用使用EVPN实现服务器任意机房任意机柜接入。如下图所示,三层使用Spine-Leaf架构,叠加OSPF+EVPN(MP-BGP+VXLAN)+BGP路由反射器等技术,就可以实现Site1和Site2的异地同局域网。当然,此处仅简单举例,具体组网细节还请读者去搜集相应的资料。

2.19.4 参考链接

以下是2.19节内容参考和阅读过的相关资料,有兴趣的读者可以阅读下面的内容。

RFC7938 Use of BGP for Routing in Large-Scale Data Centers

数据中心网络架构浅谈(一)

数据中心网络架构浅谈(二)

数据中心网络架构浅谈(三)

3 总结

本文介绍了三层网络和相关的协议,以及常见的数据中心组网。受限于篇幅,笔者并没有在每一块过多展开,而是采取了简述笔者理解的方式。尤其是组网这块,还缺了很多细节的讲解,但因为组网都是经过多方面改进才逐步得到的,每种特殊的设计都有其独到的原因,笔者也很难面面俱到。另外,组播也未如大纲列出的讲解到,无论如何,本文暂时告一段落,感谢阅读,欢迎指正。

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
关于网络的一次推演(续)
本文用一个连续的思路对网络做了推演,为上一篇文章的延续。旨在最终解构复杂网络架构。包含:RIP、OSPF、EIGRP、BGP和常用的数据中心网络架构等。上一篇文...
<<上一篇
下一篇>>