TCP 段如何装入较小的 IP 数据包?

网络工程 ip 网络 传输协议 碎片化
2021-07-25 08:39:06

IP 协议可以处理分片,它包括分片偏移和标识符。我知道当您的 IP 数据包对于某些 MTU 低于前一个的特定网络或链接来说太大时,这会起作用。

例如,MTU 为 1000 字节,而您的 IP 数据包为 900 (+20) 字节。再往下走,MTU 仅为 500,因此您必须提取 IP 数据并将其放入两个数据包中,其中一个为 480 (+20),另一个为 420 (+20)。

但根据我的理解,这是网络层的分段,将一个 IP 数据包转换为多个 IP 数据包。这意味着您只有一次传输层标头,并且每个较小的 IP 数据包都有一个新的网络层标头。

我希望我对此的理解是正确的。无论如何,在图像之后是我的实际问题:

在此处输入图片说明

假设您的 IP 数据包长度受 1000 字节的限制,包括报头,由于 1000 字节的 MTU。

如果由于某种原因您的 TCP 段大于 980,从而超出最大 IP 数据包大小,实际会发生什么情况?

如果您的 TCP 段是 1960 字节怎么办。这里的碎片是如何处理的?是否放入一个 1980 IP 数据包,然后将其分片为两个 980 (+20) IP 数据包?

在此之前,传输层中是否发生了碎片?是否有多个较小的传输层段,每个段都有自己的标头,以正确的大小发送到 IP 层?

2个回答

在为给定的数据包做出路由决定后,它会被安排离开特定的接口。如果数据包对于链路的 MTU 来说太大,它会作为两个或多个包含片段的 IP 数据包发送。详细信息在Internet 协议 RFC 760第 2.2 节中,但简而言之,第一个具有数据包的开头,包括 TCP 标头,后面的只是延续。接收者可以通过标头中的“更多片段”标志告诉还有更多片段,并通过片段偏移量查看它们的去向。

由于 IP 数据包有效载荷的开头在第一个片段中,因此只有第一个片段具有 TCP 标头。随后的片段将仅以它们适当的有效载荷部分开始,可能是来自 TCP 流中间的字节。

这种机制是特定于 IPv4 的,与数据包的内容没有直接关系。TCP 尝试通过调整 TCP 流的最大分段大小将数据包保留在 MTU 内,但如果 MSS 太高,您将获得碎片。

请记住,还有一个“Don't Fragment”标志,如果实施,则意味着系统将丢弃数据包并发送回 ICMP 错误(除非配置为不这样做),而不是转发碎片。

还要记住,这个“我需要对这个数据包进行分段吗”的问题发生在每个接口发出的每个数据包中。即使服务器的接口具有足够大的 MTU 来容纳给定的数据包,沿途的某些路由器也可能具有小得多的 MTU——这就是“路径 MTU”问题。任何路由更改,例如负载平衡或故障恢复,都可以更改路径 MTU。因此,片段以正确的顺序到达、重叠、部分复制是合法的。

最后,不要忘记片段可能会被故意变形:例如发送数据的重复部分,这可能会导致一些令人不快的安全问题。因此,许多路由器和防火墙会进行一定量的重组,即使严格来说他们不需要这不是完成路由器工作所必需的——它可以只转发片段。

这里的碎片是如何处理的?

我们必须区分两种情况:

案例1:第2层不允许这样长度的帧

在这种情况下,构建了一个 2000 字节大小(或任何需要的大小)的 IP 数据包,并将 TCP 段插入到该 2000 字节 IP 数据包中。

该数据包将在 IP 层(第 3 层)上分段,因此它可以以 500 字节大小的分段传输。

这完全发生在 IP 层;TCP 层不知道 2000 字节大小的 IP 数据包被分片。

情况 2: IP 数据包大小受到限制

在某些情况下,IP 数据包的大小可能会受到限制。(例如,有一些 CGNAT 仅允许有限大小的 IP 数据包。

在这种情况下,TCP 层(第 4 层)根本无法发送如此长的段。

在 TCP 连接的第一个数据包中,参与连接的两台计算机都可以告诉另一台计算机该计算机能够接收的 TCP 段的最大大小。

如果一台计算机仅支持最大 800 字节大小的 IP 数据包,它可能会告诉另一台计算机支持最大 700 字节的 TCP 段,因此生成的 IP 数据包将小于 800 字节长。