由于数据链路层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 {
// 其余分片
}
}
来源:CSDN
作者:protorock
链接:https://blog.csdn.net/rockyzee/article/details/104437781