在上图中,关于PC-A和PC-B之间互相访问的过程中

1、所有三层网络设备形成源和目的的路由条目

2、PC-A发出报文,source-IP为A,destination-IP为B

3、R1收到报文后,根据目的IP检查自己的路由表,查询得到出接口,将数据包从出接口发出

4、R2、R3同样如此,一直讲数据包传递到PC-B

5、PC-B做出回包,沿反方向传回数据

其中省略了二层mac地址的ARP查询和重写数据帧的内容

简而言之:IP数据报文在传递的过程中,根据目的IP地址,查询路由表,得到出接口将数据发出,源目的IP地址保持不变,mac地址逐跳改写

上面这个是我们耳熟能详的IP转发原理

其中我们为了方便理解,隐藏了其在转发过程中真实的一幕,即路由器收到IP报文时,查询的其实并不是路由表(RIB),而是转发表(LIB)

我们需要复习一下在NP交换部分所讲过的交换工作原理

最早期,交换机在交换数据帧时采用的交换方式我们称之为进程交换,所有的报文在交换时都需要经过CPU查询处理,导致交换效率一直无法提升

随后,新一代交换方式出现,即采用数据流的交换方式,我们将源目的IP、源目的mac、源目的端口及入接口都相同的流量称为同一个数据流,交换机在处理这些数据时,只需要对第一个报文使用CPU进行查询,后续的所有报文全都按照第一个报文的交换方式进行处理,大大提高了交换效率

而cisco根据数据流交换方式推出了自己独有的交换方式,在进程交换中,存在一个问题,即只有有流量触发后才会产生出对应的交换缓存,如果是处理大量不同数据流时,其实交换效率和进程交换一样慢;为了解决这个问题,cisco将其优化改进,利用交换机的闲时资源,提前计算出可能会收到的数据流的转发信息,将其载入缓存,当收到数据流时,直接使用预先缓存的转发信息处理报文,实现了正真的基于硬件的交换方式,cisco把这种方式成为思科特快转发(CEF)

正是由于CEF的高效,cisco在新的路由产品中也移植了这个功能,所以现在大家所能接触到的思科设备都具备CEF功能

而我们所谓的转发表其实就是CEF表,CEF表示根据路由表产生的,其不像路由表有大量的递归内容,CEF表中显示的就是一个数据包如果匹配中其下一步应该从哪个接口发出,简单高效

比如下面的这个路由表(RIB):

路由就会出现需要递归查询的情况

而我们去看一下CEF表(FIB)

路由器在闲时会根据路由表的信息,提前计算好转发信息,收到去往4.4.4.4的数据包直接从出接口F0/0发出

这张表我们就叫做FIB:转发信息库

而FIB是根据路由表产生的,路由表我们称为RIB:路由信息库

设备在收到IP报文时,其查询的其实是FIB并不是RIB,如果将CEF功能关闭,这是才会查询RIB即路由表

以上是我们在NA、NP中所学的IP转发原理的内容,做一些补充

下面,我们开始揭开MPLS的神秘面纱,来看一看内里乾坤

MPLS(Multiprotocol Label Switch)最初是用来提高路由器的转发速度而提出的一个协议,但随着技术发展,设备转发性能越来越强,其加快转发速度的优势逐渐弱化,而多层MPLS报头嵌套的设计成为了其最出彩的地方

目前用得比较多的场景主要是解决BGP路由黑洞问题和MPLS VPN数据转发

首先,我们需要对MPLS有个大概的认识,MPLS在传递报文时会在二层帧头和三层报头中间插入MPLS报头,所以很多人叫它2.5层

他的报文结构比IP报头简单得多,也小地多,只有4个字节(32bits)

结构如下:

前20位位标签位,用于表示当前的标签

EXP协议中未作定义,一般用作COS

S为栈底位,用于表示该MPLS报头是否为最后一个MPLS报头

TTL相信不用解释了

如此简单的接口我相信你看过一次就能记住,同样,设备在处理MPLS报文时也会比IP报文处理效率更高

在MPLS中有一些专业术语必须要了解

FEC:

Forwarding Equivalence Class,FEC(转发等价类),是在转发过程中以等价的方式处理的一组数据分组。

可以通过地址、隧道、COS等来标识创建FEC,

目前看到的MPLS中只是一条路由对应一个FEC。通常在一台设备上,对一个FEC分配相同的标签。

标签(Label)

是一个比较短的,定长的,通常只具有局部意义的标识(类似mac地址),这些标签通常位于数据链路层的数据链路层封装头和三层数据包之间,标签通过绑定过程同FEC相映射,即一个FEC对应一个标签。

LSP:

标签交换通道。一个FEC的数据流,在不同的节点被赋予确定的标签,数据转发按照这些标签进行。数据流所走的路径就是LSP。

LSR:

Label Switching Router,LSR是MPLS的网络的核心交换机,它提供标签交换和标签分发功能。

LER:

Label Switching Edge Router,在MPLS的网络边缘,进入到MPLS网络的流量由LER分为不同的FEC,并为这些FEC请求相应的标签。它提供流量分类和标签的映射、标签的移除功能。

了解了上面这些专业术语,那么我们研究一下数据是如何通过MPLS进行传递的,和IP之间有什么区别:

在上图中,我们需要解决几个问题:

标签是怎么产生的?

IP报文是怎么变成MPLS报文的?

报文是如何从源传递到目的的?

标签是怎么产生的?

为每一条路由产生一个唯一标签(local标签,也叫 in标签)

将这些标签传递给MPLS的邻居(remote标签,也叫out标签)

IP报文是怎么变成MPLS报文的?

在LER上,压入标签(根据IP报文的目的IP地址所对应的路由的标签)

报文是如何从源传递到目的的?

A发出IP报文,R1收到后查询FIB,得知需要压入标签

R1将报文转发给R2,R2收到MPLS报文,查询LFIB表中in标签,将原有的标签替换成现在这个in标签对应的out标签值

到达R3后,查询in标签,发现对应out标签为pop,则弹出最顶层标签,还原成IP报文,转发给R4

R4收到IP报文后,查询FIB表,将报文转发给B

其中涉及到几个动作:

push压入:为报文添加MPLS报头

swap替换:根据in标签查询的结果,将标签替换成out标签的值

pop 弹出:将最顶层的MPLS报头移除

untag 弹出:将所有MPLS报头都移除

PHP机制:倒数第二跳弹出,减少最后一条设备的查表次数

如果没有倒数第二跳弹出机制,在最后一条设备上才弹出标签,则在最后一条设备上首先需要查询LFIB表,得知需要弹出标签,弹出标签后变成IP报文,需要再次查询FIB表,共需要查询2次,而在倒数第二跳设备上弹出,变成IP报文后,最后一条设备就只需查询FIB表即可,只查一次

MPLS基础一(上)的更多相关文章

  1. 从零开始学Python第一周:Python基础(上)

    Python语法基础(上) 一,Python的变量 (1)创建变量 变量的含义:存储信息的地方 创建变量并赋值 x = 1 print x x = 123 #再次赋值 print x (2)使用变量 ...

  2. Web前端-Ajax基础技术(上)

    Web前端-Ajax基础技术(上) ajax是浏览器提供一套的api,用于向服务器发出请求,接受服务端返回的响应,通过javascript调用,实现通过代码控制请求与响应,实现网络编程. ajax发送 ...

  3. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  4. 《C#从现象到本质》读书笔记(二)第2章 C#类型基础(上)

    <C#从现象到本质>读书笔记第二篇 第2章 C#类型基础(上) 类型指的是集合{类,结构,接口,枚举,委托}中的任意一个成员.任何拥有某类型的值(value)称为某类型的一个实例(inst ...

  5. 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(上)

    第1章.基础篇(上) Abstract:文档树.节点操作.属性操作.样式操作.事件 DOM (Document Object Model) - 文档对象模型 以对象的方式来表示对应的html,它有一系 ...

  6. Docker基础(上)

    Docker基础(上) 链接:https://pan.baidu.com/s/1KQjKml2OZAReYwOvpWD9XQ 提取码:6vo8 复制这段内容后打开百度网盘手机App,操作更方便哦 1. ...

  7. SpringBoot图文教程「概念+案例 思维导图」「基础篇上」

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 每个知识点配套自测面试题,学完技术自我测试 本文初学向,所以希望文中所有的代码案例都能敲一遍 大哥大姐 ...

  8. Java线程核心基础(上)

    Java线程核心基础(上) 一.实现多线程 根据Oracle官方文档,目前推荐的创建线程方法主要有两种,分别是继承Thread类和实现Runnable接口.通过阅读Thread类源码,可以发现二者不同 ...

  9. Java基础 (上)

    基础概念与常识 Java 语言有哪些特点? 简单易学: 面向对象(封装,继承,多态): 平台无关性( Java 虚拟机实现平台无关性): 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操 ...

随机推荐

  1. nginx配置Strict Transport Security

    一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://zt.test.com或者直接zt.test.com.这样存在中 ...

  2. webform CustomValidator

    https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.customvalidator?view=netframew ...

  3. MongoDB 副本集和C#交互,简单测试

    MongoDB 副本集和C#交互,简单测试 primary节点宕机: 模拟primary节点宕机的情况,这时查看监控: 可以看到37018已经成了primary节点.主界面宕机导致了整个集群发生一次e ...

  4. 使用@Named注解绑定多个实现(java,scala)

    版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=330 排版乱?请移步原文获得更好的阅读体验 1.背景 最近项目中使用了guice作为依赖注入的框架.碰到一个如下 ...

  5. 分析ReentrantLock的实现原理

    http://www.jianshu.com/p/fe027772e156 什么是AQS AQS即是AbstractQueuedSynchronizer,一个用来构建锁和同步工具的框架,包括常用的Re ...

  6. python的变量,对象的内存地址以及参数传递过程

    作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c+ ...

  7. shell 条件语句

    shell 条件语句 #!/bin/bash # 条件语句 NUM1=100 NUM2=200 if (($NUM1 > $NUM2));then echo "$NUM1 greate ...

  8. Android显示框架:自定义View实践之绘制篇

    文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...

  9. java:历史回顾

    1.String和StringBuffer区别 2.Runtime和System类,包括对象垃圾收集 Rumtime.gc() System.gc() 调用的其实就是Runtime的gc回收 3.da ...

  10. Python面向过程和面向对象基础

    总结一下: 面向过程编程:根据业务逻辑从上到下的写代码-----就是一个project写到底,重复利用性比较差 函数式:将某些特定功能代码封装到函数中------方便日后调用 面向对象:对函数进行分类 ...