Generic Routing Encapsulation (GRE)
通用路由封装 (GRE)
本备忘录的状态
本备忘录为 Internet 社区提供信息。本备忘录未指定任何类型的 Internet 标准。本备忘录的分发不受限制。
梗概
本文档规定了一种协议,用于在另一个任意网络层协议上执行任意网络层协议的封装。
介绍
目前存在许多不同的提案 [RFC 1234, RFC 1226] 用于将一种协议封装在另一种协议上。其他类型的封装 [RFC 1241、SDRP、RFC 1479] 已被提议用于在 IP 上传输 IP 以用于策略目的。这份备忘录描述了一个与上述提议非常相似但更通用的协议。为了更通用,许多协议特定的细微差别被忽略了。结果是该提议可能不太适合已描述特定“X over Y”封装的情况。该协议试图提供一种简单的通用机制,将封装问题从当前的 O(n^2) 问题减少到更易于管理的状态。该提议还试图提供一种用于基于策略的路由的轻量级封装。本备忘录明确没有解决何时应该封装数据包的问题。本备忘录承认,但没有解决相互封装的问题 [RFC 1326]。
在最常见的情况下,系统有一个需要封装和转发的数据包。我们将其称为有效载荷数据包。有效载荷首先封装在一个 GRE 数据包中,该数据包可能还包括一条路由。然后可以将生成的 GRE 数据包封装在其他协议中,然后转发。我们将这个外部协议称为转发协议。稍后讨论用于处理该数据包的算法。
整体报文
整个封装的数据包将具有以下形式:
报文头
GRE 数据包报文头的格式为:
标志和版本(2 个八位字节)
GRE 标志编码在前两个八位字节中。第 0 位是最高有效位,第 15 位是最低有效位,第 13 到 15 位保留用于版本字段,第 5 到第 12 位保留供将来使用,并且必须作为零传输。
校验和存在(第 0 位)
如果校验和存在位设置为 1,则校验和字段存在并包含有效信息。
如果设置了校验和存在位或路由存在位,则校验和和偏移字段都存在于 GRE 数据包中。
路由存在(第 1 位)
如果路由存在位设置为 1,则表示偏移和路由字段存在并包含有效信息。
如果设置了校验和存在位或路由存在位,则校验和和偏移字段都存在于 GRE 数据包中。
密钥存在(第 2 位)
如果密钥存在位设置为 1,则表示密钥字段存在于 GRE 标头中。否则,密钥字段不存在于 GRE 标头中。
序列号存在(第 3 位)
如果序列号存在位设置为 1,则表示存在序列号字段。否则,GRE 报头中不存在序列号字段。
严格源路由(第 4 位)
严格源路由位的含义在其他文档中有定义。如果所有路由信息都由严格源路由组成,则建议仅将此位设置为 1。
递归控制(第 5-7 位)
递归控制包含一个三位无符号整数,其中包含允许的附加封装的数量。这应该默认为零。
版本号(第 13-15 位)
版本号字段必须包含值 0,其他值超出了本文档的范围。
协议类型(2 个八位字节)
协议类型字段包含有效载荷数据包的协议类型。通常,该值将是数据包的以太网协议类型字段。下面列出了当前定义的协议类型。其他值可能会在其他文档中定义。
偏移量(2 个八位字节)
偏移字段指示从路由字段的开始到要检查的活动源路由条目的第一个八位字节的八位字节偏移量。如果路由存在或校验和存在位设置为 1,则该字段存在,并且仅当路由存在位设置为 1 时才包含有效信息。
校验和(2 个八位字节)
校验和字段包含 GRE 标头和有效负载数据包的 IP(一个的补码)校验和。如果路由存在或校验和存在位设置为 1,则该字段存在,并且仅当校验和存在位设置为 1 时才包含有效信息。
密钥(4 个八位字节)
Key 字段包含一个由封装器插入的四个八位字节数。接收方可以使用它来验证数据包的来源。确定真实性的技术超出了本文档的范围。 Key 字段仅在密钥存在字段设置为 1 时才存在。
序列号(4 个八位字节)
序列号字段包含一个由封装器插入的无符号 32 位整数,接收器可以使用它来确定数据包从封装器传输到接收器的顺序。生成序列号的确切算法及其接收的语义超出了本文档的范围。
路由(可变长度)
路由字段是可选的,只有在路由存在位设置为 1 时才存在。
路由字段是源路由条目 (Source Route Entries,SRE) 的列表。 每个 SRE 都具有以下形式:
路由字段以包含类型为 0x0000 且长度为 0 的地址族的“NULL”SRE 终止。
地址族(2 个八位字节)
地址族字段包含两个八位字节值,指示路由信息字段的语法和语义。此字段的值以及路由信息的相应语法和语义在其他文档中定义。
SRE 偏移量(1 个八位字节)
SRE偏移量字段指示从路由信息字段的开始到要检查的源路由条目中活动条目的第一个八位字节的八位字节偏移量。
SRE 长度(1 个八位字节)
SRE 长度字段包含 SRE 中的八位字节数。如果 SRE 长度为 0,则表示这是路由字段中的最后一个 SRE。
路由信息(可变长度)
路由信息字段包含可用于路由该数据包的数据。该字段的确切语义在其他文档中定义。
GRE报文转发
通常,转发交付层数据包的系统不会以任何方式将 GRE 数据包与其他数据包区分开来。但是,系统可能会接收到 GRE 数据包。在这种情况下,系统应该使用一些特定于交付的方法来确定这是一个 GRE 数据包。一旦确定,可以检查密钥、序列号和校验和字段,如果它们包含由相应标志指示的有效信息。如果路由存在位设置为 1,则应检查地址族字段以确定 SRE 长度、SRE 偏移和路由信息字段的语义和使用。处理每个地址族的 SRE 的确切语义在其他文档中定义。
一旦所有的 SRE 都被处理,那么源路由就完成了,GRE 头应该被移除,有效载荷的 TTL 必须递减(如果存在)并且有效载荷数据包应该作为一个普通数据包转发。确切的转发方法取决于协议类型字段。
当前协议类型列表
以下是当前为 GRE 分配的协议类型,未来的协议类型必须取自 DIX 以太网编码。 由于历史原因,一些协议使用了许多其他值。 必须使用下表的值来标识以下协议:
有关这些值的完整列表,请参阅 IANA 以太类型列表。
URL = ftp://ftp.isi.edu/in-notes/iana/assignments/ethernet-numbers.
参考信息
RFC 1479 Steenstrup, M. "Inter-Domain Policy Routing Protocol Specification: Version 1", RFC1479, BBN Systems and Technologies, July 1993.
RFC 1226 Kantor, B. "Internet Protocol Encapsulation of AX.25 Frames", RFC 1226, University of California, San Diego, May 1991.
RFC 1234 Provan, D. "Tunneling IPX Traffic through IP Networks", RFC 1234, Novell, Inc., June 1991.
RFC 1241 Woodburn, R., and D. Mills, "Scheme for an Internet Encapsulation Protocol: Version 1", RFC 1241, SAIC, University of Delaware, July 1991.
RFC 1326 Tsuchiya, P., "Mutual Encapsulation Considered Dangerous", RFC 1326, Bellcore, May 1992.
SDRP Estrin, D., Li, T., and Y. Rekhter, "Source Demand Routing Protocol Specification (Version 1)", Work in Progress.
RFC 1702 Hanks, S., Li, T., Farinacci, D., and P. Traina, "Generic Routing Encapsulation over IPv4 networks", RFC 1702, NetSmiths, Ltd., cisco Systems, October 1994.
安全注意事项
本备忘录不讨论安全问题。
致谢
作者要感谢 Yakov Rekhter (IBM) 和 Deborah Estrin (USC) 的建议、鼓励和有见地的评论。