• 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的数量。
     
     
     
     
     
  • 相关阅读:
    hihocoder 1038
    hihocoder 1039
    poj 2774
    bzoj 4690&&4602
    poj 2417
    STL
    poj 1026
    poj 1064
    poj 1861(prim)
    poj 1129
  • 原文地址:https://www.cnblogs.com/dodng/p/4415110.html
Copyright © 2020-2023  润新知