一、简介
GRE(Generic Routing Encapsulation):通用路由封装。
GRE是一个通用的路由封装协议,它描述在任意的网络层之上封装另一个网络协议。
RFC:2784.二、报文格式
封装格式:
payload是网络层,delivery是网络层
1) 校验和存在位(1位:0)
如果为1,则checksum和reserved1有效。
2) reserved0位(12位:1-12)
接收到的报文如果reserved0的1-5位(对应上图)不为0,那么接收段必须丢弃该报文,除非该接收端明确支持RFC1701。6-12位为保留位,必须设置为0,接收端必须不关系这些位。
3) 版本字段(3位:13-15)
版本字段必须设置为0.当版本字段为1时,成为PPTP协议。
4) 协议类型(16位)
协议类型字段包含负载的协议。协议类型的值由RFC1700的ETHER TYPES部分指定。
5) 校验和字段(16位:0-15)
只有当校验和存在位为1,该校验和字段才有效。
该字段初始为0,表示要计算校验和。
校验和包括该16位校验和字段和负载部分。
6) reserved1字段(16位:16-31)
只有到校验和存在位为1,该字段有效。
该字段为保留位,必须设置为0.三、IPv4作为运输协议
IPv4的协议字段为47,表示ipv4封装的是GRE包。
四、IPv4作为负载
对应的协议字段为0x800.
传输该IPv4负载时:
接收GRE隧道端,使用负载的IP地址来传输解封装的负载报文,负载报文的TTL必须减1。注意,当负载报文的IP地址为GRE隧道的另一端地址时,会出现循环,这时必须丢弃该报文。五、PMUT的影响
当用IPv4作为传送协议时,现有实现并不实现路径MTU发现和不设置禁止分片标志。当传送大包时,在隧道中会分片,在隧道端再重组。
如果一个隧道端希望实现Path MTU发现,那么该隧道也需要实现把ICMP不可达错误信息报文(需要分片,设置DF位)回复给报文产生者。
否则,假如报文产生者设置了不分片标志,那么报文在隧道中可能会被丢弃,但没有把该ICMP错误信息传回给产生者,那么后续的报文也将使用相同的PMTU,导致后续报文都被丢弃。