IP分片是IP碎片吗

来源:百度知道 编辑:UC知道 时间:2024/05/24 13:43:06

一 前言 本文对linux的IP组装算法进行了分析,因为IP碎片经常用于DOS等攻击,在文章后面我结合了一些攻击方法进行了更进一步的说明。内核主要参考版本是2.2.16,另外简要的介绍了2.4.0-test3中的一些变化. 二 目录 1- 概述 2- 关键数据结构 3- 重要函数说明 4- 2.4系列的变化 5- 常见碎片攻击 1. 概述 在linux源代码中,ip分片重组的全部程序几乎都在都在\net\ipv4\ip_fragment.c文件中。其对外提供一个函数接口ip_defrag()。其函数原型如下: struct sk_buff *ip_defrag(struct sk_buff *skb) 众所周知,网络数据报在linux的网络堆栈中是以sk_buff的结构传送的,ip_defrag()的功能就是接受分片的数据包(sk_buff),并试图进行组合,当完整的包组合好时,将新的sk_buff返还,否则返回一个空指针。 此函数在其他文件中的调用如下: ip层接收主函数为ip_rcv()(\net\ipv4\ip_input.c),任何IP包都需经过此函数处理。如果此包是发往本机,则调用ip_local_deliver()函数(\net\ipv4\ip_input.c)进行处理,一般的系统碎片只有在到达最终目的的时候才进行重组(尽管在传输过程中可能被进一步分成更小的片)。在ip_local_deliver()中我们可发现如下代码: if (sysctl_ip_always_defrag == 0 && /*编译时未设置提前组装*/ (iph-〉frag_off & htons(IP_MF|IP_OFFSET))) { /*判断是否是分片包*/ skb = ip_defrag(skb); /*条件满足,进行组装*/ if (!skb) /*若组装好则进行下一步处理,出错 return 0; 或仍未组装完返回*/ iph = skb-〉nh.iph; /*重新定位ip头的指针*/ } iph-〉frag_off只有在设置MF(more fragment)或offset!=0才意味着是分片包,因此此处的检验理所当然,但为什么判断sysctl_ip_always_defrag == 0呢?在看