一、 隧道概念

隧道:通过在一种协议中承载另一种协议,实现跨越不同域的互通,具体可以是IPv6-in-IPv4,IPv6-in-MPLS,IPv4-in-IPv6等隧道类型。
Tunnel 是一个虚拟的点对点的连接,提供了一条通路使封装的数据报文能够在这个通路上传输,并且在一个Tunnel 的两端分别对数据报进行封装及解封装。 一个X协议的报文要想穿越IP网络在Tunnel中传输,必须要经过加封装与解封装两个过程。

二、 GRE定义

通用路由封装(GRE: Generic Routing Encapsulation),可以对某些网络层协议的数据报进行封装,使这些被封装的数据报能够在IPv4网络中传输

三、 报文格式

3.1 GRE封装后的报文格式

Delivery Header

GRE Header

Payload packet

Delivery Header:隧道所处网络的协议数据头,是实现一种协议报文穿越另一种协议网络的传输协议。
GRE Header:封装协议,包含GRE协议本身以及和负载协议相关的信息。
Payload Packet:进入隧道前的网络层数据报文,该报文的协议号会作为GRE头部字段中的ProtocolType字段。

3.2 GRE Header格式
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 2
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |C|R|K|S|s|Recur|  Flags  | Ver |         Protocol Type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |      Checksum (optional)      |       Offset (optional)       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         Key (optional)                        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                    Sequence Number (optional)                 |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                    Routing (optional)                         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • C:校验和标志位
    若该位为1,则16位的校验和字段会出现在GRE头部。若该位或路由标志位被置为1,则16位的校验和字段和16位的偏移字段都会出现在GRE头部。
  • R:路由标志位
    若该位为1,则16位的偏移字段和32位的路由字段都会出现在GRE头部。
  • K:密钥标志位
    若该位为1,则32位的密钥字段会出现在GRE头部。
  • S:序列号标志位
    若该位为1,则32位的序列号字段会出现在GRE头部。
  • s:严格源路由标志位
    只有当所有的路由都符合严格源路由(IP数据报经过路径上的每一个路由器,相邻路由器之间无中间路由器,并且所经过路由器的顺序不可更改)时该位才会为1,通常为0.
  • Recur:递归控制字段(3bit)
    表示被允许额外封装的数目,应该全部置为0.
  • Flags:未定义,5位全部置为0
  • Ver:版本号(3bit)
    全部置为0
  • Protocol Type:协议类型字段(16bit)
    即进入隧道前的网络层数据报文(Payload Packet)的协议号,常用协议号如下:

四、封装过程

系统接收到一个需要封装和路由的数据报文,我们称之为有效负载(Payload)。这个有效负载首先被GRE封装然后被称之为GRE报文,这个报文接着被封装在IP报文中,然后完全由IP层负责此报文的转发(Forwarding)。我们也称这个负责向前传输的IP 协议为传递(Delivery)协议或传输(Transport)协议。

GRE实际上是第三层隧道的一种运载协议(Carrier Protocol)。GRE的协议号47。

gre隧道技术原理 gre隧道是什么意思_IP

五、解封装过程

当IP层接收到GRE报文,检查到外层IP报文头部中的协议号是47时(UDP为17,TCP为6,ICMP为1),那么,IP层输入入口函数会根据协议开关表,直接调用GRE的解封装处理函数,对GRE解封装。解封装完成后,再将原始数据报文送入IP输入队列中,以便进行进一步的传输。