GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP 和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中传输。

在大多数常规情况下,系统拥有一个有效载荷(或负载)包,需要将它封装并发送至某个目的地。首先将有效载荷封装在一个 GRE 包中,然后将此 GRE 包封装在其它某协议中并进行转发。此外发协议即为发送协议。当 IPv4 被作为 GRE 有效载荷传输时,协议类型字段必须被设置为 0x800 。当一个隧道终点拆封此含有 IPv4 包作为有效载荷的 GRE 包时, IPv4 包头中的目的地址必须用来转发包,并且需要减少有效载荷包的 TTL 。值得注意的是,在转发这样一个包时,如果有效载荷包的目的地址就是包的封装器(也就是隧道另一端),就会出现回路现象。在此情形下,必须丢弃该包。当 GRE 包被封装在 IPv4 中时,需要使用 IPv4 协议 47 。

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

GRE包接收过程:

接收过程,即 router B 上面进行的操作。这里需要指出的一点是,GRE tunnel 自己定义了一个新的 IP proto,也就是 IPPROTO_GRE。当 router B 收到从 router A 过来的这个包时,它暂时还不知道这个是 GRE 的包,它首先会把它当作普通的 IP 包处理。因为外部的 IP 头的目的地址是该路由器的地址,所以它自己会接收这个包,把它交给上层,到了 IP 层之后才发现这个包不是 TCP,UDP,而是 GRE,这时内核会转交给 GRE 模块处理。

ipgre_rcv() 所做的工作是:通过外层IP 头找到对应的 tunnel,然后剥去外层 IP 头,把这个“新的”包重新交给 IP 栈去处理,像接收到普通 IP 包一样。到了这里,“新的”包处理和其它普通的 IP 包已经没有什么两样了:根据 IP 头中目的地址转发给相应的 host。

注:在这里可以把gre当做L4层协议。

Linux kernel函数调用分析:

gre tunnel源码分析之接收流程相关推荐

  1. GRE tunnel源码分析之发送流程

    GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP 和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中 ...

  2. openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...

  3. 基于TCP网络通信的自动升级程序源码分析-客户端接收文件

    升级程序客户端接收文件 /// <summary>/// 文件数据缓存 索引是 ConnectionInfo对象 数据包的顺序号 值是数据/// </summary>Dicti ...

  4. Android 音频源码分析——音量调节流程

    源码分析基于android9.0 一.声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体.铃声.闹钟.通话,但是其系统内部则分为十几种类型. 声⾳类型用来区分不同播放用 ...

  5. Nginx源码分析:启动流程

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...

  6. kubernetes源码分析-pod创建流程

    前言 首先放一张kubernetes的架构图.其中apiserver是整个架构的信息交互中心.所有组件都会与apisever交互. kubernetes中,每个node都部署了一个kubelet,通过 ...

  7. Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程

    基于QuickStart中的一个demo来分析 from flask import Flaskapp = Flask(__name__)@app.route("/") def he ...

  8. Kubelet源码分析(一):启动流程分析

    源码版本 kubernetes version: v1.3.0 简介 在Kubernetes急群众,在每个Node节点上都会启动一个kubelet服务进程.该进程用于处理Master节点下发到本节点的 ...

  9. MMKV_微信MMKV源码分析(一) | 整体流程

    在使用MMKV框架前,需调用以下方法进行初始化 MMKV.initialize(context); 复制代码 这里的 Java 层主要是获取到保存文件的路径,传入Native层,这里默认的路径是APP ...

最新文章

  1. window10 系统上 ecplise 环境搭建
  2. SAP EWM - 物料主数据 - EWM系统包装视图属性
  3. mysql分页与分页性能查询优化
  4. iOS子线程操作总结
  5. POJ - 2942 Knights of the Round Table(点双缩点+二分图判定)
  6. 如何在SAP Server Side JavaScript里消费destination
  7. java long类型转string_JavaSE的学习——数据类型
  8. 你的护城河在哪?老程序员的一些2016感悟
  9. 网站漏洞修复方案防止SQL注入攻击漏洞
  10. 寻找三角形(编程题)
  11. 2016.01.10 论文扩充、精修、查重
  12. # 每天阅读一个 npm 模块(7)- delegates
  13. xshell连接虚拟机(后续)
  14. python读取图片转cvs_python将图片转换为csv
  15. Gridview DetailView
  16. Java的测试方法有哪些?自动化测试让Java测试变得更简单!
  17. 软件测试-黑盒测试方法(一)---等价类划分、边界值、因果图、判定表
  18. 迈信EP100伺服驱动器方案
  19. 换个角度理解Android的AIDL原理
  20. 关于学期结束的一些题目的记录

热门文章

  1. for循环中一个不容小觑的问题
  2. Linux 帐户管理
  3. 2011年2月--2011年7月数据库性能优化过程
  4. adc0832对光电二极管进行数据采集_一种基于光电二极管的麦克风跟踪检测电路的制作方法...
  5. 顶层 pom 中的 dependencies 与 dependencyManagement 区别
  6. 数据仓库、商业智能的体系结构
  7. honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
  8. 镀铬亮条怎么修复_老车修复:翻新小改一辆破烂不堪的经典MINI,完美大变样...
  9. linux下pcre编译,linux下交叉编译lighttpd以及pcre
  10. ethercat主站给从站分配多个地址_Profinet 与 EtherCAT 网关使用方法