GRE
2024-09-07 16:57:44
第一个技术是GRE,全称Generic Routing Encapsulation,它是一种IP-over-IP的隧道技术。它将IP包封装在GRE包里,外面加上IP头,在隧道的一端封装数据包,并在通路上进行传输,到另外一端的时候解封装。你可以认为Tunnel是一个虚拟的、点对点的连接
在GRE头中,前32位是一定会有的,后面的都是可选的。在前4位标识位里面。这里面有个很重要的key字段,是一个32位的字段,里面存放的往往就是用于区分用户的Tunnel ID。32位
下面的格式类型专门用于网络虚拟化的GRE包头格式,称为NVGRE,也给网络ID号24位,也完全够用了。除此之外,GRE还需要有一个地方来封装和解封装GRE的包,这个地方往往是路由器或者有路由功能的Linux机器。使用GRE隧道,传输的过程就像下面这张图。这里面有两个网段、两个路由器,中间要通过GRE隧道进行通信。当隧道建立之后,会多出两个Tunnel端口,用于封包、解封包。
- 主机A在左边的网络,IP地址为192.168.1.102,它想要访问主机B,主机B在右边的网络,IP地址为192.168.2.115。于是发送一个包,源地址为192.168.1.102,目标地址192.168.2.115。因为要跨网段访问,于是根据默认的default路由表规则,要发给默认的网关192.168.1.1,也即左边的路由器。
- 根据路由表,从左边的路由器,去192.168.2.0/24这个网段,应该走一条GRE的隧道,从隧道一端的网卡Tunnel0进入隧道。
- 在Tunnel隧道的端点进行包的封装,在内部的IP头之外加上GRE头。对于NVGRE来讲,是在MAC头之外加上GRE头,然后加上外部的IP地址,也即路由器的外网IP地址。源IP地址为
172.17.10.10,目标IP地址为172.16.11.10,然后从E1的物理网卡发送到公共网络里。 - 在公共网络里面,沿着路由器一跳一跳地走,全部都按照外部的公网IP地址进行。
- 当网络包到达对端路由器的时候,也要到达对端的Tunnel0,然后开始解封装,将外层的IP头取下来,然后根据里面的网络包,根据路由表,从E3口转发出去到达服务器B。
从GRE的原理可以看出,GRE通过隧道的方式,很好地解决了VLAN ID不足的问题。但是,GRE技术本身还是存在一些不足之处。
1、首先是Tunnel的数量问题。GRE是一种点对点隧道,如果有三个网络,就需要在每两个网络之间建立一个隧道。如果网络数目增多,这样隧道的数目会呈指数性增长。
2、GRE不支持组播,因此一个网络中的一个虚机发出一个广播帧后,GRE会将其广播到所有与该节点有隧道连接的节点。
3、有很多防火墙和三层网络设备无法解析GRE,因此它们无法对GRE封装包做合适地过滤和负载均衡。
最新文章
- Intellij IDEA 初级学习文章
- CSS中id与class命名规则及编码最佳习惯
- 直观友好的单个memcache监控工具:phpmemcache.php
- kindeditor 操作时同步到textarea
- android学习笔记六
- OC3-父类指针指向子类对象
- Swift - 实现点击UITableView单元格时自动展开单元格
- Cocos2dx 3.x创建Layer的步骤
- SQL注入相关的知识【Mysql为例子】
- PHP读取XML文件
- 20175316 盛茂淞 Arrays和String单元测试
- Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getClassLoader()Ljava/lang/ClassLoader;
- Javaweb学习笔记——(四)——————JavaScript基础&DOM目录
- 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)
- iOS-利用插件实时刷新模拟器(提高效率)
- 综合:bool类型 命名空间 输入输出
- js+Ajax,Get和Post在使用上的区别
- 有用的Python代码片段
- 数据解压及if else的应用
- mysql 随机取数据