Skip to main content

GRE报文格式

系统收到需要进行封装和路由的某网络层协议(如IPX)数据时,将首先对其加上GRE(Generic Routing Encapsulation )报文头,使之成为GRE报文,再将其封装在另一协议(如IP)中。这样,此报文的转发就可以完全由IP协议负责。RFC 2784和RFC 1701都定义了GRE首部格式,两者格式不同。

协议栈结构

GRE报文封装格式
+-------------------------------------+
|           Payload Packet           | Passenger Protocol
+-------------------------------------+
|             GRE Header             | Carrier Protocol/Encapsulation Protocol
+-------------------------------------+
|           Deliver Header           | Transport Protocol
+-------------------------------------+
  • 净荷(Payload Packet):系统收到的需要封装和路由的数据报称为净荷。

  • 乘客协议(Passenger Protocol):封装前的报文协议称为乘客协议。

  • 封装协议(Encapsulation Protocol):上述的GRE协议称为封装协议,也称为运载协议(Carrier Protocol)。

  • 传输协议(Transport Protocol或者Delivery Protocol):负责对封装后的报文进行转发的协议称为传输协议。

GRE首部格式(RFC 2784)

GRE首部格式(RFC 2784)
                     1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|C|       Reserved0       | Ver |         Protocol Type         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Checksum (optional)     |       Reserved1 (Optional)   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
GRE首部字段解释(RFC 2784)
字段 长度 描述
C 1比特 校验和验证标识位。如果该位置1,表示GRE头插入了校验和(Checksum)字段;该位为0表示GRE头不包含校验和字段。
Reserved0 12比特 如果比特1–5不是全0,则该报文会被丢弃。比特6-12为预留字段,设置为0,接收者忽略此字段。
Ver 3比特 版本字段,必须置为0。
Protocol Type 16比特 乘客协议的协议类型,取值及含义与RFC1700中的“ETHER TYPES”相同。
Checksum 16比特 对GRE头及其负载的校验和字段。
Reserved1 16比特 预留字段,设置为0。此字段只在校验和验证标识位(C位)置位时出现。

GRE首部格式(RFC 1701)

GRE首部格式(RFC 1701)
  0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|C|R|K|S|s|Recur| Flags | Ver |         Protocol Type         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Checksum (optional)     |       Offset (optional)       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Key (optional)                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Sequence Number (optional)                 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Routing (optional)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
GRE首部字段解释(RFC 1701)
字段 长度 描述
C 1bit 校验和验证标识位。如果该位置1,表示GRE头插入了校验和(Checksum)字段;该位为0表示GRE头不包含校验和字段。
R 1bit 路由标识位。如果该位置1,表示GRE头插入了偏移字段和源路由字段。如果校验和验证位或者路由位其中一位置1,或两位都置1,则表示GRE头插入了校验和(Checksum)字段和偏移字段。
K 1bit 关键字标识位。如果该位置1,表示GRE头插入了关键字(Key)字段;该位为0表示GRE头不包含关键字字段。
S 1bit 序列号标识位。如果该位置1,表示GRE头插入了报文序列号字段。否则,表示GRE头没有序列号字段。
s 1bit 严格源路由标识位。RFC1071推荐此标识位仅在路由信息域包含了严格源路由信息的情况下置1。
Recur 3bits 用来表示GRE报文被封装的层数。完成一次GRE封装后将该字段加1。如果封装层数大于3,则丢弃该报文。该字段的作用是防止报文被无限次的封装。
Flags 5bits 预留字段。当前必须设为0。
Ver 3bits 版本字段,必须置为0。Version为1是使用在RFC2637的PPTP中。
Protocol Type 16btis 乘客协议的协议类型,取值及含义与RFC1700中的“ETHER TYPES”相同。
Checksum 16bits 对GRE头及其负载的校验和字段。
Offset 16bits 偏移字段,表示活跃的路由信息域中的起始字节到活跃的源路由实体SRE(Source Route Entry)的字节偏移量。该字段只有在路由标识位或者校验和验证标识位置1时携带,并在路由标识位置1时才有效。
Key 32bits 关键字字段,隧道接收端用于对收到的报文进行验证。
Sequence Number 32bits 报文序列号字段,是由封装节点插入的一个32位的无符号整数。
Routing 32bits 路由信息字段,是可选字段。只在路由标识位置1时出现。路由信息字段包含了一系列的源路由实体SRE(Source Route Entry)。单个SRE格式详见SRE格式
SRE格式
 0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Address Family         | SRE Offset   | SRE Length   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Routing Information ...  
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

路由信息字段以一个“Null”SRE为结尾,该SRE是一个长度为0,只包含一个类型为0x0000的Address Family子字段。

参考标准

标准 描述
RFC 1701 Generic Routing Encapsulation (GRE)
RFC 2784 Generic Routing Encapsulation (GRE)