Jim*_*myK 22 networking tcp defragmentation network-protocols fragmentation
我目前正在浏览我的网络幻灯片,并想知道是否有人可以帮助我解决碎片和重组的问题.

我理解它是如何工作的,即数据报如何分成较小的块,因为网络链接具有MTU.然而,图中的例子令我感到困惑.
所以前两个部分显示长度为1500,因为这是MSU,但这不应该意味着最后一个应该有1000(总共4000个字节)而不是1040?这些额外的40个字节来自哪里?我的猜测是因为前两个片段都有一个20字节的标题,这个额外的40字节数据需要去某处,所以它会到达最后一个片段?
Fragflag本质上意味着存在另一个片段,因此除了最后一个将为零的片段之外,它们都将具有1的Fragflag.但是我不明白偏移是什么或如何计算.为什么第一个偏移量为零?为什么我们将数据字段(1480)中的字节除以8得到第二个偏移?这8个来自哪里?除此之外,我假设每个片段偏移量只会增加这个值?
例如,第一个片段的偏移量为0,第二个片段为185,第三个片段为375,第四个片段为555?(370 + 185)
谢谢你的帮助!
Dav*_*rtz 19
每个数据包中有一个20字节的标头.因此原始数据包包含3,980字节的数据.片段包含1480,1480和1020字节的数据.1480 + 1480 + 1020 = 3980
标题中的每一位都很珍贵.将偏移量除以8允许它适合13位而不是16位.这意味着每个数据包但最后一个数据包必须包含多个8的数据字节,这不是问题.
小智 17
碎片和重组已在RFC 791中进行了专门解释.请参阅Internet协议规范RFC.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
回答2:偏移量是数据从原始数据有效负载开始的地址或定位器.对于IP,数据有效载荷包括IP头和选项头之后的所有数据.因此,系统/路由器获取有效载荷并将其分成较小的部分并且参考原始分组保持偏移的轨迹,以便可以进行重新组装.
正如RFC第12页中给出的那样.
" 片段偏移字段告诉接收者原始数据报中片段的位置.片段偏移和长度确定该片段覆盖的原始数据报的部分.更多片段标志指示(通过重置)最后片段.这些字段提供了足够的信息来重新组合数据报. "
片段偏移量以每个8字节为单位进行测量.它在IP头中有13位字段.正如RFC第17页所述
" 此字段指示此片段所属的数据报中的位置.片段偏移量以8个八位字节(64位)为单位进行测量.第一个片段的偏移量为零. "
因此,当您在问题中询问此8的来源时,它是为IP协议规范定义的标准,其中8个八位字节被视为一个值.这也有助于我们通过它传输大数据包.
RFC的第28页写道:*片段以8个八位字节为单位计算.碎片策略的设计使得未碎片化的数据报具有零碎片信息(MF = 0,碎片偏移= 0).如果互联网数据报被分段,则其数据部分必须在8个八位字节边界上被破坏.该格式允许2**13 = 8192个片段,每个8个八位字节,总共65,536个八位字节.请注意,这与数据报总长度字段一致(当然,标题在总长度中计算而不在片段中).*