gre tunnel源码分析之接收流程
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源码分析之接收流程相关推荐
- GRE tunnel源码分析之发送流程
GRE(Generic Routing Encapsulation,通用路由封装)协议是对某些网络层协议(如IP 和IPX)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IP)中 ...
- openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor
monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...
- 基于TCP网络通信的自动升级程序源码分析-客户端接收文件
升级程序客户端接收文件 /// <summary>/// 文件数据缓存 索引是 ConnectionInfo对象 数据包的顺序号 值是数据/// </summary>Dicti ...
- Android 音频源码分析——音量调节流程
源码分析基于android9.0 一.声音类型 对于大多数手机用户来说,操作手机音量按键可以看到,声音类型分为四种:媒体.铃声.闹钟.通话,但是其系统内部则分为十几种类型. 声⾳类型用来区分不同播放用 ...
- Nginx源码分析:启动流程
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> nginx简介 Nginx的作为服务端软件,表现的主要特点是更快.高扩展.高可靠性.低内存消 ...
- kubernetes源码分析-pod创建流程
前言 首先放一张kubernetes的架构图.其中apiserver是整个架构的信息交互中心.所有组件都会与apisever交互. kubernetes中,每个node都部署了一个kubelet,通过 ...
- Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程
基于QuickStart中的一个demo来分析 from flask import Flaskapp = Flask(__name__)@app.route("/") def he ...
- Kubelet源码分析(一):启动流程分析
源码版本 kubernetes version: v1.3.0 简介 在Kubernetes急群众,在每个Node节点上都会启动一个kubelet服务进程.该进程用于处理Master节点下发到本节点的 ...
- MMKV_微信MMKV源码分析(一) | 整体流程
在使用MMKV框架前,需调用以下方法进行初始化 MMKV.initialize(context); 复制代码 这里的 Java 层主要是获取到保存文件的路径,传入Native层,这里默认的路径是APP ...
最新文章
- window10 系统上 ecplise 环境搭建
- SAP EWM - 物料主数据 - EWM系统包装视图属性
- mysql分页与分页性能查询优化
- iOS子线程操作总结
- POJ - 2942 Knights of the Round Table(点双缩点+二分图判定)
- 如何在SAP Server Side JavaScript里消费destination
- java long类型转string_JavaSE的学习——数据类型
- 你的护城河在哪?老程序员的一些2016感悟
- 网站漏洞修复方案防止SQL注入攻击漏洞
- 寻找三角形(编程题)
- 2016.01.10 论文扩充、精修、查重
- # 每天阅读一个 npm 模块(7)- delegates
- xshell连接虚拟机(后续)
- python读取图片转cvs_python将图片转换为csv
- Gridview DetailView
- Java的测试方法有哪些?自动化测试让Java测试变得更简单!
- 软件测试-黑盒测试方法(一)---等价类划分、边界值、因果图、判定表
- 迈信EP100伺服驱动器方案
- 换个角度理解Android的AIDL原理
- 关于学期结束的一些题目的记录
热门文章
- for循环中一个不容小觑的问题
- Linux 帐户管理
- 2011年2月--2011年7月数据库性能优化过程
- adc0832对光电二极管进行数据采集_一种基于光电二极管的麦克风跟踪检测电路的制作方法...
- 顶层 pom 中的 dependencies 与 dependencyManagement 区别
- 数据仓库、商业智能的体系结构
- honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
- 镀铬亮条怎么修复_老车修复:翻新小改一辆破烂不堪的经典MINI,完美大变样...
- linux下pcre编译,linux下交叉编译lighttpd以及pcre
- ethercat主站给从站分配多个地址_Profinet 与 EtherCAT 网关使用方法