解决 GRE 和 IPSEC 中的 IP 分段、MTU、MSS 和 PMTUD 问题

解决 GRE 和 IPSEC 中的 IP 分段、MTU、MSS 和 PMTUD 问题
目录
简介
IP 分段与重组
IP 分段问题
避免 IP 分段:TCP MSS 用途及其工作原理
什么是 PMTUD?
PMTUD 问题
需要 PMTUD 的常见网络拓扑
什么是隧道?
有关隧道接口的注意事项
路由器在隧道端点参与 PMTUD
“纯”IPsec 隧道模式
同时使用 GRE 与 IPsec
其他建议
相关信息
简介
本文档旨在介绍 IP 分段和路径最大传输单元发现 (PMTUD) 的工作原理,并对 PMTUD 与不同 IP 隧道组合结合时的行为相关的一些
方案进行探讨。当前,IP 隧道在 Internet 中的广泛应用使 IP 分段和 PMTUD 相关的问题日益凸显出来。
IP 分段与重组
IP 协议是专为用于各种传输链路而设计的。虽然 IP 数据报的最大长度是 64K,但大多数传输链路会强制执行更小的最大数据包长
度限制(称为 MTU)。MTU 的值取决于传输链路的类型。IP 设计允许路由器根据需要对 IP 数据报进行分段,从而适应 MTU 差异。
接收站负责将这些分段重新重组为完整大小的原始 IP 数据报。
IP 分段包括将数据报分为多个部分,可在稍后重组这些部分。IP 源、目标、标识、总长度和分段偏移字段,以及 IP 报头中的“更
多分段”标志和“不分段”标志均用于 IP 分段与重组。有关 IP 分段与重组的机制的详细信息,请参阅 RFC 791。
下图描述了 IP 报头的布局。
标识值为 16 位,该值由 IP 数据报的发送者指定,用于帮助重组数据报的分段。
分段偏移为 13 位,指示分段在原始 IP 数据报中的所属位置。该值是 8 个字节的倍数。
在 IP 报头的标志字段中,有三位用于控制标志。请务必注意,“不分段”(DF) 位在 PMTUD 中发挥着中心作用,这是因为它确定是
否允许对数据包进行分段。
位 0 为保留位,并且始终设置为 0。位 1 为 DF 位(0 =“可分段”,1 =“不分段”)。位 2 为 MF 位(0 =“最后一个分
段”,1 =“更多分段”)。
值位 0(保留) 位 1 (DF) 位 2 (MF)
0 0 5月为时
1 0 不分段更多
下图显示了一个分段示例。如果将所有 IP 分段的长度相加,所得的值将比原始 IP 数据报的长度大 60。总长度增加了 60 是因为
另外创建了三个 IP 报头(第一个分段后的每个分段各对应一个 IP 报头)。
第一个分段的偏移为 0,此分段的长度为 1500;这包括已略作修改的原始 IP 报头所对应的 20 个字节。
第二个分段的偏移为 185 (185 x 8 = 1480),这意味着此分段的数据部分从原始 IP 数据报的第 1480 个字节开始。此分段的长度
为 1500;这包括另外为此分段创建的 IP 报头。
第三个分段的偏移为 370 (370 x 8 = 2960),这意味着此分段的数据部分从原始 IP 数据报的第 2960 个字节开始。此分段的长度
为 1500;这包括另外为此分段创建的 IP 报头。
第四个分段的偏移为 555 (555 x 8 = 4440),这意味着此分段的数据部分从原始 IP 数据报的第 4440 个字节开始。此分段的长度
为 700 个字节;这包括另外为此分段创建的 IP 报头。
只有在收到了最后一个分段时,才能确定原始 IP 数据报的大小。
通过最后一个分段的分段偏移 (555),得出原始 IP 数据报中的数据偏移为 4440 个字节。如果再加上最后一个分段中的数据字节
(680 = 700 - 20),这样您将获得 5120 个字节,这是原始 IP 数据报的数据部分。然后,加上 IP 报头的 20 个字节,即等于原始
IP 数据报的大小 (4440 + 680 + 20 = 5140)。
IP 分段问题
存在下面几个致使 IP 分段不受欢迎的问题。分段 IP 数据报时,CPU 和内存开销将稍有增加。这对于发送器和接收器路径上的发送
器和路由器是适用的。创建分段只涉及创建分段报头和将原始数据报复制到分段中。由于可以立即获取创建分段所需的所有信息,因
此可以非常高效地完成该操作。
重组分段时,分段会导致接收者产生更大开销,原因是接收者必须为到达的分段分配内存,然后在收到所有分段后将它们重新组合为
一个数据报。在主机上进行重组不会带来任何问题,因为主机拥有完成此任务所需的时间和内存资源。
但是,路由器的主要工作是尽快转发数据包,因此在路由器上进行重组的效率非常低。路由器不是为了将数据包保存任意时长而设计
的。此外,执行重组的路由器还会选择可供使用的最大可用缓冲区 (18K),因为在收到最后一个分段之前,它无法确定原始 IP 数据
包的大小。
另一个分段问题与处理已丢弃的分段有关。如果 IP 数据报的某个分段被丢弃,则必须重新发送整个原始 IP 数据报,并且同样会对
该数据报进行分段。以网络文件系统 (NFS) 为例进行说明。默认情况下,NFS 的读写块大小为 8192,因此 NFS IP/UDP 数据报约为
8500 个字节(包括 NFS、UDP 和 IP 报头)。连接到以太网的发送站 (MTU 1500) 必须将此 8500 个字节的数据报分成 6 个部分;
五个 1500 字节的分段和一个 1100 字节的分段。如果六个分段中任何一个分段由于链路拥塞而被丢弃,将必须重新传输完整的原始
数据报,这意味必须另外创建六个分段。如果此链路丢弃六个数据包中的其中一个数据包,那么可通过此链路传输任何 NFS 数据的
可能性将非常低,这是因为每 NFS 8500 字节的原始 IP 数据报中将至少丢弃一个 IP 分段。
防火墙根据数据包中的第 4 层 (L4) 至第 7 层 (L7) 信息来过滤或处理数据包时,可能很难正确处理 IP 分段。如果 IP 分段的顺
序不正确,防火墙可能会阻止非初始分段,因为这些分段未包含与数据包过滤器匹配的信息。这意味着接收主机无法重组原始 IP 数
据报。如果将防火墙配置为允许非初始分段包含不足以正确匹配过滤器的信息,则可能会发生通过防火墙进行非初始分段攻击的情
况。此外,部分网络设备(如内容交换引擎)根据 L4 至 L7 信息指导数据包,并且如果数据包跨越多个分段,那么设备可能很难强
制执行其策略。
避免 IP 分段:TCP MSS 用途及其工作原理
TCP 最大数据段大小 (MSS) 定义一台主机愿意接受的单一 TCP/IP 数据报中的最大数据量。可以在 IP 层对此 TCP/IP 数据报进行
分段。MSS 值仅作为 TCP SYN 数据段中的一个 TCP 报头选项发送。TCP 连接的每一端都会向另一端报告其 MSS 值。与普遍看法相
反的是,不会在主机之间协商 MSS 值。发送主机需要将单个 TCP 数据段中的数据大小限制为小于或等于接收主机报告的 MSS 的
值。
最初,MSS 表示接收站上需要分配的缓冲区的大小(大于或等于 65496K),以便能够存储单个 IP 数据报内包含的 TCP 数据。MSS
是TCP接收器愿意接收的最大数据分段(大块)。此 TCP 数据段最大可为 64K(即 IP 数据报最大大小),可以在 IP 层上进行分段,
以通过网络传输到接收主机。接收主机将重组 IP 数据报,然后再将完整的 TCP 数据段传递给 TCP 层。
下面几个方案显示了如何设置 MSS 值并将其用于限制 TCP 数据段大小,从而限制 IP 数据报大小。
方案 1 说明了 MSS 的最初实现方式。主机 A 的缓冲区为 16K,主机 B 的缓冲区为 8K。这些主机发送和接收其各自的 MSS 值,并
调整其发送 MSS 以便彼此发送数据。请注意,主机 A 和主机 B 必须对大于接口 MTU、但仍小于发送 MSS 的 IP 数据报进行分段,
这是因为 TCP 堆栈可能将 16K 或 8K 字节的数据沿堆栈向下传递到 IP。以主机 B 为例,可以对数据包进行两次分段,一次分段在
令牌环 LAN 上执行,另一次在以太网 LAN 上执行。
场景 1
1. 主机 A 将其 MSS 值 16K 发送到主机 B。
2. 主机 B 收到来自主机 A 的 MSS 值 16K。
3. 主机 B 将其发送 MSS 值设置为 16K。
4. 主机 B 将其 MSS 值 8K 发送到主机 A。
5. 主机 A 收到来自主机 B 的 MSS 值 8K。
6. 主机 A 将其发送 MSS 值设置为 8K。
为了帮助避免在 TCP 连接端点发生 IP 分段,MSS 值的选项已更改为最小缓冲区大小和传出接口的 MTU (-40)。MSS 数值比 MTU 数
值小 40 字节,这是因为 MSS 仅为 TCP 数据大小,而不包括 20 字节的 IP 报头和 20 字节的 TCP 报头。MSS 基于默认报头大
小;根据使用的 TCP 或 IP 选项,发送者堆栈必须减去 IP 报头和 TCP 报头的相应值。
现在,MSS 的工作方式是:各主机将首先比较其传出接口 MTU 和自己的缓冲区,并选择最小的值作为要发送的 MSS。然后,主机将
比较收到的 MSS 大小和其自己的接口 MTU,并再次从两个值中选择较小的值。
方案 2 说明了发送者为避免在本地和远程线路上进行分段而采取其他步骤。请注意每台主机如何将传出接口的 MTU 纳入考虑范畴
(在主机互相发送其 MSS 值之前),以及这如何帮助避免分段。
场景 2
1. 主机 A 比较其 MSS 缓冲区 (16K) 和其 MTU (1500 - 40 = 1460),并使用较小的值作为 MSS (1460),以便发送到主机 B。
2. 主机 B 收到主机 A 的发送 MSS (1460),并将其与出站接口 MTU - 40 的值 (4422) 相比较。
3. 主机 B 将较小的值 (1460) 设置为 MSS,以便向主机 A 发送 IP 数据报。
4. 主机 B 比较其 MSS 缓冲区 (8K) 和其 MTU (4462 - 40 = 4422),并使用 4422 作为 MSS,以便发送到主机 A。
5. 主机 A 收到主机 B 的发送 MSS (4422),并将其与出站接口 MTU - 40 的值 (1460) 相比较。
6. 主机 A 将较小的值 (1460) 设置为 MSS,以便向主机 B 发送 IP 数据报。
1460 便是两台主机为彼此选择的发送 MSS 的值。TCP 连接两端的发送 MSS 的值通常相同。
在方案 2 中,由于主机考虑了两个传出接口 MTU,因此不会在 TCP 连接端点进行分段。如果数据包遇到其 MTU 值小于主机出站接
口的 MTU 值的链路,那么在路由器 A 和路由器 B 之间的网络中,仍可以对数据包进行分段。
什么是 PMTUD?
上述 TCP MSS 负责处理 TCP 连接的两个端点上的分段,而不会处理这两个端点之间存在更小 MTU 链路的情况。PMTUD 的开发目的
是为了避免在端点之间的路径中进行分段。它用于动态确定从数据包源到其目标之间的路径中的最小 MTU。
注意: 仅 TCP 支持 PMTUD。UDP 和其他协议不支持 PMTUD。如果在主机上启用了 PMTUD(实际上 PMTUD 几乎始终处于启用状
态),来自该主机的所有 TCP/IP 数据包都会设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值