传统的IP路由方式时基于目的IP的,有以下三种基本的方式:
- 进程转发(process switching) — 路由表驱动
- 每个数据包都要经过完整的路由表查找(最长匹配、递归查找)
- 快速转发(fast switching)— cache驱动(新的IOS已将其废弃)
- 第一个包永远是process-switched。
- 大多数最近的目的地址会进入cache储存。
- CEF(cisco express forwarding)— 拓扑驱动
- 由FIB(转发信息库)和Adjacency Table(邻接表)组成。
- 有了路由表就产生了FIB表。
MPLS的架构
- 控制平面(control plane)
- 运行路由协议,分发拓扑信息,构建路由表(RIB)
- 运行标签分发协议,来分配、分发、保留标签,构建标签信息库(LIB)— 如TDP/LDP/RSVP/MBGP
- 数据平面(data plane)
- IP包基于FIB(转发信息库)进行转发
- 标签包基于LFIB(标签转发信息库)进行转发
LDP建立邻居的过程
- 两台路由器在建立LDP邻居之前,会通过UDP来发送discovery报文,里面携带LDP router-id、Transport Address、Discovery 的 Holdtime。
- 默认情况下,Transport Address就是LDP的router-id。
- 可以在全局更改LDP的router-id,来更改Transport Address。全局下,mpls ldp router-id lo1 force,通过force命令使命令立即生效。
- 可以接口下,在不更改LDP router-id的情况下,更改Transport Address。mpls ldp discovery transport-address x.x.x.x / interface。
- Transport Address要可达,才可以建立邻居。
- 更改discovery的holdtime后不会立即生效,需要清一下LDP邻居。
- 默认情况下,Transport Address就是LDP的router-id。
- 两台路由器在协商完discovery里的参数后,通过TCP建立邻居,使用646号端口。端口大的访问646号端口。
MPLS标签
- MPLS可以用于任何地方,无论一层是什么介质、二层是什么协议。
- LDP默认为FIB表中的每一条路由都分配标签。
- MPLS使用32bits的Label插在二层帧头与三层包头之间(frame-mode MPLS)帧模式的MPLS。32bits的标签分为以下4个部分:
- 20bits label — 代表标签范围。0-15是保留作为其他用途,默认从16开始分配标签。IOS XR默认是从24000开始分配标签,16000~23999建议给Segment Routing使用。
- 3bits 实验为(experimental field)— 用于做QoS
- 1bit的栈底位 — 用于标识紧跟着标签的下一个头部是另外一个标签(0),还是IP包(1)
- 8bits的TTL位 — 用于防环
- MPLS over ATM使用的ATM头部的VPI/VCI(cell-mode MPLS)信元模式的MPLS。
- 标签堆栈
- 二层帧头的type字段(以太的type=0x8847)标识单播的标签包
- 栈底位 — 用于标识紧跟着标签的下一个头部是另外一个标签(0),还是IP包(1)
- 每个路由器收到标签包以后只对顶层标签进行操作
标签交换路由器(Label Switch Routers)
- LSR:MPLS域内的核心设备,主要执行标签交换(Label swapping)
- Edge LSR:MPLS域的边界设备
- 将IP包转发进入MPLS域:压标签(impose)
- 将MPLS域内传来的报文转发到MPLS域外(pop)
- FEC(转发等价类)
- 拥有相同标签转发路径的一组数据包的集合
- 在MPLS单播IP转发中,FEC=路由
- LSP(标签交换路径)
- 标签包从上游到下游经过的一组路由器的集合
- 在MPLS单播IP转发中,LSP基于路由协议,所以是单向的
- LSP也可以和路由协议选择的路径不一致(MPLS流量工程)
- PHP(次末跳弹出)
- Penultimate hop popping — 次末跳弹出,主要用于优化帧模式的MPLS的转发性能
- 最末跳路由器使用POP或者implicit nul(隐含空)标签。使用保留的label-value公告给邻居(LDP=3)
- 每个路由器会为自己的直连路由分配imp-null标签
- 在MPLS域的倒数第二跳将标签弹掉以后,在最后一跳只需进行一次查找就可以
帧模式的MPLS的标签分配、分发、保留
- 帧模式的MPLS的标签分配、分发、保留分为以下几个步骤:
- 运行路由协议,分发拓扑信息,构建路由表,但是这时并没有label信息
- 每个LSR会为FIB中的每条路由分配一个标签
- LSR会将自己分配的标签发给邻居
- 每个LSR构建自己的数据库信息(LIB/LFIB/FIB)
- 标签分配 — 独立分配
- 只要满足标签分配的条件,每个LSR都可以独立分配标签。MPLS over ATM的是信元模式的MPLS,是按序分配,意思是下一跳分配完了,上一跳分配,逐步分配的标签。
- 默认情况下为FIB表中每一条路由都分配一个标签(可以手工控制)
- mpls ldp label
- allocate global hosts-route (只为32位路由分标签) / prefix-list NAME
- 标签本地有效
- 标签分发 — 自主分发
- LSR不需要邻居请求就可以自主的将自己分配的标签分发给邻居
- 默认情况下将自己分配的所有标签都发送给所有邻居(可以手工配置)
- mpls ldp advertise-label for 1 to 2
- 基于平台的标签分发方式 — 优点:快,数据库小; 缺点:不安全
- 标签保留 — 自由保留
- 不仅保留自己分配和下一跳分配的标签,所有邻居发来的标签都保留,叫自由保留。保守保留,则只保留自己分配的和下一跳分配的标签。
- 自由保留数据库更大、更占内存;自由保留收敛速度更快,譬如下一跳不可达时,会迅速找到下一个可达的下一跳的标签。
- 帧模式的MPLS的问题
- 帧模式的MPLS核心网络中出现untagged或者no label表示有问题,可能有以下原因:
- LDP邻居关系的建立
- 协议不匹配(一边LDP,一边TDP)
- 协议激活(接口、进程、全局)
- 数据包被过滤(UDP/TCP)
- 传输地址不可达
- 标签的分配
- CEF
- 标签范围
- 有选择性的标签分配
- 标签的分发
- 有选择性的标签分发
- 有选择性的标签接收
帧模式的MPLS基本feature
- Loop Detection — 环路检测
- LDP依靠IGP的防环机制来防止路径的环路
- 但是接入配置了错误的静态路由等,造成了路径的环路,就需要通过标签头部的TTL来防止数据包在网络中一直传播
- 标签头部的TTL和IP头部的TTL功能一样
- MPLS的操作会将IP头部的TTL拷贝到标签头部,这种现象称之为TTL传输(TTL Propagation)
- Cisco路由器默认激活TTL传输功能
- no mpls ip propagate-ttl #关闭TTL传输功能,默认关闭穿越和域内流量。后面加参数 forwarded,可以只关闭穿越流量的TTL传输功能
- 在MPLS域的入口:将IP头部的TTL值拷贝到标签头部
- 在MPLS域的出口:将标签头部的TTL值拷贝回IP头部
- Cisco路由器默认激活TTL传输功能
- MPLS MTU
- 接口下:mpls mtu bytes
- 因为在二层头部与三层头部之间插入了标签,所以在标签交换过程中,需要在接口加大或减小MTU
- 配置MPLS MTU可以增加局域网接口支持巨型帧的能力,从而阻止数据包分片
- 并不是所有交换机都支持巨型帧的转发
- 在OSPF环境中部署MPLS
- 在BGP环境部署MPLS
- LDP默认不会为BGP路由分配标签,默认压下一跳的标签。
- 部署了MPLS,核心的路由器可以不运行BGP。
- 核心网,边界设备建邻居的时候,要么使用环回接口,要么使用域外接口,一旦用域内接口建立邻居就可以将标签提前弹出。