3

假设我有两台主机,主机 A 和主机 B,主机 A 向 B 发送一个 1500 字节的数据包,它们之间有两个路由器,第一条链路的 MTU 为 800 字节,第二条链路的 MTU 为 500 字节他们。

据我了解,数据包必须两次都被分段。数据包必须被分成 3 个数据包(2 个大小相同的数据包和一个较小的数据包)。

然后,当我们点击第二个路由器时,我们将再次对前两个分段数据包中的每一个进行分段。前两个原始片段将产生 1 个较大的片段(接近 500 字节)和一个较小的片段。

这就是我感到困惑的地方。

我知道前 3 个片段的“更多片段”位应该设置为 1,除了最后一个片段表示数据包是片段的一部分,直到并包括下一个“更多片段”设置为 0 的数据包。但是,对于第二组片段我不太确定。如果这是第一次对数据包进行分段,则最后一个分段的“更多分段”为 0,但由于这实际上只是原始消息中间某处的分段,我感觉它应该是 1。

我希望有更多经验的人可以为我阐明这一点。重新组装时是否使用了“更多片段”位?如果是这样,我会想象当片段被分段时,我们不会将最后一个片段设置为 0。

所以算法会:

If fragmenting a packet with 'More Fragment' set to 0, 
    then set 'More Fragment' to 1 in all fragmented packets except the last.
Else If fragmenting a packet with 'More Fragment' set to 1, 
    then set 'More Fragment' to 1 in all of the fragmented packets.

我的假设在这里正确吗?

4

1 回答 1

5

你或多或少是对的。除了添加 MF(更多片段)标志外,路由器还进行了更多处理:

为了对一个长的互联网数据包进行分段/分段,路由器(下图中的 R1)创建一个新的 IP 数据包,并将长数据包中的 IP 头字段的内容复制到新的 IP 头中。长包的数据然后在 8 字节(64 位)的边界上分成两部分,使得第一个包小于出接口的 MTU。第一个数据包中的更多片段标志 (MF) 设置为一个(以指示该数据包的更多片段跟随)。如果该数据包已经被另一个系统分段,则可能已经在该数据包中设置了更多标志。转发此数据包。

然后处理第二个创建的新数据包。包头域与原包相同(包括包ID、总长度域、多分片标志(MF)和原包中的分片偏移量域的值相同)。通过添加在第一个片段中发送的有效负载字节数,使用新的偏移字段更新数据包头字段。如果这个新数据包大于允许的链路 MTU,则该数据包再次被分段。

因此,简而言之,对于已经分段的数据包,整个 IP 标头正在被复制到新数据包(更小的片段片段)。这意味着如果 IP 数据包设置了 MF,它也将被复制到最后一个分段数据包。由于更改了偏移量和数据包 ID,主机接收碎片数据包将能够重新组装这些数据包。

于 2012-11-07T13:01:28.893 回答