Networking IP碎片化和重组

Networking IP碎片化和重组,networking,tcp,network-protocols,fragmentation,defragmentation,Networking,Tcp,Network Protocols,Fragmentation,Defragmentation,我正在看我的网络幻灯片,想知道是否有人能帮助我理解碎片和重组的概念 我理解它是如何工作的,也就是说,由于网络链接有一个MTU,数据报是如何被分割成更小的块的。然而,图片中的例子让我感到困惑 所以前两部分的长度是1500,因为这是MSU,但这不意味着最后一部分应该有1000(总共4000字节),而不是1040吗?这些额外的40字节是从哪里来的?我的猜测是,因为前两个片段都有一个20字节的头,这额外的40字节的数据需要去某个地方,所以它将到达最后一个片段 Fragflag本质上意味着还有另一个片段

我正在看我的网络幻灯片,想知道是否有人能帮助我理解碎片和重组的概念

我理解它是如何工作的,也就是说,由于网络链接有一个MTU,数据报是如何被分割成更小的块的。然而,图片中的例子让我感到困惑

所以前两部分的长度是1500,因为这是MSU,但这不意味着最后一部分应该有1000(总共4000字节),而不是1040吗?这些额外的40字节是从哪里来的?我的猜测是,因为前两个片段都有一个20字节的头,这额外的40字节的数据需要去某个地方,所以它将到达最后一个片段

Fragflag本质上意味着还有另一个片段,因此除了最后一个片段为零之外,所有片段的Fragflag都将为1。然而,我不明白什么是偏移量,或者它是如何计算的。为什么第一个偏移量为零?为什么我们要将数据字段(1480)中的字节除以8来获得第二个偏移量?这个8是从哪里来的?除此之外,我假设每个片段偏移量只会增加这个值

例如,第一个片段的偏移量为0,第二个为185,第三个为370,第四个为555?(370+185)


谢谢你的帮助

每个数据包中都有一个20字节的报头。因此,原始数据包包含3980字节的数据。这些片段包含1480、1480和1020字节的数据。1480+1480+1020=3980


标题中的每一位都是宝贵的。将偏移量除以8可使其适合13位而不是16位。这意味着除了最后一个数据包外,每个数据包都必须包含8的倍数的数据字节,这不是问题。

IP报头中的偏移量是13位,但在最坏的情况下,我们需要16位。因此,我们使用8的比例因子,即(2^16/2^13)。

RFC 791专门解释了碎片和重新组装。一定要通过考试。RFC有不同的章节解释样品的碎片和重新组装。你所有的疑问和问题都在里面得到了很好的解答

答1:关于数据包的长度:原始数据包包含4000字节。此数据包是一个完全IP数据包,因此也包含IP报头。因此,有效负载长度实际上是4000-(IP报头长度,即20)

实际有效负载长度=4000-20=3980

现在,由于长度大于MTU(1500字节),数据包被分割

因此,第一个数据包包含1500个字节,其中包括IP报头+有效负载部分

1500=20(IP头)+1480(数据有效负载)

对于另一个数据包也是如此

第三个数据包应包含剩余的剩余数据(3980-1480-1480)=1020

因此,分组的长度为20(IP报头)+1020(有效载荷)=1040

Ans 2:偏移量是数据相对于原始数据有效负载开始的地址或定位器。对于IP,数据有效负载包括IP报头和选项报头之后的所有数据。因此,系统/路由器获取有效载荷并将其划分为更小的部分,并根据原始数据包跟踪偏移量,以便可以进行重新组装

如第12页所示

“片段偏移量字段告诉接收者片段在原始数据报中的位置。片段偏移量和长度决定了原始数据报的部分 包含在此片段中。more fragments标志指示(通过重置)最后一个片段。这些字段提供足够的信息来重新组装数据报。”

片段偏移量以每个8字节为单位进行测量。它在IP报头中有13位字段。如RFC第17页所述

“此字段指示此片段在数据报中所属的位置。片段偏移量以8个八位字节(64位)为单位测量。第一个片段的偏移量为零。”

因此,正如您在问题中所问的,8是从哪里来的,它是为IP协议规范定义的标准,其中8个八位字节作为一个值。这也有助于我们通过它传输大数据包

RFC第28页写道: *片段以8个八位字节为单位计数。碎片策略的设计使未碎片化的数据报具有所有零碎片信息(MF=0,碎片偏移量= 0). 如果internet数据报是分段的,则其数据部分必须是 在8个八位组边界上被打破。该格式允许每个8个八位字节的2**13=8192个片段用于 总共有65536个八位组。请注意,这与 数据报总长度字段(当然,报头在
总长度,不在片段中)。*

这些不是额外的位,而是最后一个片段的总长度。 由于1500是MTU,这意味着一个片段(包括标头)中可以有1500字节的数据。标题附加了每个片段。这意味着在片段中,我们能够发送1500-20=1480字节的数据。
假设有4000B的数据报。数据报只不过是网络层的数据包封装。所以我们必须发送的总数据是4000-20=3980。然后将其分成3个部分(ceil(3980/1480)),每个部分的长度分别为148014801020。因此,当20B头追加到最后一个片段时,其长度将变为1020+20=1040

谢谢!这清楚地回答了我问题的第一部分,但对于第二部分,为什么我们要用1480除以8来得到偏移量?非常感谢,这回答了所有问题!我只是想知道,我们总是除以8吗?有没有任何情况会导致我们被另一个数字除掉?@JimmyK:如果我们试图遵守IPv4以外的标准。