GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(IPX, AppleTalk, IP,etc.)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输。这是GRE最初的定义,最新的GRE封装规范,已经可以封装二层数据帧了,如PPP帧、MPLS等。在RFC2784中,GRE的定义是“X over Y”,X和Y可以是任意的协议。GRE真的变成了“通用路由封装”了。

GRE采用了Tunnel(隧道)技术,是VPN(Virtual Private Network)的第三层隧道协议。Tunnel是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel的两端分别对数据报进行封装及解封装。

GRE加封装过程如下:

1、Router A 收到X 协议报文后,首先交由X 协议处理

  2、X 协议检查报文头中的目的地址域来确定如何路由此包

  3、若报文的目的地址要经过Tunnel 才能到达,则设备将此报文发给相应的Tunnel 接口

  4、Tunnel 口收到此报文后进行GRE 封装,在封装IP 报文头后,设备根据此IP 包的目的地址及路由表对报文进行转发,从相应的网络接口发送出去。

5、Router A根据封装的IP报文头的目的地址,查找路由表,对封装后的报文进行转发。

GRE协议实际上是一种封装协议,它提供了将一种协议的报文封装在另一种协议报文中的机制,使报文能够在异种网络中传输。异种报文传输的通道称为tunnel(隧道)。GRE隧道不能配置二层信息,但可以配置IP地址。GRE利用为隧道指定的实际物理接口完成转发,转发过程如下:

  (1) 所有发往远端VPN的原始报文,首先被发送到隧道源端;

  (2) 原始报文在隧道源端进行GRE封装,填写隧道建立时确定的隧道源地址和目的地址,然后再通过公共IP网络转发到远端VPN网络。

GRE封装后的报文格式:

[Delivery header(Transport protocol)]——[GRE header(Encapsulation protocol)]——[Payload header(Passenger potrocol)]

图1.GRE协议栈

图2.GRE封装格式

GRE解封装过程:与加封装过程相反

(1)RouterB 从Tunnel 接口收到IP报文,检查目的地址
(2)如果发现目的地是本路由器,则RouterB 剥掉此报文的IP 报头,交给GRE 协议处理(进行检验密钥、检查校验和及报文的序列号等)
(3)GRE 协议完成相应的处理后,剥掉GRE 报头,再交由X 协议对此数据报进行后续的转发处理。

注:GRE收发双方的加封装、解封装处理,以及由于封装造成的数据量增加,会导致使用GRE后设备的数据转发效率有一定程度的下降。

总结起来,GRE的封装过程如下:当报文需要经由隧道接口处理时,IP层的输出函数调用tunnel接口的输出函数进行加封装处理。加封装处理结束后,再进行IP转发。GRE隧道对端的解封装过程如下:当IP层接收到GRE报文,检查到外层IP报文头部中的协议号是47时(UDP为17,TCP为6,ICMP为1),那么,IP层输入入口函数会根据协议开关表,直接调用GRE的解封装处理函数,对GRE解封装。解封装完成后,再将原始数据报文送入IP输入队列中,以便进行进一步的传输。

转自:http://www.pbsvpn.com/article/20150330110849.html

参考:http://baike.baidu.com/view/3871502.htm#3

GRE封装解封装过程的更多相关文章

  1. FFmpeg音视频解封装

    一 . 解封装用到的函数和结构体 1.av_register_all() : open 一次就调用一次 2.avformat_network_init() : 网络模块初始化 3.avformat_o ...

  2. sk_buff封装和解封装网络数据包的过程详解

    转自:http://www.2cto.com/os/201502/376226.html 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  3. sk_buff封装和解封装网络数据包的过程详解(转载)

    http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  4. FFmpeg(二) 解封装相关函数理解

    一.解封装基本流程 ①av_register_All()////初始化解封装,注册解析和封装的格式. ②avformat_netword_init()//初始化网络,解析rtsp协议 ③avforma ...

  5. FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux

    Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...

  6. C#-面向对象的三大特性——封装(封装成员变量、封装成员方法)

    封装: 封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型. 封装的意义在于保护或者防止代码(数据)被我们无意中破坏. 封装既可以封装成员变量,又可以封装成 ...

  7. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  8. 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)

    094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  9. 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)

    093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

随机推荐

  1. openssl可以实现:秘钥证书管理、对称加密和非对称加密

     openssl enc -e -aes-128-cbc -iv 0102030405060708 -K 1234567890123456 -in input.xml -out output.xml( ...

  2. php xml格式对象 返回->对应格式数组

    /*     * $objXml xml格式对象      * 返回 : 对应格式数组     */    public function XmlString2Arr($xml)    {       ...

  3. docker 导出导入镜像

    1.docker export jenkins > my_jenkins.tar   导出镜像到本地 cat my_jenkins | docker import my_jenkens:0.0. ...

  4. ESlint开发环境配置

    ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码的一致性和避免错误,是JS开发过程中极佳工具,这篇文章将以WebStorm为例告诉你如 ...

  5. Java 接口 Cloneable

    Cloneable接口的目的是作为对象的一个mixin接口,表明这样的对象允许克隆.如果一个类实现了Cloneable接口,Object的clone方法就返回该对象的逐域拷贝,相当于无需调用构造器就可 ...

  6. 单元测试-unittest

    一.简介 unittest单元测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. 二.属性介绍 1.unittest模块的各个属性 unittest.Tes ...

  7. JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...

  8. ionic中android的返回键

    ionic中android的返回键 在ionic框架中已经注册了几个返回事件,分别是 view sideMenu modal actionSheet popup loading 他们的优先级分别是 v ...

  9. increase the minSdkVersion to 26

    AGPBI: {"kind":"error","text":"Invoke-customs are only supported ...

  10. k8s应用首页临时改成升级维护页面

    在本地虚拟机 产生一个nginx配置文件 [root@centos-01 dockerfile]# cat weifeng_maintain.conf server { listen 443; ser ...