过了好久才解决这个简单的问题,罪过罪过…
答案:如果IP数据报不分片,分片标志DF(Don’t Fragment)会被设置为1。分片标志MF(More Fragment)设置为0。
下面是详细解释:
1:首先来一张IP数据报的报文头部结构。
2:需要注意第二行数据,有这么三个字段
- 序列号:开始发送数据时由
发送方生成
。标识发送方发送的每一个数据报,如果发送的数据报未发生分片,则此值依次加1
,如果发生了分片,分片后的各个数据报使用同一个序列号
。 - 分片标志:三个bit位。第一位保留,未使用。第二位是DF(Don’t Fragment),如果为
1
,表示不允许分片。第三位是MF(More Fragment),如果为1
,表示后面还有分片,并且除了分片出的最后一个报文中此标志为0
,其余报文中此标志均为1
。 - 偏移量:分片相对于原始IP数据报开始处的偏移。
这就基本回答我提出的问题了,下面再扯扯为什么要分片,会有什么影响。
以tcp/ip四层协议为例,应用层->传输层->网络层->数据链路层,我们说的IP分片现象发生在网络层,什么时候会发生呢?当数据包的大小大于MTU(Maximum Transmission Unit)最大传输单元
(MTU也就是在数据链路层“帧”的数据部分
大小。)举个例子如下所示:
1:假设从传输层下来的数据大小为1648个字节(包含tcp数据报报头和数据部分)
2:我们在网络层继续添加20字节的IP数据报(假设IP数据报没有使用扩展选项)
3:目前大小为1648+20=1668 > 1500(以太网协议MTU默认大小为1500),因此会发生IP分片。
4:先不考虑IP数据报的大小,考虑原始数据大小1648字节,应该这样分片 1480 + 168,然后再将IP数据报头分别加上去,数据报变成了这样:1500 和 188
5:这两个数据报中:
第一个大小为1500,序列号:1234(假设值),DF:0,MF:1
第二个大小为188,序列号:1234,DF:0,MF:0
继续向下就到了数据链路层,看看数据链路层的结构。
数据部分就是IP数据报,大小从46~1500,1500现在不难理解,那最小为什么又是46字节呢?
不要乱猜什么TCP数据报头部最少20字节,IP数据报头部最少20字节,那你加到一起也才40字节。真正的原因是因为数据链路层发送出去的包大小最少是64字节!!
64 - 6(目的MAC地址)- 6(源MAC地址)- 2(类型)- 4 (CRC)= 46
那为什么数据链路层发出去的包大小最小要是64字节呢?