zoukankan      html  css  js  c++  java
  • CIDR详解和ip最长地址前缀匹配

    1.CIDR是什么

    无类域间路由(CIDR)编址方案

    摒弃传统的基于类的地址分配方式,允许使用任意长度的地址前缀,有效提高地址空间的利用率。
    就是一个ip加一个网络掩码,不过这个掩码不是之前只有3个值(A类:8,B类:16,C类:24),而是0-32随意的一个值。
    例如:
    208.12.128.0/17
     

    2.如何理解CIDR格式

    上图
     
    可以理解为一个从0到(2^32-1)长的线段.
    掩码32表示n个ip的点,数量n是2^32.
    掩码31表示n个小线段1,每个线段1包含2(2^(32-31))个ip点,数量n是2^31.
    掩码30表示n个小线段2,每个线段2包含4(2^(32-30))个ip点,2个小线段1(2^(31-30)),数量n是2^30.
    以此类推,可以形象的理解成"刻度尺".
     

    3.每个CIDR之间的关系

    1.相离
    见上图
    208.12.16/24
    208.12.21/24
     
    2.相近
    见上图
    208.12.16/24
    208.12.17/24
     
    3.包含
    如图
    208.12.21/24
    208.12.16/20
     
    为什么2个CIDR不能相交?
    2个CIDR假设为ip1/mask1,ip2/mask2.
    mask3 = (mask1 > mask2) ? mask2:mask1;
    ip1/(mask3) 和ip2/(mask3)只有相等和不相等2种情况。
    不相等:相离或相近
    相等:包含
    形象的可以想象下“刻度尺”,其中就没有相交的情况。
     

    4.ip最长地址前缀匹配

    1.穷举法
    已知一个ip假设为208.12.16.188
    查找hash表,key为(ip & mask)
    其中mask从32递减到0
    最坏时间复杂度=O(32)*hash查找
     
    2.最长前缀匹配
    ip地址就是一个32bit的数,构建一个bit前缀树进行最长前缀匹配。
    最坏时间复杂度=O(32)
     
    3.线性表的2分查找
    算出每一个CIDR的(ip & mask)值,按此值排序(从小到大)
    当要查询一个ip地址时,假设为ip1,找出>ip1的第一个值,此值的左面的值假设为(ip2 & mask2)
    判断一下 ip1 & mask2 是否=ip2(根据需要要可以判断一下此ip段的超集,构建线性表时,超集关系就可以得出)。
    最坏时间复杂度=O(lg(n)),n为CIDR的数量。
     
     
     
     
     
  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/dodng/p/4415110.html
Copyright © 2011-2022 走看看