GRE基本原理
产生原因
骨干网中一般采用单一网络协议(例如IPv4)进行数据报文传输,但是不同的非骨干网上可能会使用不同网络协议(例如:IP、IPv6、IPX等)进行数据报文传输。由于骨干网与非骨干网使用的协议不同,这样将导致非骨干网之间无法通过骨干网传输数据报文。GRE协议通过实现一种协议封装另一种协议来解决这个问题。
如图3-1所示,group1和group2是运行Novell IPX的非骨干网,term1和term2是运行IPv6的非骨干网,中间的骨干网使用的是IPv4网络。为了实现group1和group2、term1和term2通过骨干网传输数据,可以在DeviceA和DeviceB之间采用GRE协议建立隧道,当数据报文从group1或term1发送至DeviceA后,将会被封装在一个GRE数据包中,所得的GRE数据包可以封装在IPv4协议中,然后被转发。
相关概念
GRE报文格式
系统收到需要进行封装和路由的某网络层协议(如IPX)数据时,将首先对其加上GRE报文头,使之成为GRE报文,再将其封装在另一协议(如IP)中。这样,此报文的转发就可以完全由IP协议负责。封装后的报文的格式如图3-2所示:
净荷(Payload):系统收到的需要封装和传输的数据报称为净荷。
乘客协议(Passenger Protocol):封装前的报文协议称为乘客协议。
封装协议(Encapsulation Protocol):上述的GRE协议称为封装协议,也称为运载协议(Carrier Protocol)。
传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。
例如一个封装在IP Tunnel中的IPX报文的格式可以表示为:
图3-3 Tunnel中传输IPX报文的格式
对于IPv6 GRE隧道:- 传输协议为IPv6协议。
- 需要进行封装和路由的报文目前只支持IPv4报文和IPv6报文。
GRE报文头
GRE报文头格式如图3-4所示:
各字段解释如下:
C:校验和验证位。如果该位置1,表示GRE头插入了校验和(Checksum)字段;该位为0表示GRE头不包含校验和字段。
K:关键字位。如果该位置1,表示GRE头插入了关键字(Key)字段;该位为0表示GRE头不包含关键字字段。
Recursion:用来表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1。如果封装层数大于3,则丢弃该报文。该字段的作用是防止报文被无限次的封装。
相关标准规定该字段默认值为0。
相关标准规定当发送和接收端该字段不一致时不会引起异常,且接收端必须忽略该字段。
NE20E实现时该字段仅在加封装报文时用作标记隧道嵌套层数,GRE解封装报文时不感知该字段,不会影响报文的处理。
Flags:预留字段。当前必须设为0。
Version:版本字段,必须置为0。Version为1是使用在相关标准的PPTP中。
Protocol Type:乘客协议的协议类型。
Checksum:对GRE头及其负载的校验和字段。
Key:关键字字段,隧道接收端用于对收到的报文进行验证。
因为目前实现的GRE头不包含源路由字段,所以Bit 1、Bit 3和Bit 4都置为0。
报文在GRE中的传输过程
报文在GRE隧道中传输包括封装和解封装两个过程。如图3-5所示,如果私网报文从Ingress PE向Egress PE传输,则封装在Ingress PE上完成;而解封装在Egress PE上进行。
封装
Ingress PE从连接私网的接口接收到私网报文后,首先交由私网上运行的协议模块处理。
私网协议模块检查私网报文头中的目的地址域在私网路由表或转发表中查找出接口,确定如何路由此包。如果发现出接口是GRE Tunnel接口,则将此报文发给隧道模块。
隧道模块收到此报文后进行如下处理:
隧道模块根据乘客报文的协议类型和当前GRE隧道所配置的Key参数,对报文进行GRE封装,即添加GRE头。
根据配置信息(传输协议为IP),给报文加上IP头。该IP头的源地址就是隧道源地址,IP头的目的地址就是隧道目的地址。
将该报文交给IP模块处理。IP模块根据该IP头目的地址,在公网路由表中查找相应的出接口并发送报文。之后,封装后的报文将在该IP公共网络中传输。
解封装
解封装过程和封装过程相反。Egress PE从连接公网的接口收到该报文,分析IP头发现报文的目的地址为本设备,且协议字段值为47,表示协议为GRE,于是交给GRE模块处理。GRE模块去掉IP头和GRE报文头,并根据GRE头的Protocol Type字段,发现此报文的乘客协议为私网上运行的协议,于是交由此私网协议处理。此私网协议像对待一般数据报一样对此数据报进行转发。
使用价值
在网络中部署GRE隧道,有益于以下三个方面:
使客户的部署不同协议网络使用单一网络协议进行数据传输。
可以扩大受协议的步跳数限制的网络的工作范围。
将一些不能连续的子网连接起来,用于组建VPN。