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

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

分片编号IPv4报文字节数分片偏移量(FO)用户数据字节数
01500=20(IPv4 Header)+8(UDP Header)+1472(用户数据)01472
11500=20(IPv4 Header)+1480(用户数据)185=1480/81480
21500=20(IPv4 Header)+1480(用户数据)370=1480*2/81480
31500=20(IPv4 Header)+1480(用户数据)555=1480*3/81480
468=20(IPv4 Header)+48(用户数据)740=1480*4/848
累计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 {
        // 其余分片
    }
}

 

 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值