题目:
若路由器向MTU=800B的链路转发⼀个总⻓度为1580B的IP数据报(⾸部⻓度 为20B)时,进⾏了分⽚,且每个分⽚尽可能⼤,则第2个分⽚的总⻓度字段和MF标志位的值分 别是( )。
A、796,0 B、796,1 C、800,0 D、800,1
自己做一下,给出你的答案
你或许是这么想的。
我们知道最大传输单元是800B,我一个IPv4数据报是1580B,超过了该最大值,所以我要进行分包。
首先,抛去20字节的IP首部,剩余的数据(不难知道是应用层要传的数据比如“hallo”+传输层的协议如TCP的20字节的首部,当然也有其他情况,比如三次握手)为1580-20=1560字节。
其次,我分几个包呢,一个IP首部需要20字节,我每个分包都要有IP首部,不然到了人家的网层层谁知道你是干啥的啊,题目说了尽可能大,所以不难知道一个包为780+20 。
好了,那第一个包就是0~779(剩余的数据) +20
第二个包是780~1560(剩余的数据) +20
哎嘿,这下好了 第一个包长度是800字节,第二个包长度也是800字节。
最后那MF呢,我们知道,mf是more fragment 也就说后面还有没有分片。
首先我们知道肯定是让分片的,DF为0,当然我们只是理解嘛。
好了,我第一个包后面有没有分片呢,肯定有嘛,那就为1
但是我第二个包后面没有分片了,那就为0.
你看看,选C!!!!
正确答案:B!!!!!!!
经典的答案,标准的错误
请问,你是不是忘记了,片偏移。
没错,每一片的长度一定是8的倍数。注意片的长度是不加上IP首部的!
而,上面的780除以8为97.5,不是8的倍数。
哎嘿,776/8=97,是8的倍数
我们这样分
0~775+20 776~1551+20 1552~1560+20
片偏移分别是0 97 194
这样,只要在接受的时候按这个排序就可以啦。
但你知道为什么乘8吗?
我们分包,每个分包直接分就好了吗,你这个片为什么非得是8的倍数呢
你片偏移不就是为了在重组报的时候排正确的序的吗。
的确如此,我们不妨看向IP数据报格式。如下
我们可以看到,片偏移的为31-18=13bit(),2的13次方为8192。
也就是说,我的片偏移最多到8192。
但是,
我的一个数据报最大长度为65535字节,减去20字节的首部,还有65515个字节。
假设你MTU=300,我传的报是9000字节,我的片偏移为几就表示第多少个字节。
标识是001
你不会不认识这个标识吧,最高位也就是最左边的,为0,这是规定。
中间位DF为0,表示允许分片,最低位为1,表示后面还有分片。
假设片现在包分成这样了
8200~8300(当然这是错误的),我的片偏移应该为8200吧,但是我最大为8192.
得,怎么办
乘8,2的13次方*2的3次方=2的16次方=65536。
小写1000字,乐此但不疲。拜拜