IP协议可以处理碎片,它包括碎片偏移和标识符。我知道,当您的IP包太大,对于某个特定的网络或链路,MTU比前一个要低的时候,这就起作用了。
例如,MTU为1000字节,IP数据包为900 (+20)字节。再往下看,MTU只有500,所以您必须提取IP数据,并将其放入两个数据包中,一个是480 (+20),另一个是420 (+20)。
但据我所知,这是网络层的碎片,将一个IP包转换为多个IP数据包。这意味着您只有一个传输层报头出现一次,和一个新的网络层报头为每个较小的IP包。
我希望我对此的理解是正确的。总之,在这张照片出现之后,我的实际问题是:

假设您的IP数据包长度被限制为1000字节(包括报头),这是由于MTU为1000字节。
如果由于某种原因,TCP段大于980,从而超过最大IP数据包大小,实际会发生什么情况?
如果您的TCP段是1960字节呢?这里的碎片是如何处理的?它是否被放入一个1980年的IP包中,然后被分割成两个980 (+20)个IP数据包?
在此之前,在传输层中会发生碎片吗?是否有多个较小的传输层段,每个都有自己的报头发送到具有正确大小的IP层?
发布于 2019-01-19 19:39:49
在对给定的数据包作出路由决定之后,它将被调度出特定的接口。如果该数据包对于链路的MTU来说太大,则将其作为两个或多个包含碎片的IP数据包发送。细节在因特网协议RFC 760第2.2节中,但简单地说,第一个部分包含了包的开头,包括TCP报头,而后面的部分只是连续的。接收方可以通过标题中的“更多片段”标志来识别更多的片段,并通过片段偏移量查看它们的去向。
由于IP数据包有效负载的开始位于第一个片段中,因此只有第一个片段具有TCP报头。随后的片段将从有效负载的适当部分开始,可能是来自TCP流中间的字节。
这种机制是特定于IPv4 4的,与数据包的内容没有直接关系。TCP试图通过调整TCP流的最大段大小来保持MTU中的数据包,但是如果MSS太高,您将得到碎片。
请记住,还有一个“不要碎片”标志,如果实现了,意味着系统将丢弃数据包并发送ICMP错误(除非配置为),而不是转发片段。
还请记住,“我是否需要分割这个包”的问题发生在每个包离开每个接口时。即使一个服务器的接口有一个足够大的MTU来处理一个给定的数据包,一些路由器可能会有一个更小的MTU --这就是“路径MTU”的问题。任何路由更改,例如负载平衡或故障恢复,都可以更改路径MTU。因此,片段以正确的顺序到达,重叠,部分复制是合法的。
最后,不要忘记碎片可能是故意错误的:例如发送重复的数据部分,这可能导致一些不愉快的安全问题。因此,许多路由器和防火墙进行了一定量的重组,尽管严格地说,它们不需要这样做--这不是路由器的工作所必需的--它只需要转发碎片。
发布于 2019-01-19 21:38:46
这里的碎片是如何处理的?
我们必须区分两种情况:
案例1:第二层不允许这样长的帧。
在这种情况下,生成一个2000字节大小的IP数据包(或任何需要的大小),并将TCP段插入到该2000字节IP数据包中。
这个数据包将在IP层(第3层)上被碎片化,因此它可以以500字节大小的片段传输。
这完全发生在IP层上;TCP层不知道2000字节大小的IP数据包是分段的。
案例2: IP数据包大小受到限制
在某些情况下,IP分组的大小可能受到限制。(例如,有一些CGNATs只允许有限大小的IP数据包。
在这种情况下,TCP层(第4层)根本无法发送如此长的大小的段。
在TCP连接的第一个数据包中,涉及连接的两台计算机都可以告诉另一台计算机计算机所能接收的TCP段的最大大小。
如果一台计算机只支持高达800字节的IP数据包,它可能会告诉另一台计算机支持多达700字节的TCP段,因此产生的IP数据包将小于800字节。
https://networkengineering.stackexchange.com/questions/56254
复制相似问题