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的数量。
     
     
     
     
     
  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/dodng/p/4415110.html
Copyright © 2011-2022 走看看