报文的收发、解析和封装
报文在通信线路上只是一些光/电信号,从光/电信号的接收到转发、到交换,再到发送,这个过程中,还经过了什么处理?本章将为您揭晓答案。
本章主要知识点为:
※ 光/电信号和数据帧之间的转换
※ 数据帧的“合法性”检查
※ 报文解析过程
※ 报文封装过程
1
报文的接收和发送(接口卡的处理)
数据在通信线缆上传输时还只是光/电信号(对应于物理层的比特流)。为了让路由器读懂这些信号,以便获取数据包的目的地址用于寻址转发,在路由器上插线缆的接口里边有一块物理接口卡—PIC(Physical Interface Controller)卡,能感知这些光/电信号,把信号转换成数据帧(比如以太帧、PPP帧、ATM信元)。
接口卡有两个重要的功能,其中一个就是完成上述的物理层功能,光/电信号的收、发;另一个重要功能,就是进行数据帧的“合法性”检查。数据经过物理线路的传递后,有可能发生畸变,变成错包,无法被包转发引擎PFE正确解析,因此在接口卡需要进行一些必要的检查。比如,一个以太帧格式如下:
以太网标准中规定如下帧为无效帧:
对于检查出的无效帧就简单的丢弃,以太网不负责重传丢弃的帧。而这些检查,是在
接口卡上执行的。
说明:
每个以太帧之间都要有帧间隙(Interframe Gap),即每发完一个帧后要等待一段时间才能再发另外一个帧,以便让帧接收者对接收的帧作必要的处理(如调整缓存的指针、更新计数、通知对报文进行处理等等)。
在以太网标准中规定最小帧间隙是12个字节,其数据为全1。对于个别的接口,可减少到64(GE)或40比特(10GE),其他的接口都不应该小于12字节。
以太网标准中规定前导码为10101010 10101010 10101010 10101010 10101010 10101010 10101010(二进制),共7字节;帧开始定界符为10101011,共1字节。
那么,如果PIC卡实际收到的帧间隙、前导码、帧开始界定符,如果跟协议规定的不一样,是不是这个数据帧也会被丢弃?答案是,PIC卡在处理帧间隙时,帧间隙一般可以容忍跟协议规定的不一样(比如不是全1);但前导码、帧开始界定符必须符合协议规定的值,否则当做帧间隙处理,也就是帧被丢弃了。
PIC卡把光/电信号转换成数据帧,并检查“合法性”之后,把数据帧的内容(不包含帧间隙、前导码、帧开始界定符和FCS)发送给包转发引擎PFE。
说明:
PIC卡的类型决定了接口板的业务类型,比如把4*2.5G PoS PIC卡集成在某接口板上,则该单板就支持4*2.5G 的PoS业务,把10*GE PIC卡集成在某接口板上,则该单板支持提供10*GE的以太业务。将某PIC卡集成在接口板上,对应的PFE便可得知该PIC卡的类型,因此按对应业务类型来解读PIC卡送过来的数据。
数据包经过PFE转发,经过交换网板交换,从下行接口发送时,下行的对应位置也有接口卡。
下行接口卡的作用是,用待发送的数据帧内容计算帧检验序列FCS,然后对数据帧加封装帧间隙、前导码、帧开始界定符和FCS,并将数据帧转换成光/电信号,再发送到出接口线路上。
2
报文解析
当转发引擎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报文,则报文会被丢弃。
说明:
有些报文是不需要进行查表转发的。比如,PFE解析二层帧头时,从二层帧头的协议字段就可以直接判断出某些协议报文是需要上送本机CPU处理的,如ARP、RARP、IS-IS、LLDP、LACP、PPP控制报文等等;还有一些协议报文,其目的地址为特定的保留组播IP地址(标准中定义,组播地址224.0.0.1~224.0.0.255供路由协议使用),可直接判断其需要上送本机CPU处理,因此这类协议报文也不需要查表转发。
3
报文封装
不同报文,需要做的封装不同。以大家熟悉的以太帧为例吧,先来回顾下IP转发流程,看看IP转发过程中要封装哪些信息。下图是个最简单的IP转发场景,某局域网的主机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上进行。
4
出口处理
同上行,封装完成后,数据帧送往下行接口卡之前,也要根据出口属性表做出口检查和处理。例如,检查报文长度是否超出接口的MTU值,如果超出则进行分片或其他处理(关于MTU的详细介绍请参见《MTU专题》)。
来源:华为