由于BGP设备之间是通过TCP协议实现的跨设备互联, 所以在两台BGP设备之间的其他设备是没有配置BGP协议的, 因此中间的其他设备很可能无法学习到BGP的路由信息(虽然可以通过静态引入或者路由协议引入, 但是会导致路由表大幅扩大), 引起数据丢失, 这种现象就称为BGP黑洞.
在早年设备性能低下的时期, 路由表查询速度不高导致转发性能低下, 旨在提高路由器转发速度的MPLS(Multi-Protocol Label Switching, 多协议标签交换)被提出, 与传统IP路由方式相比, MPLS在数据转发时, 只在网络边缘分析IP报头, 在网络内部采用更为高效的标签(Label)转发, 节约了处理时间.
随着硬件设备性能不断提升, MPLS在提高数据转发速度上的优势逐渐弱化, 但是其支持多层标签嵌套和设备内转控分离的特点, 使其在VPN(Virtual Private Network, 虚拟私有网络)、流量工程、QoS(Quality of Service, 服务质量)等新兴应用中得到青睐. 同样, MPLS也是医治BGP黑洞的一剂良药.
MPLS(Multi-Protocol Label Switching, 多协议标签交换)是一种IP骨干网技术, MPLS在无连接的IP网络上引入面向连接的标签交换概念, 将第三层路由技术和第二层交换技术相结合, 充分发挥了IP路由路径选择的灵活性和二层交换mac转发的简洁性.
MPLS起源于IPv4, 但同样支持IPv6、IPX等多种协议.
MPLS并非一种业务或者应用, 它实际上可以看做一种隧道技术, 这种技术不仅支持多种高层协议与业务, 而且在移动程度上可以保证信息传输的安全性.
MPLS在数据链路层将网络层的报文进行封装, 在IP报头前增加一或多个MPLS头部, 然后再封装一个二层报头, 可以将它称为"2.5层协议"
报文内容 | 长度 | 说明 |
---|---|---|
Label(标签头部) | 20bit | 唯一标识去往同一目的地址的报文分组, 只有本地意义 |
Exp | 3bit | 扩展位, 现通常为CoS(Class of Service), 在设备阻塞时发送优先级高的报文 |
S | 1bit | 栈底标识, MPLS为多层标签, S=1表示为最底层标签, 即最靠近IP报头的那个MPLS头部 |
TTL | 8bit | 同IP报文中的TTL |
Label可以分为三类
标签类型 | 取值范围 | 说明 |
---|---|---|
特殊标签 | 0 -> 15 | 意义特殊, 我在下边展开讲讲 |
静态标签 | 16 -> 1023 | 手工配置的MPLS标签 |
动态标签 | 1024 -> (10^20)-1 | 协议动态分配的MPLS标签 |
特殊标签:
靠近二层头部的称为顶层MPLS标签, 靠近IP报头的称为底层MPLS标签.
如果是在MPLS网络中转发, 那么二层报头的上层协议类型应该为MPLS协议
如果是在IP网络中进行转发, 那么二层报头的上层协议类型应该为IP协议
MPLS基于标签进行转发, 进行标签交换和报文转发的网络设备称为LSR(Label Switching Router,标签交换路由器), 由LSR构成的网络区域称为MPLS域(MPLS Domain), 那些位于MPLS域边缘的LSR称为LER(Label Edge Router, 边缘路由器), 区域内部的LSR称为核心LSR(Core LSR).
MPLS是一种报文封装方式而非一种协议.
当IP报文进入MPLS网络时, MPLS入口的LER分析IP报文内容并且为这些IP报文添加上合适的标签, 以供核心LSR根据标签进行转发; 当IP报文离开MPLS网络时, 出口LER会弹出标签.
IP报文在MPLS我拿过来中经过的路径称为LSP(Label Switched Path, 标签交换路径), LSP是一个单向路径, 与数据流的方向一致, 如下图LSP的入口LER被称为入节点(Ingress), 位于LSP中间的LSR被称为中间节点(Transit), LSP出口的LER称为出节点(Egress); 根据LSP的方向, MPLS报文由Ingress发往Egress, 按照LSP的方向划分为上下游节点.
注: 其实很多三层交换机也支持MPLS
控制平面: 负责产生和维护路由信息/标签信息.
转发平面: 即数据平面, 负责报文的转发.
注: 如果是普通IP网络中转发信息表FIB是直接由路由信息表生成, MPLS网络中的边缘设备LER才需要结合路由信息表RIB和标签分发协议LDP来生成转发信息表FIB
MPLS将具有相同特征的报文归为一类, 称为转发等价类FEC(Forwarding Equivalence Class). 属于相同FEC的报文在转发过程中被LSR相同方式处理.
FEC可以根据源地址、目的地址、源端口、目的端口、VPN等要素进行划分.
举个例子, 在传统IP转发中, 到同一条路由的所有报文就是一个转发等价类, 这就是基于目的地址的一个分类.
建立LSP的两种方式:
以上图为例, 首先在网络中运行OSPF用于建立路由信息库, 然后建立MPLS网络, 无论是静态还是动态网络, 对于去往X网络来说, RTA为入口节点, 是上游节点, RTD为出口节点, 是下游节点, RTB和RTC为核心LSR
同理, 对于RTC而言, 它会向RTB发送一个去往X网络的标签C, 使得RTB想要去往X网络时, 能够直接将数据按照Label=C向RTC发送.
由于静态LSP的Label字段只有本地意义, 所以只需要本地的多个Label标签不重复就行, 比如上图可以B=C=D=100.
总结: 标签Label自下游向上游发送, 数据自上游向下游转发
类比静态路由, 静态LSP适合拓扑结构简单而稳定的网络环境
特点:
对于ingress
static lsp ingress test destination 100.1.1.0 24 nexthop 192.168.1.2 out-label 100
创建名为test的静态lsp, 目的网络时100.1.1.0 24, 下一跳为192.168.1.2, 标签值为100
对于transit
static lsp transit test incoming-interface g0/0/0 in-label 100 nexthop 192.168.2.3 out-label 200
创建名为test的静态lsp, 与上游设备连接的接口是g0/0/0, 入标签为100, 下一跳为192.168.2.3 , 出标签为200
对于egress
static lsp egress test incoming-interface g0/0/0 in-label 200
创建名为test的静态lsp, 与上游设备连接的接口是g0/0/0, 入标签为200
LDP(Label Distribution Protocol, 标签分发协议)是多协议标签交换MPLS的一种控制协议, 相当于传统网络中的信令协议, 负责转发等价类FEC的分类、标签分配以及标签交换路径LSP的建立和维护, LDP规定了标签分发过程中的各种情况以及相关处理.
通过LDP协议, LSR可以把网络层的路由信息直接映射到数据链路层的交换路径上, 动态建立起网络层LSP.
目前, LDP作为一种应用层协议(TCP/UDP port = 646), 广泛应用在VPN服务上, 具有组网、配置简单、支持基于路由动态建立LSP、支持大容量LSP等特点.
思科私有的TDP协议为(TCP/UDP port = 711).
相互之间存在LDP会话且用LDP交换标签信息的两台LSR, LDP对等体通告它们之间的LDP会话获得对方的标签.
当一台LSR接收到对端发送来的Hello消息后LDP邻接体建立, 是对等体的前提.
LDP的邻接体存在两种类型:
LDP通过邻接体来威威虎对等体的存在, 对等体的类型取决于维护它的邻接体的类型, 一个对等体可以由多个邻接体来维护, 如果本地邻接体与远端邻接体两者来维护, 则对等体类型为本远共存对等体.
LDP会话用于LSR之间交换标签映射、释放等信息, 只有存在对等体才能建立LDP会话, LDP会话同样分分为两种类型:
本地LDP会话和远端LDP会话可以共存, 这里两个keepalive的发送周期是15s, 老化45s老化
LDP协议主要使用四类消息
消息类型 | 作用 | 举例 | 协议 |
---|---|---|---|
发现(Discovery) | 通告和维护网络中LSR的存在 | Hello消息 | UDP |
会话(Session) | 建立、终止和维护LDP对等体之间的会话 | Initialization消息、keepalive消息 | TCP |
通告(Advertisement) | 创建、改变和删除FEF的标签映射 | Label Mapping Message消息 | TCP |
通知(Notification) | 提供建议性消息和差错通知 | TCP |
两台设备互相发送Hello消息, 携带有本设备的MPLS LSR-ID, 这个LSR-ID通常为设备对应接口的的源IP地址, 也叫传输地址(Transport Address);
LSR-ID大的一方发起TCP三次握手建立TCP连接;
建立完TCP连接后, 由LSR-ID大的一方发起会话初始化消息(Initialization)进行参数协商(LDP版本、标签发布方式、时间、标签分发空间和PDU长度), 对方如果同意则回复初始化消息并发送一个keepalive消息进行确认, LSR-ID大的一方收到对方Initialization消息并同意协商之后也会回复一个keepalive消息, 此时会话建立成功.
如果协商失败或者会话期间出现错误则会直接回复一个notification消息, 并终端LDP会话.
会话建立成功后则进入标签分发模式
下游自主方式DU(Downstream Unsolicited):
对于特定的FEC, LSR无需从上游获得标签请求消息即进行标签分配与分发(默认模式).
如下图所示, 对于目的地址为192.168.1.1/32的FEC, 下游(Egress)通过标签映射主机箱上游(Transit)通告自己的主句路由192.168.1.1/32的标签.
下游按需方式DoD(Downstream on Demand):
对于一个特定的FEC, LSR获得标签的请求消息之后才进行标签分配与分发.
如下图所示, 对于目的地址为192.168.1.1/32的FEC, 上游(Ingress)向下游发送标签请求消息, 下游(Egress)收到标签请求消息后, 才会向上游发送标签映射消息.
具体可以看下图, 描述的还是比较详细的:
独立标签分配控制方式(Independent):
本地LSR可以自主地分配一个标签绑定到某个FEC, 通告给上游LSR, 无需等待下游的标签
结合标签发布方式:
独立+自主:
LSR无需等待下游的标签, 会直接向上游分发标签
独立+按需:
发送标签请求的LSR的直连下游会直接回应标签, 而不必等待来自最终下游的标签
有序标签分配控制方式(Ordered):
对于LSR上某个FEC的标签映射, 只有当该LSR已经具有次FEC下一跳的标签映射时, 或者该LSR就是此FEC的出节点时, 该LSR才可以像上游发送次FEC的标签映射(默认模式)
有序+自主(默认模式):
LSR只有收到下游的标签映射消息, 才会向上游分发标签
有序+按需:
发送标签请求的LSR至来年的下游只有收到最终下游(Egress)的标签映射消息, 才会向上游分发标签.
同样配一份图解:
标签保持方式制止LSR对收到的暂不需要的标签的处理方式.
LSR收到的标签映射可能来自下一跳邻居, 也可能来自非下一跳邻居.
自由标签保持方式(Liberal)(默认模式)
对于从邻居LSR收到的标签映射, 无论邻居LSR是不是自己的下一跳都保留, 在网络拓扑发生变化导致下一跳邻居改变时, LSR可以直接路由原来非下一跳邻居发来的标签快速重建LSP, 这种方法需要更多的内存和标签空间.
保守标签保持方式(Conservative)
对于从邻居LSR收到的标签映射, 只有的那个路径LSR是自己的下一跳时才保留, 在网络拓扑发生变化导致下一跳邻居改变时, LSR只保留来自原来下一跳邻居的标签, 所以重建LSP会比较缓慢, 但是可以节省内存和标签空间
目前支持的标签发布方式+标签控制方式+标签保持方式:
在现实网络中, 动态LSP应用更为广泛, 动态LSP通过LDP协议实现对FEC的分类、标签的分配以及LSP建立和维护的操作.
动态LSP的特点:
在动态LSP中, 由Egress根据路由表(图中由OSPF生成)自下而上向整条LSP分配Label
在设备上设置MPLS LSR-ID信息
mpls lsr-id 1.1.1.1
该LSR-ID默认情况下会被作为传输地址使用, 请确保这个地址能被MPLS内的设备ping通.
开启MPLS功能和LDP协议
mpls mpls ldp
在物理接口上开启MPLS功能和LDP协议
int g0/0/0 mpls mpls ldp
没了, MPLS的基本配置就123这么简单
验证MPLS
display mpls ldp session #查看会话是否建立成功(会话), op为正常状态 display mpls ldp lsp #查看LDP是否正常分配标签信息(标签数据库) display mpls lsp #查看当前设备LSP建立情况(转发表)
修改传输地址
int loop3 mpls ldp transport-address
建立远端邻接体
mpls ldp peer-remote test #邻接体命名 peer-remote 172.16.1.2 #邻接体地址
弹出的标签信息
mpls label advertise impicit-null #表示当前设备开启倒数第二跳弹出机制, 标签为3 label advertise expicit-null #表示当前设备开启最后一跳弹出机制, 标签为0或2 label advertise non-null #表示当前设备使用正常标签弹出机制, 标签为正常数值
标签转发的基本操作类型分为三种: 压入(Push)、交换(Swap)和弹出(Pop)
MPLS网络中, 数据包在每台路由器上根据已分配的标签进行标签封装和转发;
示例: 分析上图中数据包到达Egress节点的RTD上处理方式
先是标签分发:
假如此时RTA连接了一台PC设备, 该PC设备ping 100.1.1.1/32
如果MPLS域内流量很大, RTD的处理是否有存在不合理的地方?
PHP(Penultimate Hop Popping, 倒数第二跳弹出)
在倒数第二台设备将标签弹出, 使得Egress只需要查询FIB表而不用查看标签转发表, 减轻Egress的查表压力
默认情况下设备支持PHP特性, 支持PHP的Egress节点的标签值为3(即特殊标签值)
RTC的out label为3, 需要转发给Egress, 于是直接将标签pop弹出, 只保留IP报文信息并转发给RTD.
此时RTD的out label可能是特殊标签, 也可能是动态标签.
MPLS对TTL的处理除了为了防止环路之外, 同时也实现了traceroute功能
Uniform模式
IP报文经过MPLS网络时:
缺省情况下, MPLS对TTL的处理模式为Uniform.
Pipe模式
Uniform模式由于采用和IP一样的TTL处理模式, 所以很容易被黑客检测出内部的LSP路径, 处于安全考虑, Pipe模式(管道模式)被提出了
可以理解为: Uniform模式将两个TTL合并处理, Pipe模式将两个TTL分开处理.
修改TTL模式
undo ttl propagate #pipe模式 ttl propagate #uniform模式
BGP路由黑洞问题我在之前的博客有介绍过: HCIP-ICT实战进阶06-BGP基础, 想要回顾可以去瞄一眼
BGP路由黑洞: BGP能跨设备传递路由, 但数据转发需要逐台设备, 一旦网络路径上有设备未开启BGP, 就会导致需要该设备转发的数据被丢弃
在上述拓扑中, 可以看到BGP设备的连接情况: R1-EBGP-R2-IBGP-R5-EBGP-R6, 这四台设备上都有通过BGP学习到相互之间的路由, 但是在数据传输的过程中, 由于R3/R4并未开启BGP, 可能只有OSPF这样的IGP协议, 所以自然无法自动学习到R1和R6的地址, 会丢弃目的地址为R1和R6的数据包, 形成路由黑洞.
MPLS解决方案: 在AS200中启用MPLS
以AS100->AS300举例讲解: R2的BGP下一跳为R5, IGP下一跳为R3, 所以为R5分配一个标签值(假设3)给R3, 为R3分配标签值(假设为1024)给R2, 所以当R2需要向R5转发数据时, 查找LFIB表后push标签值为1024并转发给R3, R3push标签值3Bing转发给R5, 从而避免了R3丢弃数据包而造成的BGP路由黑洞.
这段时间被期末考和课设轮流轰炸, 所以这篇博客各个部分时间跨度还挺大的, 其实MPLS准确来说应当是HCIE的内容, 所以就当是提前准备HCIE了, 另外就是24届的实习岗已经陆续放出了, 一边是要去准备面试相关的东西, 一边又要经常去海拉鲁出差, 希望我能平衡好时间吧.