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的数量。
     
     
     
     
     
  • 相关阅读:
    echarts如何设置背景图的颜色
    小程序获取的用户头像怎么做成圆形
    小程序源码丢失了怎么在微信平台反编译找回
    微信小程序弹框提示绑定手环实例
    微信小程序仿微信运动步数排行-交互
    微信小程序简单常见首页demo
    微信小程序实现tab页面切换功能
    微信小程序实现一个简单的表格
    2018年各大互联网前端面试题三(阿里)
    java和c/c++
  • 原文地址:https://www.cnblogs.com/dodng/p/4415110.html
Copyright © 2011-2022 走看看