IPv4报文分片基本概念(The Baisc of IPv4 Datagram Fragmentation )

别说谁变了你拦得住时间么 提交于 2020-02-24 01:58:10

由于数据链路层MTU(最大传输单元)的限制,TCP/IP协议传送字节数比较大的数据时,发生IPv4报文分片现象(Fragmentation)。假设用户数据有5690字节,采用UDP传输,数据链路层MTU=1500字节,IPv4 分片示意图如下

分片编号 IPv4报文字节数 分片偏移量(FO) 用户数据字节数
0 1500=20(IPv4 Header)+8(UDP Header)+1472(用户数据) 0 1472
1 1500=20(IPv4 Header)+1480(用户数据) 185=1480/8 1480
2 1500=20(IPv4 Header)+1480(用户数据) 370=1480*2/8 1480
3 1500=20(IPv4 Header)+1480(用户数据) 555=1480*3/8 1480
4 68=20(IPv4 Header)+48(用户数据) 740=1480*4/8 48
累计 6068字节 / 5690字节

几点注意:

1. 分片现象发生在IP层(网络层)。被分片的数据是来自上层,也就是TCP/UDP层。因此,首个分片带有TCP Header或UDP Header,其余分片不带。

2. 最后一个分片的IPv4报文长度 ≤ MTU字节数;其他分片的IPv4报文长度 == MTU字节数

3. More Fragments(MF)标志。这个标志是IPv4 Header中的一个字段。More Fragments的意思是“更多的分片”。MF=1的确切含义是:本IPv4包是分片IPv4包 AND 后续还有分片;MF=0的确切含义为:本IPv4包不是分片IPv4包 OR 后续不再有分片

4. Fragment Offset (FO)分片偏移量。FO也是IPv4 Header中的一个字段。FO表示特定分片相对于原始未分片IP报文起始位置偏移量(参见图中左侧的红色虚线)。FO的单位是:8字节。例如FO=185,偏移量实际值为185*8=1480字节。

5. 对分片IPv4报文进行缓存或重组(Reassembly)处理时,常用到以下判断条件

// IPv4:捕获到报文

int mf = IPv4 -> Header -> MoreFragments;   // 获取 More Fragments
int fo = IPv4 -> Header -> FragmentOffset;  // 获取 Fragment Offset

if(mf == 0 && fo == 0) {
    // IPv4 没有分片
}
else {
    if(mf == 1 && fo == 0) {
        // 第一个分片
    }
    else if(mf == 0 && fo > 0) {
        // 最后一个分片
    }
    else {
        // 其余分片
    }
}

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!