当IP数据包被多次分段时,"更多片段"位的值

Cor*_*oss 3 ip networking tcp fragmentation

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

据我所知,数据包必须两次都是碎片.数据包必须分成3个数据包(2个大小相等的数据包和1个较小的数据包).

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

这是我感到困惑的地方.

我知道所有前3个片段的'More Fragment'位应该设置为1,除了最后一个,表明数据包是片段的一部分,包括下一个包含'More Fragment'设置为0的数据包. ,对于第二组片段,我不太确定.如果这是第一次将数据包分段,最后一个片段的"More Fragment"为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.
Run Code Online (Sandbox Code Playgroud)

我的假设在这里是否正确?

cod*_*ior 5

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

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

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

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