libnids ip重组

1、 IP分片
 
   任何IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据,并查询该接口的MTU。IP把MTU与数据报的长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发送在中间路由器上。IP数据报分片后,只有到达目的主机后才进行重装。
IP首部与分片有关的字段:
 
(1)对于每份IP数据报来说,都有一个标识字段,该值在分片时被复制到每个片中。
 
(2)标志字段用其中一个bit表示 更多的片 ,除最后一片外,其他每个分片都要设置为1。
 
(3)片偏移字段指的是该片偏移原始数据报开始处的位置。
 
(4)数据报被分片后,每个片的总长度要改为该片的长度值。
 
(5)标志字段中有一个bit表示 不分片 ,如果该位1,IP将不对数据报进行分片。
   IP报即使丢失一片数据报也要重传整个数据报。为什么呢?因为IP层没有超时重传的机制,必须由更高层负责超时重传。
 
 
总结:
三个字段
    标识字段(ip_id):标识特定数据报的分片
    标志字段(ip_off的3个高位比特)
    偏移字段(ip_off的13个低位比特)
 
几个区别
    普通IP包:ip_off、MF 为 0
    最后一个分片包: ip_off > 0、MF 为 0
    其它分片包:ip_off ≥ 0、MF 为 1
 
2、 数据结构设计
 
链表_FRAG
    结点结构ipfrag,保存一个分片
    作用:保存同属于一个IP包的所有分片数据
    链表中各结点按ip_off由小到大排序
 
链表_IPQ
    结点结构ipq,作为_FRAG的头结点,描述属于同一个IP包的所有分片数据的共同特征
    作用:将目的地址相同的分片组织到一起
 
 
链表_HOSTFRAG
    结点结构hostfrags,作为_IPQ的头结点
    作用:将目的地址不同但hash值相同的分片数据组织到地起
 
hash表fragtable
    实现:struct hostfrags **fragtable
    作用: fragtable[index]为_HOSTFRAG的头结点
 
 
hash表及三个链表之间的关系图
 
3、 分片重组流程
 
  
 
4、 代码及相关注释
 
5、 几个细节
 
5.1 Step 14:在_FRAG链表中插入的位置
代码:
if (next->offset >= offset)
      break;
当prev和next结点都存在时满足的条件
offset ( prev->offset next->offset
隐含意思:当前分片与prev之前的结点无重叠,与prev可能有重叠
 
 
 
5.2 step 15:和prev有重叠,调整当前分片
 
调整前图
 
调整后图
step 15:和prev有重叠,调整当前分片后没有判断当前数据的长度,之后会创建一个无用结点!
 
~ [  source navigation  ] ~ [  diff markup  ] ~ [  identifier search  ] ~ [  freetextsearch  ] ~ [  file search  ] ~
Linux Cross Reference
Linux-2.6.17/net/ipv4/ip_fragment.c
Version: ~ [  2.6.16  ] ~ [  2.6.17  ] ~
Architecture: ~ [  ia64  ] ~ [  i386  ] ~ [  arm  ] ~ [  ppc  ] ~ [  sparc64  ] ~
  1 /*
  2  * INET         An implementation of the TCP/IP protocol suite for the LINUX
  3  *              operating system. INET is implemented using the BSD Socket
  4  *              interface as the means of communication with the user level.
  5  *
  6  *              The IP fragmentation functionality.
  7  *             
  8  * Version:     $Id: ip_fragment.c,v 1.59 2002/01/12 07:54:56 davem Exp $
  9  *
  10  * Authors:     Fred N. van Kempen <waltje@uWalt.NL.Mugnet.ORG>
  11  *              Alan Cox <Alan.Cox@linux.org>
  12  *
  13  * Fixes:
  14  *              Alan Cox        :    Split from ip.c , see ip_input.c for history.
  15  *              David S. Miller :       Begin massive cleanup...
  16  *              Andi Kleen      :       Add sysctls.
  17  *              xxxx            :       Overlapfrag bug.
  18  *              Ultima          :       ip_expire() kernel panic.
  19  *              Bill Hawes      :       Frag accounting and evictor fixes.
  20  *              John McDonald   :       0 length frag bug.
 21  *              Alexey Kuznetsov:       SMP races, threading, cleanup.
 22  *              Patrick McHardy :       LRU queue of frag heads for evictor.
 23  */
 24
465
466 /* Add new segment to existing queue. */
467 static void ip_frag_queue (struct ipq * qp , struct sk_buff * skb )
468 {
469         struct sk_buff *prev, * next ;
470         int flags , offset ;
........................
........................
........................
........................
522         /* Find out which fragments are in front and at the back of us
523          * in the chain of fragments so far. We must know where to put
524          * this fragment, right?
525          */
526         prev = NULL ;
527         for( next = qp -> fragments ; next != NULL ; next = next -> next ) {
528                 if ( FRAG_CB ( next )-> offset >= offset )
529                         break; /* bingo! */
530                 prev = next ;
531         }
532
533         /* We found where to put this one. Check for overlap with
534          * preceding fragment, and, if needed, align things so that
535          * any overlaps are eliminated.
536          */
537         if (prev) {
538                 int i = ( FRAG_CB (prev)-> offset + prev-> len ) - offset ;
539
540                 if ( i > 0) {
541                         offset += i ;
542                          if (end <= offset)
543                                 goto err;
544                         if (! pskb_pull ( skb , i ))
545                                 goto err ;
546                         if ( skb ->ip_summed != CHECKSUM_UNNECESSARY )
547                                 skb ->ip_summed = CHECKSUM_NONE ;
548                 }
549         }
550
551         while ( next && FRAG_CB ( next )-> offset < end ) {
552                 int i = end - FRAG_CB ( next )-> offset ; /* overlap is 'i' bytes */
553
554                 if ( i < next -> len ) {
555                         /* Eat head of the next overlapped fragment
556                          * and leave the loop. The next ones cannot overlap.
557                          */
558                         if (! pskb_pull ( next , i ))
559                                 goto err ;
560                         FRAG_CB ( next )-> offset += i ;
561                         qp ->meat -= i ;
........................
........................
........................
........................
 
 
   ~ [  source navigation  ] ~ [  diff markup  ] ~ [  identifier search  ] ~ [  freetext search  ] ~ [  file search  ] ~
 
 
 
This page was automatically generated by the
LXR engine .


Visit the LXR main site for more
information.
 
 
5.3 step 18:
    i = end - next->offset
    tmp->len -= i
    tmp->offset += i
    tmp->ptr += i
    和next有重叠时的两种情况:
      1:
      2:
5.4    ipq结构中的特殊成员timer
    作用:描述已经收到的属于同一IP包的所有分片的存活期限
    创建:step 8
    初始设置:step 10
    expires为当前时间+30秒
    function:失效时的处理函数地址
    data:失效时的处理函数的参数,即timer所在的ipq结点首地址
 
 
5.5    ipq结构中的特殊成员timer
    更新:
        所有ipq结点中的timer成员组成一个双向链表_TIMER,链首:timer_head,链尾:timer_tail
        分片链表超时处理 step 1 : 当一个_IPQ链表在30秒内没有再收到分片数据时,放弃重组
        timer的更新step 13 :当收到一个分片时,重新设置失效时间,并将该分片所属ipq中的timer移到_TIMER的尾部
 
 
5.6    分片数据是否可重组的判断
 
    借助ipq结构中的成员变量len
        初始值:0
        更新:仅当收到最后一个分片时才设置len
    判断:
        当ipq.len为0时直接返回
        当收到最后一个分片后才检查_FRAG链表中的各分片是否相连 (ip_done函数中)判断
    代码:
        参tag: zeq_final_frag
 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DPDK(Data Plane Development Kit)是一款开源的快速数据平面开发工具集,主要用于构建高性能的数据包处理应用程序。它提供了一系列用于处理网络数据包的库和驱动程序,使开发者能够在普通服务器上实现类似网络专用设备的性能。DPDK已经被广泛应用于包括流量分析、虚拟网络功能和网络安全等领域。 而Libnids是一个网络实时入侵检测系统(NIDS)中的一个库。它被设计用于对网络流量进行分析和监控,以便及时检测和阻止入侵行为。Libnids可以从网络中捕获数据包,并解析和处理这些数据包,以进行入侵检测和分析。 DPDK和Libnids之间并没有直接的关联,它们属于不同的领域和用途。然而,由于DPDK提供了高性能的数据包处理能力,可以与Libnids等网络安全工具结合使用,用于实时入侵检测系统的构建。通过将DPDK和Libnids相结合,可以实现更高效的网络流量分析和入侵检测,提升网络的安全性和性能。 总而言之,DPDK是一款用于构建高性能数据包处理应用程序的工具集,而Libnids是一个网络实时入侵检测系统中的库。它们可以相互结合使用,实现更高效的网络流量分析和入侵检测。 ### 回答2: DPDK是数据平面开发工具包(Data Plane Development Kit)的缩写,而libnids是DPDK中的一个库。 DPDK是一个开源的软件库,旨在加速数据包处理的速度。它提供了一组用于开发高性能数据平面应用程序的API和工具。使用DPDK,开发人员可以利用硬件加速技术(如网卡的SR-IOV、GPU等)来提高数据平面应用的性能。DPDK还提供了一套完整的网络协议栈,能够高效地处理各种类型的数据包。 而libnids(Network Intrusion Detection System)是DPDK中的一个库,用于在网络中检测并分析潜在的入侵行为。它能够监视网络流量,并利用规则引擎来检测和报告潜在的攻击和异常行为。libnids可以分析各种类型的网络数据包,包括TCP、UDP、ICMP等。它还提供了一些内置的规则库,用于检测已知的攻击模式,同时也支持用户自定义的规则。 使用DPDK的libnids库,开发人员可以方便地构建高性能的网络入侵检测系统。通过与DPDK的其他功能和API结合使用,libnids可以实现对高速网络流量的实时监测和分析,提供快速准确的入侵检测能力。同时,由于DPDK的性能优势,libnids能够处理大规模高负载的网络环境,将安全性和性能发挥到极致。 总而言之,DPDK的libnids库是一个在高性能数据面开发环境下实现网络入侵检测的强大工具。它通过利用DPDK的加速能力和灵活的规则引擎,帮助开发人员构建高效、快速、可定制的网络安全系统。 ### 回答3: DPDK(Data Plane Development Kit)是一个开源的数据平面开发工具包,用于快速、高效地开发高性能的数据平面应用程序。它提供了一套功能丰富的库和驱动程序,专门用于数据包处理和网络协议栈加速。 其中,libnids是DPDK中的一个重要库,全称为"Libraries for Network Intrusion Detection System"。它是一个专门用于网络入侵检测系统的库,提供了一些功能和接口,可以用于实现高性能、实时的网络入侵检测。 libnids库主要提供了以下几个功能: 1. 网络流量重组libnids能够将经过网络的流量进行重组,将分割的数据包片段重新组合成完整的网络数据包,方便进一步分析和处理。这在网络入侵检测中非常重要,因为入侵行为通常是由多个数据包组成的。 2. 协议解析:libnids支持解析多种网络协议,例如TCP、UDP等。它能够将解析后的协议信息提取出来,为后续的入侵检测算法提供基础数据。 3. 入侵检测模块:libnids提供了一些入侵检测算法,可以通过这些算法来对网络流量进行实时的入侵检测。这些算法基于已知的入侵行为规则或者机器学习等技术,能够高效地检测到潜在的入侵行为。 4. API接口:libnids提供了一套易用的API接口,使得开发者能够方便地在他们自己的应用程序中使用libnids库的功能。这些接口包括初始化、启动、停止等操作,以及一些回调函数,用于处理检测到的入侵行为等。 总的来说,dpdk libnids是DPDK中的一个重要库,主要用于实现高性能的网络入侵检测系统。它提供了网络流量重组、协议解析、入侵检测模块和易用的API接口等功能,可以帮助开发者快速、高效地开发出高性能的网络入侵检测应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值