假设我有两个主机,主机A和主机B,主机A向B发送一个1500字节的数据包,它们之间有两个路由器,第一个链路的MTU为800字节,MTU为500字节。他们之间的第二个联系。
据我所知,数据包必须两次分段。数据包必须分成3个数据包(2个大小相同的数据包和1个较小的数据包)。
然后,当我们点击第二个路由器时,我们将使前两个分段数据包中的每一个再次分段。前两个原始片段将产生1个较大的片段(接近500个字节)和一个较小的片段。
这是我感到困惑的地方。
我知道所有前3个片段的'More Fragment'位应该设置为1,除了最后一个,表明数据包是片段的一部分,包括下一个包含'More Fragment'的数据包但是,对于第二组片段,我不太确定。如果这是第一次将数据包分段,最后一个片段的“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.
我的假设在这里是否正确?
答案 0 :(得分:5)
你或多或少是对的。除了添加MF(更多片段)标志之外的路由器正在进行更多处理:
对长的互联网数据包进行分段/分段,路由器(图中的R1) 下面)创建一个新的IP数据包并复制IP的内容 从长数据包到新IP头的头字段。的数据 然后将长数据包分成8个字节(64位)的两个部分 边界,使第一个数据包小于MTU 外出的界面。第一个数据包中的片段标志(MF)越多 设置为1(表示此数据包的更多片段如下)。 如果已经存在,则可以在该分组中设置更多标志 被另一个系统支离破碎。转发此数据包。
然后处理第二个创建的新数据包。包头 字段与原始数据包的字段相同(包括相同的字段) 数据包ID的值,总长度字段,更多片段 标志(MF)和原始数据包中的片段偏移字段)。该 通过添加,使用新的偏移字段更新包头字段 第一个片段中发送的有效负载字节数。如果是这个新包 如果大于允许的链路MTU,则数据包将再次分段。
因此简而言之,对于已经分段的数据包,整个IP报头被复制到新的数据包(片段的较小片段)。这意味着如果IP数据包具有MF设置,则它也将被复制到最后的分段数据包。由于更改偏移和数据包ID主机接收碎片数据包将能够重新组装它们。