报文的路由器之旅

路由器转发全景图

 路由器CPU发送的协议报文的在转发层面的处理流程

 交换和寻址转发

从“交换”谈起

 数据是通过接口板接收和发送,通信线缆都要插接到接口板的接口上。

数据包可能从任意接口进来,从任意接口出去,都这么点到点连接的话,则需要N*(N-1)/2根线互联,太多了。
为了解决这种大量的连接问题,接口板和接口板之间要使用交换网(switch fabric)板衔接起来

交换网属于“三无”部件,即与设备配置无关、与协议无关、与数据包类型无关。交换网专注于在入接口和出接口之间建立连接,完成数据的交换。
上行和下行

 寻址转发

在互联网中,从一个节点到另一个节点,有许许多多的路径,路由器可以选择通畅的最短的路径,从而提高通信速度,减轻网络负荷,节约网络资源,这是交换机所不具备的能力。为数据包选择一条合适的(通常指最短的)传输路径,然后从对应的接口发送,这个过程就称为“寻址转发”。

“寻址”的”址“是指根据数据包的网络层地址——IP地址。为了寻址,路由器需要一张“地图”,以目的IP地址为索引的“地图”,也就是路由表。每个路由器中都有一张路由表。

比如收到一个目的地址为10.0.0.1的报文,路由器就可以查表得知需要将该报文发送到GE1/0/0这个接口。

路由表放在哪

路由表放在一个公共的地方,比如主控板上,由主控板的CPU运行路由协议,计算路由,生成和维护路由表。

转发表与路由表

华为高端路由器采用的是“硬转发”,业务报文不经过主控板CPU处理,不能直接用主控板上的路由表,接口板上也需要有供寻址转发的信息。所以,主控板CPU生成路由表之后,还要将相关信息下发给各个接口板。这些相关的信息就是转发信息,存放在各个接口板的转发信息表FIB(Forwarding Information Base)中。

现代高性能路由器在架构上都是转发和控制分离:把转发层面和控制层面分配在不同的组件,控制层面运行路由协议,维护路由表,并下发转发表FIB到转发层面,由转发层面负责数据包转发

实际上,转发表是根据路由表生成的。路由表中可能包含到达目的地址的多条路由,但是转发表里面只取其中的最优路由。而且,路由表的下一跳是原始的下一跳,不一定是直接可达的,FIB是用于指导转发的,它的下一跳必须是直接可达

路由器上电启动之后,就会运行路由协议学习网络拓扑,生成路由表,如果接口板注册成功,主控板就可以根据路由表生成转发表项并下发给接口板,这样路由器就可以根据转发表转发数据包了。

报文的收发、解析和封装

 报文的接收和发送(接口卡的处理) 

数据在通信线缆上传输时还只是光/电信号(对应于物理层的比特流)。为了让路由器读懂这些信号,以便获取数据包的目的地址用于寻址转发,在路由器上插线缆的接口里边有一块物理接口卡——PIC(Physical Interface Controller)卡,能感知这些光/电信号,把信号转换成数据帧(比如以太帧、PPP帧、ATM信元)

接口卡有两个重要的功能,其中一个就是完成上述的物理层功能,光/电信号的收、发;另一个重要功能,就是进行数据帧的“合法性”检查。

以太网标准中规定如下帧为无效帧:

  • 帧的长度不是整数个字节;
  • 用收到的帧检验序列FCS(Frame Check Sequence)查出有错误;
  • 收到的帧的负荷长度不在46~1500字节之间。 

PIC卡把光/电信号转换成数据帧,并检查“合法性”之后,把数据帧的内容(不包含帧间隙、前导码、帧开始界定符和FCS)发送给包转发引擎PFE。

数据包经过PFE转发,经过交换网板交换,从下行接口发送时,下行的对应位置也有接口卡。

下行接口卡的作用是,用待发送的数据帧内容计算帧检验序列FCS,然后对数据帧加封装帧间隙、前导码、帧开始界定符和FCS,并将数据帧转换成光/电信号,再发送到出接口线路上。
报文解析

当转发引擎PFE从PIC卡收到报文时,PFE首先做的就是解析报文的二层帧头,并根据配置做一些检查和处理。那么,如何根据配置做检查和处理呢?

路由器支持丰富多彩的功能特性,以满足各种业务需求。其中,大部分功能特性允许人们通过命令行进行配置,实现使能或去使能,并允许通过命令行来调整一些参数。那么,路由器各转发部件是如何依据命令行的指示来工作的呢?

其实,所有的配置命令行都是通过主控板解读,再下发到接口板。在接口板上存有许多的表项,除了转发所使用的转发信息表之外,还有各种入接口属性表、出接口属性表、ACL表、流分类表等等。接口板上电或重启时会触发主控板向其下发配置,也就是根据配置设置接口板上的各种表项的值。之后,接口板上的各部件查找各类表项,根据对应的值进行对应的处理。当然,如果有配置的增删改,大部分情况下会实时更新到接口板

举个例子,路由器某个以太接口上接入VLAN10~20范围内的用户,人们希望在该接口上配置允许VLAN10~20的报文通过,如果不在VLAN10~20范围内的要被丢弃。那么,人们需要在该接口上配置portswitch命令使得该接口为二层接口,并配置接口为Trunk类型,允许通过(allow-pass)的VLAN ID范围是10~20。当主控板下发配置后,该接口的属性表对应的二层桥接转发状态为“使能”,端口类型为Trunk,且VLAN ID范围是10~20。当报文到来时,PFE首先对照报文的入接口属性表,发现接口为Trunk类型,于是检查报文的二层帧头是否携带VLAN。如果没有则丢弃,有则检查帧头携带的VLAN ID值是否在接口属性表对应的VLAN ID范围内,如果不在则丢弃该报文。除了做检查外,PFE还需要根据报文的入接口属性表来做流分类、包过滤、重定向等处理(这些处理将在后续章节中介绍)。

 之后,PFE根据入端口属性表对应的转发动作做后续的查表转发处理。以以太报文为例,PFE检查MAC地址,如果不是本机MAC,则后续做二层桥接转发;如果是本机MAC,则根据以太帧头协议类型(type字段)做IP、MPLS或其他类型的转发。值得注意的是,如果入接口属性表对应的转发状态与报文解析后的协议不匹配,则报文会被丢弃。比如某接口并未使能IPv6,则属性表的IPv6转发能力为”未使能“,如果收到的报文是IPv6报文,则报文会被丢弃。

报文封装
某局域网的主机A发送报文给另一局域网的主机B,中间经过一台路由器,那么这台路由器就是PC-A的网关。

 

 由主机PC-A向主机PC-B发送IP报文,那么该报文的目的IP地址就是PC-B的IP地址,源IP地址就是主机PC-A的IP地址,目标MAC地址就是其网关路由器Port1的MAC地址,源MAC地址就是PC-A的MAC地址。

路由器转发过程:
1. 路由器收到这个报文,发现其目的MAC为本机Port1端口的,表明需要本机来进行进一步解析(如果目的MAC不是本机,表明直接进行二层转发,不需要再解析帧的其他内容了);
2. 路由器进一步解析报文,得知帧所承载的协议类型为IPv4(协议类型值=0x800),即需要进行IPv4转发;
3. 查转发表(FIB表),得知该报文并不是发给自己的,而是需要送往出端口Port2,因此,路由器不再继续分析IP头后面的内容。
4. 路由器将目的MAC更换成PC-B的MAC,将源MAC更换成出接口Port2的MAC,并将报文发给PIC卡,PIC卡将报文从Port2发送出去。

在上述过程中,将报文原来的源/目的MAC更换成新值的过程,称为“封装”;往报文里添加新的字段,也称为“封装”。需要被封装到待发送报文的信息称为“封装信息”。
那么,路由器是如何得到上述的封装信息(源MAC和目的MAC)呢?答案是:在路由器的下行接口板也对应有包转发引擎PFE,里面存有2张重要的表项,一张是IP地址与MAC地址的映射表(即ARP表),另一张是出接口属性表(该表有出接口对应的MAC地址)。

数据包经过上行PFE的查FIB表后,得到了报文的出接口。到了下行,下行PFE再根据报文的目的IP查找ARP表得到目的MAC,根据报文出接口查找出接口属性表便可得到源MAC。
上述是IP转发场景,封装信息包括链路层的源MAC和目的MAC。对于其他场景,除了这两个封装信息外,还需要获取其他的封装信息,例如,对于QinQ场景,需要加封装VLAN Tag;再如,对于MPLS场景,需封装MPLS标签。这些处理都是在下行接口板的PFE上进行。

出口处理
同上行,封装完成后,数据帧送往下行接口卡之前,也要根据出口属性表做出口检查和处理。例如,检查报文长度是否超出接口的MTU值,如果超出则进行分片或其他处理

 流量控制

反压机制
报文经过上行接口板的处理之后,送往交换网板进行交换。所有报文都要经过交换网的交换,所以交换网是决定路由器性能的最核心单元,交换网应该是“无阻塞”的,其转发容量是所有接口板的转发容量之和,很强大。然而,下行接口板可能没那么强大,万一扛不住怎么办?为了避免这种现象,路由器上有“反压机制”,下行接口板扛不住,会发生反压,这样交换网板知道了,会通知上行接口板暂停发包,将报文进行缓存。

 

 队列机制

配合反压机制,华为高端路由器的接口板上有一块被称为TM(Traffic Management)的部件,里面有一些高速缓存,在拥塞的情况下,数据包以队列的形式暂存在缓存里,TM再按一定的规则把数据包调度出队,送往交换网。如果装不下,还会按一定规则做报文丢弃。

 同理,报文经过交换网板送到下行接口板时,流量有可能超过出接口的发包能力,因此在下行接口板上也需要有TM芯片进行缓存和队列管理。在拥塞的情况下,数据包以队列的形式暂存在缓存里,下行TM再按一定的规则把数据包调度出队,送往出接口发送。

流量监管(CAR)
流量控制除了上述处理机制外,还有一种机制——流量监管,使得流量不超过入/出接口允许的带宽,超出限制的那部分数据包会被直接丢弃。目前流量监管使用的技术是CAR(Committed Access Rate)。CAR是由包转发引擎PFE完成的,可以在上行PFE上执行,限制流量不超过入接口带宽;也可以在下行PFE上执行,限制流量不超过出接口带宽。

 QoS 基础

 集成服务(IntServ)模型和差分服务(DiffServ)模型。

集成服务模型

集成服务模型,要求用户要事先申请,声明想要什么样的服务,网络在资源满足的情况下,预留资源以满足该请求。就像旅游巴士一样,能保证每个人都有座位,但是有的车没坐满也照常开,座位空着就空着了。

集成服务模型从上世纪90年代中叶提出至今,没有在IP网络中商用过。目前IP网络广泛使用的是差分服务模型。

差分服务模型

差分服务,其实就是将网络中的流量分成多个类,不同的类采用不同的处理。也就是说,先对流量分类,然后把类别标记在报文头中,通过报文携带到网络上,网络各节点只需要简单地识别报文中的这些标记,进行相应的处理。好比你去坐火车,火车票就是用来标记你所要享受的服务,是软卧、硬卧、硬座还是无座。火车票你随身携带,上车时你根据火车票进入对应的车厢,享受相应的服务:进入卧铺车厢的,可以舒服的躺着,进入硬座车厢,表示要坐着或站着。报文头里的那些标记就相当于“火车票”。

 DSCP 与PHB

DSCP和PHB是差分服务里两个很重要的概念。理解差分服务,先从这两个概念开始。

DSCP

前面说过,报文头里的那些标记就相当于“火车票”。那么,报文头有很多,二层的帧头、2.5层的MPLS头、3层的IP头,那些标记到底是标在哪层里呢?其实,每层都有标记,对应的标记分别被称为802.1P,EXP、DSCP。

 

 

 

 

为啥每个层都要有这个标记呢?因为报文在网络中传输,中间可能要经过二层以太网、MPLS网络、IP网络等,不同网络转发行为不一样,比如二层,网络节点只分析以太帧头,不会再去分析里面的MPLS头或IP头了。
除了802.1P,EXP、DSCP,书上说还有一种标报文头里的那些标记就相当于“火车票”记叫ToS,它又是虾米东东呢?其实,ToS也是IP头里的字段。IP头的经历也比较
坎坷,最初,标准定义的IPv4报文头,并没有DSCP,而是有个8bit的ToS域,且前三位才是表示优先级的,即Precedence,一共才8种等级。

 后来,标准重新定义了这个域,将保留位的其中一比特定义为C比特位,并将D、T、R和C共4个比特位称为ToS域。所以提ToS,得区分是哪个标准的。华为路由器遵从的是RFC 1349。

 再后来,标准又重新定义了这个8比特,把前6位改名为DSCP。

 PHB

PHB是Per Hop Behavior的缩写,即每跳行为,即设备对报文的处理。可能有人理解为PHB就是调度、丢包、监管、整形、重标记等动作,实际上不完全是,这些动作是设备具体的行为,而PHB只定义了一些外部可见的转发行为,并没有指定特定的实现方式。说白了,PHB就是将各种行为,概括成几类。就如同星级酒店的标准,可以有3、4、5这样的星级。RFC定义了四类标准的PHB,并用CS、EF、AF、BE这些符号来表示,每类PHB都对应一组DSCP。其实,PHB这样分类,是根据那些可见的服务特征,如时延、抖动或丢包率。

CS、EF、AF、BE!没错,我们经常见到它们。

  • BE,没有质量保证,一般对应于传统的IP分组投递服务,只关注可达性,其他方面不做任何要求。IP网络中,缺省的PHB就是BE。任何路由器都必须支持BE PHB。
  • AF,代表带宽有保证、时延可控的服务,适用于视频、语音、企业VPN等业务。
  • EF,低时延、低抖动、低丢包率,对应于实际应用中的视频、语音、会议电视等实时业务。
  • CS,因为现网有些存量设备不支持差分服务,只解析DSCP前3位,为了后向兼容,标准预留了所有格式为XXX000的DSCP值,这类值就对应为CS PHB。

可是,大家经常看到的是,AF带有后缀的,比如AF11、AF21等,CS也有CS6、CS7等,而BE、EF都不带后缀。这怎么回事呢?那是因为,BE和EF对应的只有唯一的一个DSCP值,CS和AF有多个DSCP值与之对应。例如AF,被细分为4个等级,且每个等级有3个丢弃优先级,其表达形式为:AF1x~AF4x(x代表丢弃优先级,取值为1~3)。举个例子来说明AF怎么用。假设有4个小区的网络,接入到ISP的同一台边缘路由器。如果某个小区发送了大量的FTP数据,可能导致拥塞,干扰其他小区的FTP传输。为了公平,约定每个小区FTP总速率不能超过500M。但有时他们可随意发送,甚至会超过1Gbps。怎么办呢?可以在每个入接口上(用CAR)监测FTP速率,并重标记报文的DSCP。如果速率小于等于500M,标记为AF11,如果速率在500Mbps~1Gbps之间,标记为AF12,如果速率超过1Gbps,标记为AF13。当拥塞发生时,优先丢弃AF13,其次AF12,AF11就会在最后被丢弃。皆大欢喜。

转发平面其他处理

 切片与重组

华为高端路由器上通常有多块交换网进行M+N备份。为了实现交换网的负载均衡,交换网采用基于定长信元交换技术:在把报文送往交换网之前,进行切片处理,也就是把报文按一定粒度进行切片,切成固定长度的信元,类似于ATM信元。交换网板基于固定信元长度进行交换。流量到了下行再进行重组。数据包的切片和重组是在接口板的FIC(Fabric Interface Controller,交换网接口控制器)上进行的。

 组播、广播复制

 单播:“一对一”的通讯模式,网络对数据只进行转发不进行复制。

 

 

 组播:“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络只向有需求者复制并转发其所需数据。需要相同数据流的客户端需事先加入相同的“组”,这个组称为“组播组”。

 

 

 广播:“一对所有”的通讯模式,网络对数据进行无条件复制并转发,所有主机都可以接收到所有信息(不管是否需要)。数据网络中,广播其实是被限制在局域网范围内的,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。

对于组播和广播报文,路由器收到的是一份,但可能需要从多个出接口发送,这些出接口还可能位于多个接口板上。因此对于组播/广播报文,除了查表转发之外,上行需要进行板间复制;下行需要进行同一板内的多个端口的复制。
这些复制操作是在TM上进行的,上行TM进行板间的复制,下行TM进行板内复制(复制到不同端口)。

 

 

 NAT

NAT 基本原理

NAT(Network Address Translation,网络地址转换)技术是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程。借助于NAT,局域网可以使用私有地址实现内部互通,如果要访问外部网络,则可以通过NAT设备进行地址转换,将发往公网的数据包的源地址(私有地址)转换成公有IP地址),回程流量再通过NAT设备进行反向转换,这样,一个局域网使用少量公有IP地址(甚至是1个)即可实现局域网内所有主机与Internet的通信需求。
NAT有多种实现方式,华为高端路由器上实现的是NAPT(Network Address PortTranslation,网络地址端口转换),可同时映射IP地址和端口号。来自不同内部地址的数据报文的源地址可以映射到同一外部地址,但它们的端口号被转换为该地址的不同端口号。这样,可以更加充分地利用IP地址资源,实现更多内部网络主机对外部网络的同时访问。

 

 

 如上图所示,三个带有内部地址的数据报文到达NAT设备,其中Flow-1和Flow-2来自同一个内部地址但有不同的源端口号,Flow-1和Flow-3来自不同的内部地址但具有相同的源端口号。通过NAPT映射,3个数据流的源IP地址都被转换到同一个外部地址,但每个数据报都被赋予了不同的源端口号,因而仍保留了报文之间的区别。当回程流量到达时,NAT设备仍能够根据回程流量的目的IP地址和目的端口号来区别该流量应转发到的内部的哪台主机。

NAPT是基于地址池的,事先定义一个NAT地址池,地址池中包含多个公网IP地址。当有用户需要访问外网的时候,数据包到达NAT设备之后,NAT设备从NAT地址池中挑一个IP地址,然后将其映射到这个私有IP,随后进行地址转换动作。一段时间后,如果用户不再有流量发出来,则自动将占用的公有IP放回池中给其他人使用。

NAT 实现流程

在华为高端路由器上,实现NAT转换的关键部件是NAT业务板,业务流程是:上行接口板把流量引入到业务板,业务板负责NAT处理,完成后再交给下行接口板发出。详细实现流程如下:

同其他业务流的处理流程大部分相同,不同的是:

  • 在上行接口板的包转发引擎PFE(NP芯片)查公网路由表转发时,匹配的是NAT地址池的UNR路由,其目的单板是NAT业务(如果NAT业务板为集中板,则UNR路由信息中带目的单板和目的接口信息; 如果是随板则直接上送
  • CPU处理后得到目的单板和目的接口信息)。
  • 交换网根据目的单板信息将报文发给NAT业务板。
  • NAT业务板首先进行地址转换,将数据包的目的IP(公网IP)转换成私网IP,并做端口转换。
  • NAT业务板查找私网转发表进行转发,得到目的接口板和出接口信息。
  • 交换网将报文交换到下行接口板,之后的处理和同其他业务流,不再赘述。

包过滤

 

posted @ 2020-05-09 17:42  星火撩原  阅读(1549)  评论(0编辑  收藏  举报